JavaNote5
1.接口
1.1 接口的定义和使用
- 是用关键字 interface 定义的。
- 接口存在的成员:
- 1):接口中没有构造器,推论:接口不能创建对象(不能 new ),接口中不能定义普通方法.
- 2):接口中定义的成员变量,实质是全局静态常量,默认使用public static final来修饰.
- 3):接口中定义的方法都是公共的抽象方法,,默认的使用public abstract来修饰方法.一般的,我们在接口中定义方法,不喜欢使用修饰符.
- 4):接口中定义的内部类都是公共的静态内部类,默认使用public static来修饰内部类.
1.2 接口的特点和接口的继承
- 接口的特点:
- ①没有构造方法,也不能显示定义构造器,不能实例化。
- ②接口只能继承接口,不能继承类,且接口支持多继承(类是单继承关系)。
[修饰符]interface 接口名 extends接口1,接口2 - ③接口里的方法全是抽象的,默认修饰符是public abstract。
- ④接口里的字段全是全局静态常量,默认修饰符是public static final。
- ⑤接口里的内部类全是公共静态的,默认修饰符是public static。
- 接口的继承
- 类和类之间存在继承关系:使用extends来表示.
- 接口和接口之间只能是继承关系:使用extends来表示.
- 接口和实现类之间只能是实现关系(继承关系),使用implements来表示.
接口都用于设计上,设计上的特点:(可以理解主板上提供的接口)
1:接口是对外提供的规则。
2:接口是功能的扩展。
3:接口的出现降低了耦合性
1.3 接口和抽象类的区别
相同点:
- 都位于继承的顶端,用于被其他实现或继承。
- 都不能实例化。
- 都可以定义抽象方法,其子类/实现类都必须覆写这些抽象方法。
不同点:
- 接口没有构造方法,抽象类有构造方法。
- 抽象类可包含普通方法和抽象方法,接口只能包含抽象方法(Java8前);
- 一个类只能继承一个直接父类(可能是抽象类),接口是多继承的并且支持一个类实现多个接口(接口弥补了Java的单继承)。
- 成员变量:接口里默认是public static final,抽象类是默认包权限。
- 方法:接口里默认是public abstract,抽象类默认是默认包访问权限。
- 内部类:接口里默认是public static,抽象类默认是默认包访问权限。
2.面向对象–多态
2.1 多态
- 多态:函数本身就具备多态性,某一种事物有不同的具体的体现。
- 多态的体现:父类引用或者接口的引用指向了自己的子类对象。父类可以调用子类中覆写过的(父类中有的方法)
- 多态的好处:提高了程序的扩展性。继承的父类或接口一般是类库中的东西,(如果要修改某个方法的具体实现方式)只有通过子类去覆写要改变的某一个方法,这样在通过将父类的应用指向子类的实例去调用覆写过的方法就行了!
- 多态的弊端:当父类引用指向子类对象时,虽然提高了扩展性,但是只能访问父类中具备的方法,不可以访问子类中特有的方法。(前期不能使用后期产生的功能,即访问的局限性)
- 多态的特点:
把子类对象赋给父类变量,在运行时期会表现出具体的子类特征(调用子类的方法). - 多态的前提:
- 1:必须要有关系,比如继承、或者实现。
- 2:通常会有覆盖操作。
2.2 多态在子父类中的成员上的体现的特点
- 成员变量:在多态中,子父类成员变量同名。
- 编译时期:参考的是引用型变量所属的类中是否有调用的成员。(编译时不产生对象,只检查语法错误)
- 运行时期:也是参考引用型变量所属的类中是否有调用的成员。
简单一句话:无论编译和运行,成员变量参考的都是引用变量所属的类中的成员变量。再说的更容易记忆一些:成员变量 — 编译运行都看 = 左边。
- 成员函数。
- 编译时期:参考引用型变量所属的类中是否有调用的方法。
- 运行时期:参考的是对象所属的类中是否有调用的方法。
为什么是这样的呢?因为在子父类中,对于一模一样的成员函数,有一个特性:覆盖
简单一句:成员函数,编译看引用型变量所属的类,运行看对象所属的类。更简单:成员函数 — 编译看 = 左边,运行看 = 右边。
- 静态函数。
- 编译时期:参考的是引用型变量所属的类中是否有调用的成员。
- 运行时期:也是参考引用型变量所属的类中是否有调用的成员。
为什么是这样的呢?因为静态方法,其实不所属于对象,而是所属于该方法所在的类。
调用静态的方法引用是哪个类的引用调用的就是哪个类中的静态方法。
简单说:静态函数 — 编译运行都看 = 左边。
2.3 其他
- 引用类型的转换:引用类型的大和小,指的是 父类 和子类的关系.
- 自动类型转换: 把子类对象赋给父类变量(多态).
- 强制类型转换: 把父类类型对象赋给子类类型变量(当时该父类类型变量的真实类型应该是子类类型).
- instanceof 运算符: 判断该对象是否是某一个类的实例.
语法格式:boolean b = 对象A instanceof 类B; // 判断 A对象是否是 B类的实例,如果是,返回true.
最后附上Java学习网址