zoukankan      html  css  js  c++  java
  • java学习——基础入门(2)

    本文为学习笔记,留作自用,不会记载的特别详细,如有错误,欢迎指正

    1. 关于无参构造函数与有参构造函数

    我们都知道如果不定义无参构造函数系统会自动调用默认构造函数

    当我们定义了一个有参构造函数,就必须手动定义一个无参构造函数

    这里来尝试分析下原因,首先要了解下构造函数的调用逻辑

    上图中我们可以看出子类的构造函数将会递归优先调用父类方法的

    无参构造函数,效果相当于

    class GrandFather{
        public GrandFather(){
            super();
            System.out.println("高层构造函数");
        }
    }
    
    class Father extends GrandFather{    
        public Father(){
            super();
            System.out.println("中层构造函数");
        }
    }
    
    class Son extends Father{    
        public Son(){
            super();
            System.out.println("底层构造函数");
        }
    }

    只不过这里将super给隐藏了,这是系统默认会执行的语句

    我们可以发现,无参构造函数在申明时默认调用的是父类的无参构造函数。

    加入我们把中间一层的无参构造函数去掉,并只申明一个有参构造函数。

    此时,编译器将提醒我们存在编译错误:Implicit super constructor Father() is undefined. Must explicitly invoke another constructor

    强制要求我们申明Father类的无参构造函数,这是因为编译器认为,此时子类并不想走

    父类的无参构造函数,但是又没有指明该走哪条路,这里的super()失效了,

    所以我们可以给Son指出他的道路

    只要显示的申明super(1),告诉子类递归走父类的哪一个构造函数即可。

    由此可见,实际上一个类假如不作为父类,不申明无参构造函数并不会造成实际影响。

    但我们并无法保证永远不作为子类这一前提,所以我们还是需要遵循规则去显示的申明。

    值得注意的是,每个构造函数的首行如果没有显示的super父类构造函数,编译器将默认添加上super(),指向

    父类的默认构造函数

    在构造方法中调用另一个构造方法,调用动作必须置于最起始的位置。
    不能在构造方法以外的任何方法内调用构造方法。
    在一个构造方法内只能调用一个构造方法。

    争取早日不再是一只菜鸡
  • 相关阅读:
    angular多个控制器如何共享数据
    $q服务的使用
    $sanitize和$sce服务的使用方法
    json对象与json字符串互转方法
    css语法和JS语法的对比
    让低版本IE也能正常运行HTML5+CSS3网站的3种解决方案
    HTML中的IE条件注释
    区块链是什么,如何评价区块链
    编写Python脚本把sqlAlchemy对象转换成dict的教程
    编写Python脚本把sqlAlchemy对象转换成dict的教程
  • 原文地址:https://www.cnblogs.com/jchen104/p/14655940.html
Copyright © 2011-2022 走看看