一、instanceof
instanceof运算符:判断一个引用类型的变量所引用的对象是否是一个类的实例
一般形式:
引用变量 instanceof 类
例如:myObject instanceof Object
public static void main(String[] args) {
Person p = new Person();
Student s = new Student();
//instanceof判断一个对象是否由该类创建的
System.out.println(p instanceof Person);
System.out.println(p instanceof Student);
System.out.println(s instanceof Person);
System.out.println(s instanceof Student);
}
二、对象的类型转换
1.引用类型变量的类型转换(对象转型)
子类类型和父类类型之间的转换关系
前提:存在继承关系(无继承关系的引用类型不能转换)
2.两种转换方式
向上转型:
(1)子类给(直接或间接)父类赋值
(2)父类类型引用变量指向子类对象
(3)自动转换
向下转型:
(1)父类给(直接或间接)子类赋值
(2)将父类对象强制转换为子类类型,强制类型转换(显式类型转换)
(3)父类对象必须在子类对象之中才能向下转型,否则运行期报错
3.可以用父类类型引用变量指向子类对象(里的父类对象),但是不能用子类类型引用变量直接指向父类对象
public class Demo {
//引用类型之间也存在类型转换,称之为对象转型
//对象转型分为向上转型,向下转型
public static void main(String[] args) {
//向上转型是父类的引用变量指向子对象(自动转换)
//实质就是子类中小的父类对象给父类的引用变量赋值
//第一种写法
Student s1 = new Student();
Person p1 = new Person();
p1 = s1;
//第二种写法
Person p2 = new Student();
//向下转型是子类的引用变量指向父类对象(强制转换)
//要想向下转型,必须要保证父类对象在子类对象之中,而唯一能保证的就是向上转型
Student s3 = new Student();
Person p3 = new Student();
s3 = (Student) p3;
}
}
三、多态性
多态:同样的消息被不同类型的对象接收时产生不同的行为
多态的条件:
1.要有继承(实现)
2.要有重写
3.要有向上转型(接口类型引用变量指向实现类对象)/(使用父类引用指向子类对象)
四、方法的绑定
1.一个引用类型变量声明为父类类型,引用子类对象,变量不能访问子类中独有的属性和方法
2.方法绑定(Binding):建立方法调用(Method Call)和方法体(Method Body)之间的关联
(1)静态绑定方法:编译时编译器就能准确地判断应该调用的哪个方法(早绑定、先期绑定)
(2)动态绑定方法:编译时检查语法,运行时判断所引用对象的实际类型,根据实际类型调用相应的方法(晚绑定、后期绑定)
例:Animal myCat=new Cat();
myCat.cry();
编译时:根据引用变量类型,判断此类是否有此方法
判断Animal类中有cry()方法
运行时:判定引用变量指向的对象的类型,根据此对象类型调用方法根据myCat变量指向的Cat对象调用Cat类的cry()方法