继承中无参构造的用法

最近学习无参构造和继承,总结出来一些经典编程问题,供大家分享.
例一

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(); 
     }
}

编译上面的程序,看有什么错误提示,如果没有意外的话,会有下面的错误提示:
———- javac ———-
C:\Users\Administrator\Desktop\Test.java:8: 错误: 无法将类 TestA中的构造器 TestA应用到给定类型;
public TestB(){
^
原因在于当我们没有给出构造方法是,系统会自动提供一个无参构造方法;如果我们给出了构造方法,系统将不再默认提供无参构造方法.而在这个例子中,我们在父类中写了一个有参构造,当执行这条语句时TestB testB=new TestB(); 系统会默认在子类无参构造方法中访问父类无参构造方法,但父类没有无参构造方法,所以报错.但是此时TestA中只有一个TestA(String s),只要在TestA中加上”public TestA(){}”即可,或者在TestB的构造函数中加上”super(“xxx”)便不会调用TestA的无参构造函数而是调用TestA的有参构造函数。从这里我们还应该能看出,当我们在一个类中定义了自己的带参数的构造方法的时候,必须把无参构造函数定义一下。


例三:

class P {
    public static void main(String[] args) {
        Father f = new Son();
        f.print();
    }
}

abstract class Father {
    public Father(){
        System.out.println("father");
    }
    public abstract void print();
}

class Son extends Father {
    public void print(){
        System.out.println("son");
    }
}

运行结果:father son,在子类中没有无参构造函数,系统会自己在子类中创建一个无参构造方法,并且访问父类无参构造方法.

例四:

class TestA{ 
    public  TestA(){ 
        System.out.println("A"); 
    } 
} 

class TestB extends TestA{ 
    public static TestB(){ 
        System.out.println("B"); 
    } 

} 

public class Test{ 
    public static void main(String[] args){ 
        TestB testB=new TestB(); 
    } 
} 

———- javac ———-
C:\Users\Administrator\Desktop\Test.java:8: 错误: 此处不允许使用修饰符static
public static TestB(){
^
java中构造方法可以有任何访问的修饰符,public、private、protected或者没有修饰符 ,都可以对构造方法进行修饰。不同于实例方法的是构造方法不能有任何非访问性质的修饰符修饰,例如static、final、synchronized、abstract等都不能修饰构造方法。
解释:构造方法用于初始化一个实例对象,所以static修饰是没有任何意义的;多个线程不会同时创建内存地址相同的同一个对象,所以synchronized修饰没有意义;
构造方法不能被子类继承,所以final和abstract修饰没有意义。
2、返回类型是非常重要的,实例方法可以返回任何类型的值或者是无返回值(void),而构造方法是没有返回类型的,void也不行。
3、至于命名就是构造方法与类名相同,当然了实例方法也可以与类名相同,但是习惯上我们为实例方法命名的时候通常是小写的,另一方面也是与构造方法区分开。
而构造方法与类名相同,所以首字母一般大写。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值