封装
-
继承
继承的关键字
extends
- 子类 也叫派生类
- 父类 也叫 基类,超类
- 继承描述的是类和类之间的关系
- 继承使子类复用父类的方法和属性,但是会带来高耦合(子类不想要继承的也要继承)
- Java class 只支持单继承
- 一个接口可以继承多个接口
- 子类不能继承的
- private 修饰的成员变量和方法不能被继承
- 父类和子类不在同一个包,父类中使用默认访问权限的成员不能被继承。
- 构造方法不能被继承
- 继承具有传递性
- 子类可以继承父类的父类
子类一定要调用父类的构造器,因为编译器提供了默认构造器,并默认执行了super(),但是当父类没有提供无参构造的话,子类就要显式的调用父类的有参构造器了。
多态
多态:同一个引用类型,使用不同的实例而执行不同的操作。
- 多态的语法特征:
- 父类引用指向子类对象 或者 接口引用指向 实现类对象
- 方法重写
- 多态的应用
- 类多态
- 接口多态
- 参数多态
- 多态的好处
- 屏蔽了子类的差异,容易替换实现类。
- 一个父类类型,可以接受所有该子类的对象。
instanceof关键字
方法名相同,参数列表不同
- 参数列表不同,参数类型和数量不同
- 和返回没有关系
从父类继承下来的方法,和子类的方法可以形成方法重载 ```java public class P {
public void test(int a){
System.out.println("int:" + a);
}
}
public class S extends P {
public long test(long l){
System.out.println("long:" + l);
return l;
}
public static void main(String[] args) {
S s = new S();
s.test(1);
s.test(1L);
}
} ```
int:1 long:1
方法重写
前提:子类继承父类
- 只有实例成员方法才能被重写
- 方法名要相同
- 参数列表相同
- 参数带有泛型,泛型会被擦除,不影响重写
- 参数顺序,类型,数量都要相同
- 返回值类型相同
- 基本数据类型 要完全相同
- 引用数据类型 子类返回值类型是父类返回值类型的子类型也可以
- 访问修饰符不能比父类更严格
- 比如父类是public,那子类只能是public
- 异常种类不能父类更大
- @Override 告诉编译器,这个方法是重写的方法
- 重写的作用
- 子类修改父类的功能
- 子类增强父类的方法
- final修饰的方法不能被重写
- 重写在方法运行时,通过调用者的实际类型来确定调用的方法版本。(具体细说,就是子父类中的重写方法在对应的class文件常量池的位置相同,一旦子类没有重写,那么子类的实例就会沿着这个位置往上找,直到找到父类的同名方法)
- 重写只发生在可见的实例方法中:
- 静态方法不存在重写,形式上的重写只能说是隐藏。
- 私有方法也不存在重写,父类中private的方法,子类中就算定义了,就是相当于一个新的方法。
- 静态方法和实例方法不存在相互重写。
- 重写满足一个规则:两同两小一大
- 两同:方法名和形参列表一致
- 两小:重写方法的返回值(引用类型)和抛出异常,要和被重写方法的返回值(引用类型)和抛出异常相同或者是其子类。注意,一旦返回值是基本数据类型,那么重写方法和被重写方法必须相同,且不存在自动拆装箱的问题。
- 一大:重写方法的访问修饰符大于等于被重写方法的访问修饰符。