java构造器
Posted 小明子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java构造器相关的知识,希望对你有一定的参考价值。
中午看Java编程思想,偶然间遇到一个关于构造器执行过程的问题。代码如下:
package reusing; class A { public A(int a) { System.out.println("A()"); } } class B { public B(int a) { System.out.println("B()"); } } class C extends A { public C() { super(10); System.out.println("C()"); } B b = new B(10); } public class E05_SimpleInheritance { public static void main(String args[]) { new C(); } } /* Output: A() B() C() */// :~
B()为什么会出现在中间呢?问了百老师,好像略微明白了所以然:
下面大部分笔记来自:http://tech.it168.com/j/2006-05-18/200605181021879.shtml
在定义一个类的时候,如果没有定义构造器,则会编译器默认定义一个无参构造器,如果手动定义了有参构造器,则不会编译器不会自动添加无参构造器。
子类构造器中总默认会调用父类构造器。但是,如果没有默认的父类构造器,或者想调用一个带参数的父类构造器,就必须用关键字super显式地调用父类构造器的语句。
在多层继承关系上,构造器的构建过程是从父类“向外”扩散的,所以父类在导出类构造器可以访问它之前,就已经完成了初始化。
public class Demo1 { public static void main(String[] args) { B8 b1 = new B8(); } } class A8{ public A8(int a){ System.out.println("A8 constructor"); } } class B8 extends A8{ public B8() { super(10); //,由于A8没有默认构造器,如果这行注释了,编译器会报错 System.out.println("B81"); } }
你必须在构造器的第一行放置super或者this构造器,否则编译器会自动地放一个空参数的super构造器的,其他的构造器也可以调用super或者this,调用成一个递归构造链,最后的结果是父类的构造器(可能有多级父类构造器)始终在子类的构造器之前执行,递归的调用父类构造器。
public class Object { ... public Object() {} ... } public class Employee extends Object { private String name; private double salary = 15000.00; private Date birthDate; public Employee(String n, Date DoB) { // implicit super(); name = n; birthDate = DoB; } public Employee(String n) { this(n, null); } } public class Manager extends Employee { private String department; public Manager(String n, String d) { super(n); department = d; } }
以上是关于java构造器的主要内容,如果未能解决你的问题,请参考以下文章
无法解析片段中的 ViewModelProvider 构造?
Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段
Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段
使用java.lang.Exception的错误:测试类应该只有一个公共构造函数
创建一个叫做机动车的类: 属性:车牌号(String),车速(int),载重量(double) 功能:加速(车速自增)减速(车速自减)修改车牌号,查询车的载重量。 编写两个构造方法:一个没有(代码片段