------- android培训、java培训、期待与您交流! ----------
黑马程序员____面向对象(下)
1、接口(interface)
引入:抽象类是从多个类中抽象出来的模板,若要将这种抽象进行得更彻底,就得用到一种特殊的“抽象类”→接口;
例子:
生活中听说过的USB接口其实并不是我们所看到的那些插槽,而是那些插槽所遵循的一种规范;而我们看到的那些插槽是根据USB规范设计出来的实例而已,也就说插槽是USB的实例;
对应不同型号的USB设备而言,他们各自的USB插槽都需要遵循一个规范,遵守这个规范就可以保证插入插槽的设备能与主板正常通信;
对于同一种型号的主板上的多个USB插槽,他们有相同的数据交换方式,相同的实现细节,可认为他们都是同一个类的不同实例
总结:
接口只定义了类应当遵循的规范,却不关心这些类的内部数据和其方法内的实现细节.
接口只规定了这些类里必须提供的方法;从而分离了规范和实现.增强了系统的可拓展性和维护性;
使用接口的好处,拓展性,维护性更好,所以我们在开发中会经常用到接口.(相当于定义了一种标准)
interface定义
接口定义一种规范,规定一个类必须做什么,但它不管如何具体去做;
[修饰符] interface 接口名 extends 父接口1,父接口2....
没有构造方法,不能实例化;
接口只能继承接口,不能继承类
接口里没有普通方法,方法全是抽象的;
接口里的方法默认修饰符是public abstract;
接口里的字段全是全局常量,默认修饰符是public static final;
接口里的成员包括(主要是前两个):
全局常量
公共的抽象方法
内部类(包括内部类,内部接口,内部枚举类);
总结:
接口没有构造方法,不能实例化!
接口里的方法全部是抽象的,没有普通方法,有默认的修饰符 public abstract,必须全部覆写!
格式:public class SubImpl extends Super implements IA,IB
接口可以多继承,但是只能继承接口,不能继承类。
实现接口(支持多实现)
[修饰符] class 类名 implements 接口1,接口2...
接口的实现必须在 extends 之后;
实现接口的方法必须是 public 类型
接口不能创建实例,但是可以声明引用类型的变量。
此时,引用类型的变量必须指向到其实现类对象。
IStudent s = new String();//
IStudent s = new StudentImpl();//
接口与类之间的关系:
实现关系或者说是继承关系.
可以说类实现了接口的方法,也可以说类继承了接口的方法,不同情况下不同的理解!
制定一个标准,让别人去实现或者说满足它!
Eg:
interface USB{//定义USB标准
void useUSB();//USB有使用USB的行为
}
简单工厂模式
构建一个工厂出来,在里面进行生产,用的时候直接拿
我的总结:
好处:屏蔽不同子类实现的差异,提高代码的可拓展性和可维护性;
package reviewDemo;
//简单工厂模式
interface Phone{//制定标准,都要实现send()方法
publicvoid send();
}
class Iphone implements Phone{
@Override
publicvoid send() {
System.out.println("Iphone手机在发短信");
}
}
class AndroidPhone implements Phone{
@Override
publicvoid send() {
System.out.println("AndroidPhone手机在发短信");
}
}
class MyPhone implements Phone{
@Override
publicvoid send() {
System.out.println("MyPhone手机在发短信");
}
}
class Factory{
publicstaticvoid show(String type){//传入参数,根据不同的类型个性化定制
if(type.equals("")){//为空的情况,不用往下执行
System.out.println("对不起,类型为空!,请重新输入!");
return;
}
Phone p = null;
if("Iphone".equals(type)){//判断类型
p = new Iphone();
}elseif("AndroidPhone".equals(type)){
p = new AndroidPhone();
}else{
p = new MyPhone();
}
p.send();
}
}
publicclass FactoryDemo17 {
publicstaticvoid main(String[] args) {
new Factory().show("Iphone");//调用方法
new Factory().show("AndroidPhone");
new Factory().show("MyPhone");
new Factory().show("YourPhone");
new Factory().show("");
}
}
输出:
Iphone手机在发短信
AndroidPhone手机在发短信
MyPhone手机在发短信
MyPhone手机在发短信
对不起,类型为空!
使用一个现成的类,但是它的接口不完全符合你的需求,我只想要它其中的一个方法,不想覆写其他的方法。
比如,窗体有变大,变小,关闭的行为,但是我现在只需要关闭行为;
package reviewDemo;
//适配器模式:只想用其中的某一个方法,用适配器作为中间的过渡
interface Windows{
void max();
void min();
void close();
}
//适配器模式,实现接口所有的方法,但是不写方法体!
class AdapterWindows implements Windows{
@Override
publicvoid max() {
}
@Override
publicvoid min() {
}
@Override
publicvoid close() {
}
}
class MyWindows extends AdapterWindows{
//覆写父类的方法
publicvoid close(){
System.out.println("这个实现的是关闭功能!");
}
}
publicclass Demo17 {
publicstaticvoid main(String[] args) {
new MyWindows().close();
}
}
相同点:
都位于继承的顶端,用于被其他实现或继承;
都不能实例化;
都包含抽象方法,其子类都必须覆写这些抽象方法;
区别:
抽象类为部分方法提供实现,避免子类重复实现这些方法,提供代码重用性;接口只能包含抽象方法;
一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口;(接口弥补了Java的单继承)
二者的选用:
优先选用接口,尽量少用抽象类;
需要定义子类的行为,又要为子类提供共性功能时才选用抽象类;
总结:
接口不能有构造函数,抽象类是可以有构造函数的,
abstract可以定义构造函数(包括带函数的构造函数),因为要保证其子类在创建的时候能够进行正确的初始化,但是Abstract类不能被实例化。
知识点:如果不可以或者没有创建对象,那么我们必须加上static修饰,不能用对象调用,就只好用类去调用。
适合只使用一次的类
不能是抽象类,因为系统在创建匿名内部类的时候,会立即创建匿名内部类的对象。
匿名内部类不能定义构造器,因为匿名内部类没有类名。
格式:
new 父类构造器([实参列表]) 或接口()
{
//匿名内部类的类体部分
}
使用enum声明,默认直接继承了java.lang.Enum类,而不是Object类;
枚举类的对象是固定的,实例个数有限,不可以再new( ),枚举对象后可以跟()。
枚举元素必须位于枚举类体中的最开始部分,枚举元素后要有分号与其他成员分隔。
枚举类的构造方法的权限修饰符默认是private;
一旦枚举对象后面加上{},那么该对象实际是枚举匿名内部类对象;
所有枚举类都提供一个静态的values()方法(返回该枚举类所有对象组成的数组),便于遍历所有枚举对象;
所有枚举类都提供一个静态的valueOf(String name)方法, 返回枚举类中对象名等于 name的对象。
Eg:public enum Color{
RED(), GREEN(){}, BLUE{};
}
package reviewDemo;
//枚举
enum Color{
Green,Blue,Yellow;
@Override
public String toString() {
String ret = super.toString();
switch (this) {
caseGreen:
ret = "绿色";
break;
caseBlue:
ret = "蓝色";
break;
caseYellow:
ret = "黄色";
break;
default:
break;
}
return ret;
}
}
class Personp{
Color c = Color.Blue;
void show(){
System.out.println(c);
}
}
publicclass Demo18 {
publicstaticvoid main(String[] args) {
Color []color = Color.values();
for (Color c : color) {
System.out.println(c);
}
new Personp().show();
}
}
输出:
绿色
蓝色
黄色
蓝色
枚举类覆写接口抽象方法的两种方式:
在枚举类中实现接口的抽象方法;
在枚举匿名内部类中实现接口的抽象方法;
interface I{
void show();
}
enum Color implements I{
RED(){
public void show(){
}
}, GREEN{
public void show(){
}
}, BLUE{
public void show(){
}
};
}
enum Color implements I{
RED(), GREEN, BLUE;
public void show() {
}
}
总结:
枚举不可以new();即便是反射也不可以!
备注:一个类如果没有构造方法,那么一定有相对应的某个方法可以获取对象!
相关推荐
黑马程序员_毕向东_Java基础视频教程第05天-01-面向对象(概述).avi
黑马程序员 - Java基础教学 - 05 - 面向对象(1).doc
1、 面向对象、跨平台性、健壮性、安全性、可移植性、多线程性、动态性等。 2、 JRE(Java Runtime Environment,Java 运行时环境),它相当于操作系统部分,提供了 Java 程序运 行时所需要的基本条件和许多 Java ...
传智播客_Java培训_毕向东_Java基础[03-面向对象]系黑马程序员_毕向东_Java基础视频教程
C++机房预约系统:面向对象,文件操作,黑马程序员,部分优化,模板
含面向对象,异常处理和常用类,线程技术,集合框架,IO操作,网络编程,文件操作,反射机制,
黑马程序员 - Java基础教学 - 06 - 面向对象(2) - 关于静态static的那些事.doc
1、面向对象都有哪些特性以及你对这些特性的理解12 1、 Java 中实现多态的机制是什么 1、 Java 中异常分为哪些种类13 2、 调用下面的方法,得到的
面向对象编程是一种编程范式,它基于对象和类的概念,强调模块化、抽象、继承和多态等特点。今天,我们将学习Java基础视频辅导班课堂笔记总结Day08中的面向对象编程相关知识点。 继承是面向对象编程的重要概念,它...
编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程。 Java是SUN(Stanford University Network,斯坦福大学网络...是简单易学,完全面向对象,安全可靠,与平台无关的编程语言
Java基础教学 - 面向对象(4)- 多态 在本文中,我们将讨论Java语言中的一种重要概念 —— 多态(Polymorphism)。多态是面向对象编程(OOP)中的一个核心概念,它允许我们编写更加灵活和可扩展的代码。 一、多态...
在下载和比较了大量同类书籍后不得不承认孙卫琴老师的这本书循序渐进由浅入深是最好的Java入门教程,同时它的...本资源包含《Java面向对象编程》的电子书,实例源代码,课后题答案等可以说是当前该书最全的资源了。。。
(1)aop:面向切面编程,扩展功能不是修改源代码实现 (2)ioc:控制反转, - 比如有一个类,在类里面有方法(不是静态的方法),调用类里面的方法,创建类的对象,使用对象调用方法,创建类对象的过程,需要new...
C++面向对象——B站黑马程序员视频学习笔记。
linux编程,ppt文档,gdb,makefile,linux编程概述
第1章 Java开发入门一.填空题1. 面向对象,SUN 2. JavaSE,JavaEE,JavaME3.面向对象、跨平台性、支持多线程4. JDK5.bin
《JavaScript前端开发案例教程》是面向计算机相关专业的一门Web前端基础课程,涉及JavaScript语言基础、数组、函数、对象、BOM、DOM、事件、正则表达式、Ajax、jQuery等内容。
精选12种与多线程和并发处理相关的设计模式 264张图表 + 300段Java示例程序 = 轻松学习多线程编程 日本经典多线程入门书,原版长销11年! 本书适合以下读者阅读 a....b....c....对面向对象开发感兴趣的人
观看黑马程序员Java零基础视频教学,从60P方法开始总结的知识集合,请使用Xmind打开,如果需要学习请配合视频打开:https://www.bilibili.com/video/BV17F411T7Ao
Qt是一个跨平台的C++图形用户界面应用程序框架。它为应用程序开发者提供建立艺术级图形界面所需的所有功能。它是完全面向对象的,很容易扩展,并且允许真正的组件编程。