多态
我们新建三个类 Application Person Student
Student 继承 Person
我们new Person 他就是Person new Student 他就是Student
一个对象的实际类型是确定的
但是他可以指向的引用类型就不确定了
Student s1 = new Student();
Person s2 = new Student(); //父类的引用指向子类的类型
Object s3 = new Student(); //父类的引用指向子类的类型 Object是所有类的祖类
一个类型的实际对象是确定的,但是可以指向对象的这个引用类型却是可以是任意的
我们在Person类中写有一个方法
public void run(){
System.out.println("run")
}
我们输出一下
就会发现成功运行
我们虽然Person s2 = new Student(); new的是Student 但是他依旧走了父类的方法
因为子类继承父类的全部方法
这时候我们在子类里面重写一下父类的方法
运行一下
就会发现2个都走了son
是因为子类重写了父类的方法,执行子类的方法
我们在子类里面输入一个eat方法
public void eat(){
System.out.println("eat");
}
那么在Application类里面
s1.eat();
可以调用eat方法
那么s2可以吗?
我们输入s2.eat
发现
IDEA软件自动跟我们生成了这样
((Stdent)s2).eat();
我们直接输入s2.eat 会报错
是因为Person类里面没有eat这个方法
如果有,那么将调用Person类里面的eat
如果子类重写了eat 那么将调用子类里面的eat
//可以指向的引用类型就不确定了 :父类引用指向子类
//Student 能调用的方法都是自己的或者是继承父类的
Student s1 = new Student();
//Person 父类型 可以指向子类,但是不能调用子类独有的方法
Person s2 = new Student();
//父类的引用指向子类
Object s3 = new Student();
((Stdent)s2).eat(); //是将Person类的s2 强制转换为Student类型的s2 高转低 强制转换
多态注意事项
-
多态是方法的多态,属性没有多态。
-
父类和子类 有联系 类型转换异常 (有些类型无法转换,但是强制转换的话会出错) ClassCastException!
-
存在的条件: 继承关系,方法需要重写,父类引用指向子类对象 father f1 = new son();
有些方法无法被重写
- static 静态方法 属于类 它不属于实例
- final 常量
- private 私有的 无法被重写
多态
-
即同一方法可以根据发送对象的不同而采用多种不同的行为方式
比如说同样都是run方法 通过s1 和s2 调用出来的,可能会产生不同的结果,但也有可能子类重写了父类,都是通过s1 和s2 调用出来的,但方法都走的子类的
-
一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多(父类,有关系的类)