面向对象的三大特性之一多态
## 什么是多态
-
即 同一方法,可以根据发送对象的不同而采取多种不同的行为方式
-
一个对象的实际类型是确定的,但是可以指向对象的引用类型有很多(父类的引用指向子类)
多态存在的条件
- 有继承关系
- 子类重写父类方法
- 父类引用指向子类对象
/*一个对象的实际类型是确定的
new Student();
new Persion();
*/
//但是对象的引用类型是不确定的:父类的引用指向子类
// Student(子类) 能调用的方法可以是自己的也可以是从父类继承来的方法
Student s1 = new Student();
//Persion(父类) 可以指向子类,但不能调用子类独有的方法
Persion s2 = new Student();
Object s3 = new Student();
//测试1(重写前)
s2.run();
s1.run();
//测试2(重写后)
//s2.run();方法重写后,父类的方法执行的是重写后的子类方法
//s1.run();
//测试3
//对象可以调用哪些方法,主要看对象左边的类型,和右边的关系不大
//s2.eat(); 无法调用eat方法
s1.eat();
注意
多态是方法的多态,属性没有多态性
instanceof
instanceof (用来在运行时判断对象是否是指定类及其父类的一个实例)
/*测试4
System.out.println(x instanceof y)
1.就是看x和y有没有继承关系,没有就直接报错
2.然后看x的实际类型(就是new的类型)是不是y的子类或者y本身,是就true,不是就false
3.如果x的实际类型是y的父类,就false
//Object>Animal>Cat
//Object>Animal>Dog
//Object>String
Object object = new Cat();
System.out.println(object instanceof Object);//true
System.out.println(object instanceof Animal);//true
System.out.println(object instanceof Cat);//true
System.out.println(object instanceof Dog);//false
System.out.println(object instanceof String);//false
System.out.println("===================================");
Animal animal = new Cat();
System.out.println(animal instanceof Object);//true
System.out.println(animal instanceof Animal);//true
System.out.println(animal instanceof Cat);//true
System.out.println(animal instanceof Dog);//false
//System.out.println(animal instanceof String);//编译出错
System.out.println("===================================");
Cat cat = new Cat();
System.out.println(cat instanceof Object);//true
System.out.println(cat instanceof Animal);//true
System.out.println(cat instanceof Cat);//true
//System.out.println(cat instanceof Dog);//编译出错
//System.out.println(cat instanceof String);//编译出错
*/
类型之间的转换
作用:减少重复代码,方便方法的调用
//类型之间的转换
//1.高转低
Animal obj = new Animal();
Cat obj1 = (Cat) obj;//转换类型:父类转子类
obj1.go();//调用子类方法
//或者直接写成 ((Cat)obj).go();
//2.低转高 子类转换成父类可能会丢失自己本来的一些方法
/*Cat cat = new Cat();
Animal animal=cat;
Animal.go();
*/