多态
目录
-
运算符instanceof的用法
-
对象的类型转换
-
多态性
instanceof
- instanceof运算符
判断一个引用类型的变量所引用的对象是否是一个类的实例
- 一般形式
引用变量 instanceof 类
代码如下
public class InstanceOf {
public static void main(String[] args) {
InstanceOf io = new InstanceOf();
Student s = new Student();
//instanceof运算符
//判断一个对象是不是由这个类型或者该类的父类类型创建的对象
// 如果是则为true
System.out.println(io instanceof InstanceOf);
System.out.println(s instanceof InstanceOf);
System.out.println(s instanceof Student);
System.out.println(io instanceof Student);
}
}
class Student extends InstanceOf{}
对象转型
- 引用类型变量的类型转换
子类类型和父类类型之间的转换关系
前提:存在继承关系
-
两种转换方法
-
向上转型
-
子类直接或间接给父类赋值
-
父类类型引用变量指向子类对象
-
自动转换
-
-
向下转型
-
父类直接或间接给子类赋值
-
将父类对象强制转换为子类类型
-
强制类型转换
-
父类对象必须在子类对象中才可以向下转型 否则运行期报错
-
-
-
可以用父类类型引用变量指向子类对象里的父类对象 但是不能用子类类型引用变量直接指向父类对象
代码如下
public class Father {
public static void main(String[] args) {
//对象类型之间也有类型转换 我们称为对象转型
//对象转型分为两种
//一种是向上转型
//一种是向下转型
//向上转型:子类的对象给父类的引用变量赋值 自动转换
//实质:子类对象之中的小的父类对象给父类的引用变量赋值
Father f1 = new Father();
Son s1 = new Son();
f1 = s1;
Father f2 = new Son();
//向下转型:父类的对象给子类的引用变量赋值 强制转换
//向下转型必须保证父类对象在子类对象之中才能向下转型
//要保证父类对象在子类对象之中 只能通过向上转型
//所以要想保证向下转型好用 必须要先经过向上转型
Father f3 = new Son();
Son s3 = new Son();
s3 = (Son)f3;
// Father f3 = new Father();
// Son s3 = new Son();
// s3 = (Son)f3;
// Son s4 = (Son)new Father();
}
}
class Son extends Father{}
多态
-
多态:同样的消息被不同类型的对象接收时导致不同的行为
-
必要条件:有继承 有重写 使用父类引用指向子类对象(向上转型)
代码如下
//多态:同样的消息被不同类型的对象接收产生不同的行为
public class Animal {
public void cry(){
System.out.println("动物的叫声");
}
public static void main(String[] args) {
//多态使用的条件是
//1 要有继承
//2 要有重写
//3 要有向上转型
Animal a1 = new Animal();
Animal a2 = new Cat();
Animal a3 = new Dog();
a1.cry();
a2.cry();
a3.cry();
}
}
class Cat extends Animal{
@Override
public void cry() {
System.out.println("喵喵叫");
}
}
class Dog extends Animal{
@Override
public void cry() {
System.out.println("汪汪叫");
}
}
方法的绑定
-
一个引用类型变量声明为父类类型 引用子类对象 变量不能访问子类中独有的属性和方法
-
方法绑定:建立方法调用和方法体之间的关联
-
静态绑定:编译时编译器就能准确判断应该调用哪个方法
-
动态绑定:编译时检查语法 运行时判断所引用对象的实际类型 根据实际类型调用相应的方法
-