zoukankan      html  css  js  c++  java
  • Java构造器内部的多态方法

     本文主要详解java构造器内部的多态方法,更多Java技术知识,请登陆疯狂软件教育官网。

      我们知道,动态绑定的调用是在运行时才决定的,对象无法知道到底调用的是哪个类的方法。

      当我们在构造器中调用动态绑定的方法,就会用到该方法被覆盖之后的定义。但是这种调用的效果难以预计,因为被覆盖的方法在对象被完全构造之前就会被调用。我们先来看看下面这段代码:

      Java代码

      class Base{

      private String name = "base";

      Base(){

      tellName();

      printName(name);

      }

      public void tellName(){

      System.out.println("tellFather "+ name);

      }

      public void printName(String name){

      System.out.println("printFather "+ name);

      }

      }

      class Drived extends Base{

      private String name = "Drived";

      Drived(){

      tellName();

      printName(name);

      }

      public void tellName(){

      System.out.println("tellChild "+ name);

      }

      public void printName(String name){

      System.out.println("printChild "+ name);

      }

      }

      public class TestObject {

      public static void main(String args[]){

      new Drived();

      }

      }

      从代码中可以看出,子类Derived覆盖了父类Base的方法。当我们实例化一个Derived对象的时候,会自动调用父类的构造器,而父类构造器中却调用了动态绑定方法

      Java代码

      tellName();

      这样一来,在父类构造器中就会调用子类的tellChild()方法。此时父类Base已完成初始化。。由于此时子类Derived还没有完成初始化,其实例变量name为默认为null。然后父类构造器退出,回到子类构造器调用处,然后完成子类初始化,接下来子类构造器调用完成。

      代码的运行结果如下;

      Java代码

      tellChild null

      printChild base

      tellChild Drived

      printChild Drived

      实际的初始化过程应该是这样的:

      1. 在其他任何事物发生之前,将分配给对象的存储空间初始化为二进制的零。

      2. 如上文一般,调用父类构造器,在父类构造器中会调用被子类覆盖的方法(如果有在构造器中调用了动态绑定的方法)。

      3. 按照声明的顺序调用成员的初始化方法。

      4. 调用子类的构造器。

      从上例可以看出,在构造器中能安全调用的方法是不能被继承的,即该方法被final修饰,或者方法是private的(private方法自动属于是final的,嘿嘿)。

      广州疯狂软件Java培训紧跟最新的Java潮流技术,国内首家讲解Java 8新特征,根据企业工作中需要的开发技术,让学员学习的课程是企业最需要的实用技术,而且也保障学员能把这些技能点学会、学好,并且疯狂软件教育的课程实时更新,在信息技术快速发展的情况下,可以保证学员学到更新更主流的技术。师资雄厚,教师均拥有8年以上的项目实践经验,疯狂软件Java课程是理论与实践相结合,这样保障了学员很好的掌握理论知识同时,也能根据理论的指导做好实际的工作。为了培养学生的实践能力,设置了很多项目实战课程,在这些课程中,学生可以体验真正的项目实战过程,从而更深刻地掌握知识。如需了解更多,可登陆疯狂软件教育官网查询。

  • 相关阅读:
    【Codechef】Chef and Bike(二维多项式插值)
    USACO 完结的一些感想
    USACO 6.5 Checker Challenge
    USACO 6.5 The Clocks
    USACO 6.5 Betsy's Tour (插头dp)
    USACO 6.5 Closed Fences
    USACO 6.4 Electric Fences
    USACO 6.5 All Latin Squares
    USACO 6.4 The Primes
    USACO 6.4 Wisconsin Squares
  • 原文地址:https://www.cnblogs.com/gojava/p/4147167.html
Copyright © 2011-2022 走看看