先上代码
package com.fuzi.demo; public class FuZi { public static void main(String[] args) { FuLei fuLei = new ZiLei(); fuLei.print_info(); } } class FuLei { public void print_info() { System.out.println("父类的print_info"); System.out.println(this.getClass()); fun(); } public void fun() { System.out.println("我是父类!"); } } class ZiLei extends FuLei { public void fun() { System.out.println("我是子类!"); } }
输出如下
首先需要明白多态的定义:
1、使用父类类型的引用指向子类的对象;
2、如果子类重写了父类的虚方法,那么调用这个方法的时候,将会先调用子类的方法--动态调用/动态连接;
3、父类引用指向子类对象---也称之为“上溯造型”,父类的方法称之为“虚方法”,需要注意的是:方法是调用子类自己的(如果子类没有才去调用父类的),属性是调用父类的。
总结如下:
继承、重写、父类引用指向子类对象
顺便说一下类型转换的问题:
1、父对象=new 父类();
2、子对象=new 子类();
3、父对象=new 子类();
4、{
父对象=new 子类();
子对象=(子类)父对象; //强制类型转换
}
需要注意的是:
5、{
父对象=new 父对象();
子对象=(子类)父对象;
}
5是不对的,
原因:在new一个子类对象的时候,会在堆内存中申请空间来存储子类对象,
另外,了解一下JVM初始化步骤:
1、假如这个类还没有被加载和连接,则程序先加载并连接该类
2、假如该类的直接父类还没有被初始化,则先初始化其直接父类
3、假如类中有初始化语句,则系统依次执行这些初始化语句
所以初始化子类的时候,父类会先被初始化。
子类继承父类,他可能会比父类拥有更多的方法或者成员变量,子类转换城父类属于向上转型,及多态。
在5中实例化的对象是父类,子类并没有被分配空间,如果把父类的实例化对象强转为子类,子类就是一个空壳子,必然会造成类型转换异常。
原文地址:https://www.cnblogs.com/java-spring/p/9390926.html
时间: 2024-10-29 00:54:43