父类引用指向子类对象--面向对象的多态

先上代码

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中实例化的对象是父类,子类并没有被分配空间,如果把父类的实例化对象强转为子类,子类就是一个空壳子,必然会造成类型转换异常。

猜你喜欢

转载自www.cnblogs.com/java-spring/p/9390926.html