目录
一、属性没有重写
属性的输出只看编译类型,不看运行类型
例子
package com.hspedu.poly_.detail_;
public class PolyDetail02 {
public static void main(String[] args) {
//向上转型,父类的对象引用指向子类对象
Base01 base01 = new Sub();
System.out.println(base01.count);
}
}
class Base01 {
int count = 10;
}
class Sub extends Base01 {
int count = 20;
}
分析:虽然向上转型之后,父类的对象引用指向了子类对象,但是由于属性没有重写这个功能,所以属性的值只看编译类型(与方法不同),输出10
package com.hspedu.poly_.detail_;
public class PolyDetail02 {
public static void main(String[] args) {
//向上转型,父类的对象引用指向子类对象
Base01 base01 = new Sub();
System.out.println(base01.count);
Sub sub = new Sub();
System.out.println(sub.count);
}
}
class Base01 {
int count = 10;
}
class Sub extends Base01 {
int count = 20;
}
分析: 编译类型是Sub,输出20
运行结果
二、instanceof(比较操作符)
用于判断对象的运行类型是否为 XX 类型或 XX 类型的子类型,返回 boolean 的数据类型
举例说明
package com.hspedu.poly_.detail_;
public class PolyDetail03 {
public static void main(String[] args) {
//判断对象的运行类型是否为 XX 类型或 XX 类型的子类型
BB bb = new BB();
//bb的运行类型是BB,BB是BB类型
System.out.println(bb instanceof BB);//true
//BB是AA的子类,所以输出true
System.out.println(bb instanceof AA);//true
AA aa = new BB();
//向上转型,aa的运行类型是BB,是AA的子类
System.out.println(aa instanceof AA);//true
System.out.println(aa instanceof BB);//true
Object obj = new Object();
//运行类型是Object,Object并不是AA的子类
System.out.println(obj instanceof AA);//false
String str = "hello";
//str的运行类型是String,是Object的子类,true
System.out.println(str instanceof Object);//true
//String和AA没有任何关系,所以编译时就会报错
//System.out.println(str instanceof AA);
}
}
class AA {}
class BB extends AA{}
知识点
String是Object的子类
三、总结
只有在调用属性时是看编译类型,其余情况都是看运行类型