继承
super关键字
// super代表子类从父类继承过来的空间的地址
当父类和子类的成员名相同时 用super.关键字可以使用父类的成员
同名时候使用this,调用的是子类的成员(和内外部类相同有自己优先的原则)
不能在静态的方法中使用super,因为super和this一样,是依赖对象的
super.data
super.func
super(); //访问父类的构造方法
特别的,对protected访问权限,不同包的子类进行成员访问时,也是通过super.,因为本质上也是访问父类
子类对象的初始化
写子类的构造方法时 一点要先用super()调用父类的构造方法(写在第一行) 再进行子类构造方法的编写
如
public Cat (String name, int age, String hair) {
super(name,age);
this.hair = hair;
}
super调用构造方法和this调用构造方法都是需要放在第一行,所以两者必然冲突不能共存。
在一个类中 对于执行顺序 有:
静态代码块 > 实例代码块 > 构造方法
若有类的继承 子类父类都有静态/实例代码块即构造方法 有:
父静态代码块 > 子静态代码块 > 父实例代码块 > 父构造方法 > 子实例代码块 > 子构造方法
不想让一个类被继承就加上final关键字 使之成为密封类
一个类可以成为另一个类的成员(所以也可以成为参数)
class Student {}
class Teacher {}
class money {}
class School {
private Student[] students;
private Teacher[] teachers;
private Money money;
}
// 能用类作数组 也能作变量?
Overload重载
一个类的两个方法,有相同的名称,不相同的方法签名,则称为重载。这个一个类,包含了类的继承,如:
class A {
public void re(){
}
}
class B extends A {
public int re(int n){
}
}
re方法构成重载。
final关键字
常量、密封类、密封方法
多态
子承父类,然后子类中对父类方法重写,在另一个类的主函数中调用该方法展现的不同子类中重写的内容,就是多态。(通常需要这个方法的参数类型是父类的对象)如:
多态的存在的必要条件!!!!!
继承 / 重写 / 父类引用子类对象
Father father = new Son():
father.fun();调用的是Son重写的fun方法
向上转型
动态绑定
将实例化的子类对象赋值给父类的引用后,引用子类重写的方法,就会形成动态绑定。如:
class Dad {
public void sayHi () {
System.out.println("Hi");
}
}
class Son extends Dad {
@Override
public void sayHi () {
System.out.println("Hello");
}
}
class Test {
public static void test (Dad dad) {
dad.sayHi();
}
public static void main () {
test(new Son());
//输出 Hello
}
}
动态绑定的含义是,在编译的时候显示调用的是父类的sayHi,但实际上还有一步转到了子类的sayHi上去。
动态绑定是多态实现的基础,可以使得同一个方法表现不同状态。