zoukankan      html  css  js  c++  java
  • 父类引用指向子类对象--面向对象的多态

    先上代码

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

  • 相关阅读:
    element-ui做表单验证 v-for遍历表单 自动生成校验规则 pc移动双适配
    element-ui练习使用总结
    js监听页面标签切换
    对象数组,按照没想中特定的属性(按中文拼音)排序
    调用七牛云存储文件,返回url
    javascript中的class类 以及class的继承
    javascript原型继承
    javascript面向对象 用new创建一个基于原型的javascript对象
    java中的变量和数据类型
    css的伪元素
  • 原文地址:https://www.cnblogs.com/java-spring/p/9390926.html
Copyright © 2011-2022 走看看