今天去一个公司笔试,遇到了如下的一道题:
class TestA{
public TestA(){
System.out.println("A");
}
}
class TestB extends TestA{
public TestB(){
System.out.println("B");
}
}
public class Test{
public static void main(String args[]){
TestB testB=new TestB();
}
}
写出上面程序的运行结果,我毫不犹豫的写了个B,回来运行了一下,输出的而是AB,以前我一直以为只有在子类的构造方法调用super()语句的时候才会调用父类的构造方法,看来不是这样的,子类会自动调用父类的无参构造函数。再看下面的例子:
class TestA{
public TestA(String s){
System.out.println("A");
System.out.println(s);
}
}
class TestB extends TestA{
public TestB(){
System.out.println("B");
}
}
public class Test{
public static void main(String args[]){
TestB testB=new TestB();
}
}
编译上面的程序,看有什么错误提示,如果没有意外的话,会有下面的错误提示:
Test.java:8: 找不到符号
符号: 构造函数 TestA()
位置: 类 TestA
public TestB(){
^
1 错误
此错误是说,找不到TestA()构造函数,出现错误的原因就是:子类TestB会自动寻求调用TestA的无参构造函数,但是此时TestA中只有一个TestA(String s),
只要在TestA中加上"public TestA(){}"即可,或者在TestB的构造函数中加上"super("xxx")便不会调用TestA的无参构造函数
而是调用TestA的有参构造函数。从这里我们还应该能看出,当我们在一个类中定义了自己的带参数的构造方法的时候,
必须把无参构造函数定义一下。
父类的构造函数设置成有参的构造函数就不会被调用了··无参构造函数是你写子类的时候使用extends关键字就会自动调用父类的无参构造函数了··
想不调用它的话除非你不继承于它··因为Java的规定是··要构造一个字类的对象之前必须构造一个父类对象··这就是说·现有父亲才能有儿子,而无所谓是调用父类的无参还是有参构造函数,如果你没有调用有参父类构造函数,则默认调用父类无参构造函数,如果没有定义,报错;
就是说生成子类对象的时候无论如何都会调用一个父类的构造方法,
1:如果子类没有主动调用父类的任一构造方法,并且父类有无参构造方法,那么将会默认执行父类构造方法;如果子类没有主动调用父类的任一构造方法,并且父类也没有自定义无参构造方法,那么将会报错。
2:如果子类主动调用父类的构造方法,那么调用哪一个执行哪一个,如果你不想执行父类默认构造方法,要么清空父类默认构造方法方法体,要么主动调用另一父类构造函数(自然是有参的了)
解决了这个人的疑问:
父类:
public class ancester{
//父类的无参构造函数,继承的子类被实例化的时候这个无参构造函数总会被调用。
public ancester(){
System.out.println("ancester");
}
}
子类:
public class child extends ancester{
public child(){}
public static void main(String args[]){
child ch = new child();
}
}
输出:
ancester
------------------当父类不变,子类改成这样的时候:
public class child extends ancester{
public child(){
System.out.println("aaaa");
}
public static void main(String args[]){
child ch = new child();
}
}
输出:
ancester
aaaa
-------------------
难道说明了子类不管有啥构造函数,都是必须执行一次父类的构造函数?有没有啥技巧方法能避免将子类实例化的时候调用父类的无参构造函数?
同时在Android当中
public class MyView extends View{
public MyView(Context context) {
super(context);//很显然 调用父类的构造函数 其实调用的是父类的无参的构造函数
}
是通过这样的方式来解决这个问题