继承中无参构造的用法

来源:互联网 发布:快典网藏头诗软件 编辑:程序博客网 时间:2024/05/16 09:46

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

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、至于命名就是构造方法与类名相同,当然了实例方法也可以与类名相同,但是习惯上我们为实例方法命名的时候通常是小写的,另一方面也是与构造方法区分开。
而构造方法与类名相同,所以首字母一般大写。

原创粉丝点击