------Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
- Class类的使用
- 方法的反射
- 成员变量的反射
- 构造函数的反射
- 反射的应用:测试泛型的本质
在《java编程思想》一书中,提到事实上,类的构造方法是一个很特殊的存在,你可以看作它是static方法,这点和static方法的特点不谋而合,因为你可以在对象没有实例化之前,调用构造方法。
然后这里关于构造方法提出以下几点:
(1)关于构造方法的调用链
例如如下代码:
首先在Father类中
public class Father{
public String name;
public int age;
private String work;
public Father(){
this.name="Jack";
system.out.print("I,m afather!");
}
public void getName(){
system.out.print("I,m a father!Myname is "+this.name);
}
private void dailyAction(){
system.out.print("Go towork!");
}
}
然后在son类中
public class Son extends Father{
private String shcoole;
public Son(){
getName();
this.name="Tom";
system.out.print("I,m ason!");
}
public void getName(){
system.out.print("I,m a son!Myname is "+this.name);
}
}
然后在测试类中
public class Test{
public static void main(Stirng agr[]){
Son son=new Son();
}
}
这很简单,大家都知道会执行这行代码Son son=new Son();会先后调用
Father的构造方法,然后调用Son的构造方法。但是大家有没有注意到,我在Son的构造方法里面,调用了getName()方法,由于java的方法是运行时动态绑定的,所以这里你觉得会出现什么要的结果。
I,m a son!
I,m a son!My name is null
所以,这里String的成员变量name为初始化为null,在java中有这样一个规则:
a:在其他任何动作发生前,将分配给对象的存储空间初始化为二进制的零
b:从导出类(父类)到子类的方法依次调用构造方法,(不包括当前类)
c:按照声明顺序依次调用成员的初始化方法。
d:调用当前类的构造方法。
所以在这个案例中我们要注意的是成员变量的初始化是发生在构造方法之前的。
同时声明一点是,为什么要设计这样的构造方法调用链。
由于存在继承关系,所以必须调用父类的构造方法,不然在子类使用从父类中继承的方法或者数据域时就会出现不可预见的错误。
其次关于private方法的声明。Private方法不可以被子类覆盖,因为它对子类不可见。
最后关于构造器中,调用使用子类方法的说明,java建议为了安全,在构造方法中可以调用final类型的方法(其实private方法也是可以调用的)