一、子类引用指向自身的对象
1.调用父类的方法时,父类方法中使用的this.属性调用的是父类的属性,而不是子类自身的属性
示例1:
public class TestWork1 {
public static void main(String[] args) {
Dog dog = new Dog();
dog.introduce();
}
}
public class Pet {
private String name;
public void introduce() {
System.out.println("我是一个" + this.name);
}
}
public class Dog extends Pet {
private String name = "这是子类的狗";
@Override
public String getName() {
return name;
}
}
结果:我是一个null
在创建Dog类对象的时候,先初始化父类,而父类的name属性并没有赋值,因此默认为null,然后初始化子类。在调用dog的introduce方法时,由于Dog类没有重写introduce方法,因此调用父类的该方法,而父类的introduce方法中使用的this.name则是父类本身的name属性,因此为null
2.若子类重写了父类的方法,则父类方法中的this.方法调用的是子类的方法(动态连接、动态调用) ,若子类没有重写父类的方法,则使用的是父类本身的方法
示例2:
将上例中的Pet类的introduce方法修改如下
public class Pet {
private String name;
public void introduce() {
System.out.println("我是一个" + this.getName());
}
}
结果:我是一个这是子类的狗
此时调用dog对象的introduce方法,由于Dog类没有重写该方法,所以依然使用父类的该方法,此时父类的该方法中使用的是this.getName方法,而子类重写了该方法,因此在该方法中使用的是子类的该方法,即获取到的是子类的name属性值。
3.变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错
二、父类引用指向子类对象
1.父类类型的引用可以调用父类中定义的所有属性和方法
2.对于子类中定义而父类中没有的属性或方法,父类引用无法调用
3.子类重定义父类已有的方法时,父类引用调用的是子类重写过的方法
4.子类重定义父类已有的属性,父类引用调用的还是本类的属性值
多态性:发送消息给某个对象,让该对象自行决定响应何种行为。 通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。