zoukankan      html  css  js  c++  java
  • java 父类引用指向子类对象---动态绑定

    知识点:

    1、java 中父类引用指向子类对象时动态绑定针对的只是子类重写的成员方法;

    2、父类引用指向子类对象时,子类如果重写了父类的可重写方法(非private、非 final 方法),那么这个对象调用该方法时默认调用的时子类重写的方法,而不是父类的方法;

    3、对于java当中的方法而言,除了final,static,private 修饰的方法和构造方法是前期绑定外,其他的方法全部为动态绑定;(编译看左边,运行看右边)

    本质:java当中的向上转型或者说多态是借助于动态绑定实现的,所以理解了动态绑定,也就搞定了向上转型和多态。

    package test;
     
    public class test{
        public static void main(String[] args) {
            System.out.println("--------父类引用指向子类对象-----------");
            
            Father instance = new Son();
            instance.printValue();                                   //this is Son's printValue() method.---Son
            instance.printValue2();                    //this is father's printValue2() method.---father
            System.out.println(instance.name);              //father
            instance.printValue3();                    //this is father's static printValue3() method.
            
            System.out.println("----------创建子类对象------------");
            
            Son son = new Son();                      
            son.printValue();                       //this is Son's printValue() method.---Son
            son.printValue2();                      //this is father's printValue2() method.---father
            System.out.println(son.name);                //Son 
            son.printValue3();                      //this is Son's static printValue3() method.
            
            System.out.println("---------创建父类对象-----------");
            
            Father father = new Father();               
            father.printValue();                    //this is father's printValue() method.---father
            father.printValue2();                   //this is father's printValue2() method.---father
            System.out.println(father.name);            //father
            father.printValue3();                   //this is father's static printValue3() method.
        }
     
    }
     
    class Father {
     
        public String name = "father";
        
        public void printValue() {
            System.out.println("this is father's printValue() method.---"+this.name);
        }
        
        public void printValue2(){
            System.out.println("this is father's printValue2() method.---"+this.name);
        }
        
        public static void  printValue3(){
            System.out.println("this is father's static printValue3() method.");
        }
    }
     
    class Son extends Father {
     
        public String name = "Son";
     
        public void printValue() {
            System.out.println("this is Son's printValue() method.---"+this.name);
        }
        
        public static void  printValue3(){
            System.out.println("this is Son's static printValue3() method.");
        }
    }

    分析:

    1、父类引用指向子类对象,对象调用的方法如果已经被子类重写过了则调用的是子类中重写的方法,而不是父类中的方法;

    2、父类引用指向子类对象,如果想要调用子类中和父类同名的成员变量,则必须通过getter方法或者setter方法;

    3、父类引用指向子类对象,如果想调用子类中和父类同名的静态方法,直接子类“类名点” 操作获取,不要通过对象获取;

    4、父类引用指向子类对象的两种写法:(第二种得了解,面试中可能用到)

    // 1、第一种常规写法
    Father instance = new Son();
    // 2、第二种变形写法;
    Son son = new Son();
    Father mson = (Father) son;
  • 相关阅读:
    5.9
    5.8
    5.4
    04--深入探讨C++中的引用
    01--Qt扫盲篇
    00--Qt Creator 你必须要掌握的快捷操作
    02--读书笔记之:C++ Primer (第4版)及习题
    01--[转]C++强大背后
    01--数据结构——动态链表(C++)
    04-手把手教你把Vim改装成一个IDE编程环境(图文)
  • 原文地址:https://www.cnblogs.com/liuqing576598117/p/10396862.html
Copyright © 2011-2022 走看看