例如:Class b extends a{public b(){}}就没有任何有关父类构造器的信息 , 这时父类的缺省构造器就会被调用 。举个SL-275中的例子 1 public class Manager extends Employee { 2 private String department; 3 4 public Manager(String name, double salary, String dept) { 5 super(name, salary); 6 department = dept; 7 } 8 public Manager(String n, String dept) { 9 super(name); 10 department = dept; 11 } 12 public Manager(String dept) { // 这里就没有super() , 编译器会自动地添加一个空参数的缺省super构造器 , 此时如果Employee类中没有空参数的缺省构造器 , 那就会导致一个编译错误 13 department = d; 14 } 15 } 你必须在构造器的第一行放置super或者this构造器 , 否则编译器会自动地放一个空参数的super构造器的 , 其他的构造器也可以调用super或者this , 调用成一个递归构造链 , 最后的结果是父类的构造器(可能有多级父类构造器)始终在子类的构造器之前执行 , 递归的调用父类构造器 在具体构造类实例的过程中 , 上边过程的第二步和第三步是有一些变化的 , 这里的顺序是这样的 , 分配了对象空间及对象成员初始化为默认值之后 , 构造器就递归的从继承树由根部向下调用 , 每个构造器的执行过程是这样的: 1、Bind构造器的参数 2、如果显式的调用了this , 那就递归调用this构造器然后跳到步骤5 3、递归调用显式或者隐式的父类构造器 , 除了Object以外 , 因为它没有父类 4、执行显式的实例变量初始化(也就是上边的流程中的第二步 , 调用返回以后执行 , 这个步骤相当于在父构造器执行后隐含执行的 , 看样子像一个特殊处理) 5、执行构造器的其它部分 这里的步骤很重要哦!!!!! 从这个步骤中可以很明显的发现这个实例初始化时的递归调用过程 , 估计看过这个你应该能够理解这个递归构造链是怎么样回事了 。
这里还是给出SL-275中的一个例子 , 让你充分理解一下这个递归的过程 。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; } } 在创建Manager("Joe Smith","Sales"):时 , 步骤如下 0 basic initialization 0.1 allocate memory for the complete Manager object 0.2 initialize all instance variables to their default values (0 or null) 1 call constructor: Manager("Joe Smith", "Sales") 1.1 bind constructor parameters: n="Joe Smith", d="Sales" 1.2 no explicit this() call 1.3 call super(n) for Employee(String) 1.3.1 bind constructor parameters: n="Joe Smith" 1.3.2 call this(n, null) for Employee(String, Date) 1.3.2.1 bind constructor。
3. JAVA里面的构造函数到底该怎么理解 其实很简单 , JAVA是一种面向对象的语言 , 所有的数据都是以对象的形式存在的 , 构造函数保证你在new一个对象的时候 , 它里面的数据被正确的赋值 。比如:
class A{
int a;
public A(){}; //无参数的构造函数 数据A被赋值为0.
public A(int a){ this.a = a}; //有参数的构造方法 , 你可以在创建对象的时候主对
//a 赋值
}
A m = new A();
A n = new A(10);
文章插图
- 关于函数符号的故事的介绍 函数符号的故事
- java怎么写exe
- 怎么给前端写接口
- large函数 large函数里加多个条件
- counta counta函数
- 手机怎么写java代码
- match match函数的使用方法
- java获取本地路径怎么写
- javafor循环怎么写
- java读取文件的路径怎么写