多态
同一个对象 体现出来的多种不同形态(身份) 将一种行为表现出不同的效果
体现:
1)父类类型的引用 指向 子类的对象
Person p = new Teacher();
2)该引用只能调用父类定义的属性或方法
对于属性而言
没有重写一说 所以多态调用的就是父类的属性
对于方法而言
如果某一子类将父类的方法重写了 则从new对应的子类依次往上找
直到找到重写的方法 然后执行
4)若想调用子类中独有的成员
(强制类型转换) 造型 铸型 (向上/向下转型)
5)强制向下转型时 可能会出现一个运行时异常
ClassCastException 类型强制转换异常
如果想避免造型时异常 可以用instanceof关键字来进行判断
对象 instanceof 类
public class Animal {
String name = "Animal的name属性";
public void eat(){
System.out.println("动物的吃饭方法");
}
public void sleep(){
System.out.println("动物的睡觉方法");
}
}
public class Person extends Animal{
String name = "Person的name属性";
public void eat(){
System.out.println("人类吃饭方法");
}
public void sleep(){
System.out.println("人类睡觉方法");
}
public void talk(){
System.out.println("人类说话方法");
}
}
public class Teacher extends Person{
String name = "老师的name属性";
public void eat(){
System.out.println("老师的吃饭方法");
}
public void teach(){
System.out.println("老师能上课");
}
}
public class Student extends Person{
String name = "Student的name属性";
public void talk(){
System.out.println("学生说话方法");
}
public void study(){
System.out.println("好好学习 天天向上");
}
}
public class RunMain {
public static void main(String[] args){
Object o = new Teacher();//先看定义的是什么类型 就从什么类型开始找有没有方法重写
o.hashCode();
o.toString();
Animal a = (Animal) o;//向下转型
a.hashCode();
a.toString();
System.out.println(a.name);//输出Animal的name属性
//先看Teacher有没有重写 再看Person有没有重写 最后看Animal
a.eat();//因为Teacher重写了 所以输出老师的吃饭方法
a.sleep();//因为Teacher没有重写 Person重写了 所以输出人类睡觉方法
Person p = (Person) o;
p.hashCode();
System.out.println(p.name);//输出Person的name属性
//先看Teacher有没有重写 再看Person有没有重写 最后看Animal
p.sleep();//因为Teacher没有重写 Person重写了 所以输出人类睡觉方法
p.eat();//因为Teacher重写了 所以输出老师的吃饭方法
p.talk();//因为Teacher没有重写 Person重写了 所以输出人类说话方法
Student s = (Student) o;//代码写的时候没有异常 但是运行时会出现异常
//ClassCastException 类型强制转换异常
s.study();//因为Teacher和Student是同一等级的
//转型可以上下转 同级不能转
if(o instanceof Student){//通过instanceof来判断是否可以进行类型转换
}
}
}