目录
前提介绍:
java的三大特性为:继承,封装,多态。
多态的定义:
- 同一个行为具有不同的表现形式
多态主要表现为以下俩点:
- 方法多态性:
是重载和重写,博客有详细介绍,不过于多介绍
- 对象多态性:
对象的向上转型::父类 父类对象 = 子类实例
对象的向下转型:子类 子类对象 = (子类)父类实例
主要详细讲解向上转型和向下转型
转型的前提:
要继承,方法重写
向上转型:核心本质:使用的是哪一个子类(new在哪里),而且调用的方法是否被子类覆写
通过子类对象实例化父类对象,这种属于自动转换
- Father f=new Son();
向下转型:
通过父类对象 (大范围) 实例化子类对象 (小范围) , 这种属于强制转换
- Son s = (Son) f;
总结:
0.父类引用指向子类对象,而子类对象引用不能指向父类对象
1..向上转型: 只有当子类重写方法时访问该方法会优先访问子类的那个重写方法,其余情况都只能访问父类里面的变量和方法。
2.向下转型:建立在向上转型的基础之上,其所创建的对象可以访问父类,子类里任意变量和方法,但注意!如果子类变量和父类变量重名,则访问该变量值优先访问的是子类里该变量的值,如果子类方法重写了父类方法,同理,访问该方法优先访问的是子类重写的方法。
3.想进行向下操作之前,一定要首先 发生向上转型,否则在转型时会出现ClassCastException
示例:
class Person{
public void print(){
System.out.print("1.爸爸!");
}
}
class Student extends Person{
public void print(){
System.out.print("2.儿子!");
}
public void fun(){
System.out.print("只有儿子有!");
}
}
public class Test{
public static void main(String[] args) {
//向上转型
Person per = new Student();
per.print();
//这个时候父类能够调用的方法只能是本类定义好的方法
//所以并没有Student类中的fun()方法,那么只能够进行向下转型处理
Student stu = (Student) per;
stu.fun();
}
}
结果: