1.this两个用途:一是引用隐式参数,二是调用该类的其他构造器
super两个用途:一是调用超类的方法,二是调用超类的构造器
△super不是表示一个对象的引用,不能将super赋给另一个对象变量,它只是一个指示编译器调用超类方法的特有关键字。
2.基类的构造器总是会被调用,而且在子类构造器之前被调用。
package tes;
//基类的构造器总是会被调用,而且在子类构造器之前被调用。
public class class_extends_test extends b{
public class_extends_test(){
System.out.println("c的构造器");
}
public static void main(String[] args) {
new class_extends_test();
}
}
class a{
public a(){
System.out.println("a的构造器");
}
}
class b extends a{
public b(){
System.out.println("b的构造器");
}
}
控制台输出:
a的构造器
b的构造器
c的构造器
3.如果没有默认的基类构造器,或者想用一个带参数的基类构造器,就必须用关键字super显示地调用基类的构造器。因为子类的构造器被调用之前,基类的构造器会被调用,如果无法符合基类的构造器的参数,就会出错,所以必须显式地调用基类的构造器并配以适当的参数列表。
4.在基类中如果有某个方法已经实现重载,在子类中依然可以继续重载。如果想重写基类的某个方法而不是重载,可以在方法前加上@Override注解,防止在不想重载的时候进行重载。
5.复用代码有两种方式:组合,继承。
①组合:在新的类中加入现有类的对象
package com.reuse;
public class has_a_test {
a at=new a();
b bt=new b();
public static void main(String[] args) {
has_a_test hat=new has_a_test();
hat.at.print();
hat.bt.print();
}
}
class a{
public void print(){
System.out.println("这是a的方法!");
}
}
class b{
public void print(){
System.out.println("这是b的方法!");
}
}
②继承:通过extends扩展父类。
package com.reuse;
public class is_a_test extends base{
public void isaprint(){
System.out.println("这是继承a的子类的方法!");
}
public static void main(String[] args) {
is_a_test iat=new is_a_test();
iat.aprint();
iat.isaprint();
}
}
class base{
public void aprint(){
System.out.println("这是父类的方法!");
}
}
控制台输出:
这是父类的方法!
这是继承a的子类的方法!
6.一个对象变量可以引用多种实际类型的现象成为多态。
方法的重写,重载与动态连接(动态绑定)构成多态。
在运行时能够自动地选择调用哪个方法的现象称为动态绑定。
7.多态的经典实现就是父类引用指向子类对象:(Animal a=new dog();)
一个父类引用指向一个子类对象就是向上转型。意义是:因为子类是对父类的改进和扩充,所以子类一般在功能上比父类更加强大。定义一个父类引用指向一个子类对象既可以使用子类强大的功能,又可以抽取父类的共性。父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义但父类中没有的方法,父类引用无法使用。
动态连接:当父类中的一个方法只有在父类中定义而在子类中没有被重写的情况下,才可以被父类引用所调用。对于父类中的方法,如果子类对其进行了重写,那么父类类型的引用将会调用该重写后的方法,这就是动态连接。
package com.reuse;
public class Animal {
void sound(){
System.out.println("unknown");
}
public static void main(String[] args) {
Animal a=new Dog();
a.sound();
a=new Cat();
a.sound();
}
}
class Dog extends Animal{
@Override
void sound(){
System.out.println("汪汪汪");
}
}
class Cat extends Animal{
@Override
void sound(){
System.out.println("喵喵喵");
}
}
控制台输出:
汪汪汪
喵喵喵