`
longming_xu
  • 浏览: 84755 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
文章分类
社区版块
存档分类
最新评论

<转载学习>子类对父类构造方法调用小结

阅读更多
一、如果父类中没有构造函数,即使用默认的构造函数,那子类的构造函数会自动调用父类的构造函数
class Father {    
  private int a, b;    
   
  void show() {    
    System.out.println(a);    
  }    
}    
   
class Son extends Father {    
  private int c, d;    
   
  Son(int c, int d) {    
    this.c = c;    
    this.d = d;    
  }    
}    
   
public class ConstructionTest {    
  public static void main(String args[]) {    
    Son s = new Son(2, 3);    
    s.show();    
  }    
} 

输出结果0,说明子类的构造函数自动调用父类的无参构造函数,初始化父类的成员为0

二、如果父类中定义了无参构造函数,子类的构造函数会自动调用父类的构造函数

class Father {    
  private int a, b;    
   
  Father() {    
    System.out.println("father done");    
  }    
   
  void show() {    
    System.out.println(a);    
  }    
}    
   
class Son extends Father {    
  private int c, d;    
   
  Son(int c, int d) {    
    this.c = c;    
    this.d = d;    
  }    
}    
   
public class ConstructionTest {    
  public static void main(String args[]) {    
    Son s = new Son(2, 3);    
    s.show();    
  }    
} 
输出结果:father done  

0
说明重写了默认的无参构造函数,子类自动调用这个函数,父类的成员还是被初始化为0.

三、 如果定义了有参构造函数,则不会有默认无参构造函数,这样的话子类在调用父类的无参构造函数的时候会出错(没有用super调用父类有参构造函数的情况下)

class Father {    
  private int a, b;    
   
  Father(int a, int b) {    
    this.a = a;    
    this.b = b;    
  }    
   
  void show() {    
    System.out.println(a);    
  }    
}    
   
class Son extends Father {    
  private int c, d;    
   
  Son(int c, int d) {    
    this.c = c;    
    this.d = d;    
  }    
}    
   
public class ConstructionTest {    
  public static void main(String args[]) {    
    Son s = new Son(2, 3);    
    s.show();    
  }    
} 
输出结果:
Exception in thread "main" java.lang.NoSuchMethodError: Father: method <init>()V
not found
at Son. <init>(Son.java:5)
at ConstructionTest.main(ConstructionTest.java:6)


     实际上,在子类的每一个构造函数中,都会调用父类的构造函数。调用哪一个构造函数,这里分两种情况:
    (1)不显式的用super来指定。这种情况下,会默认的调用无参数的构造函数。如果父类中没有无参数的构造函数,那么程序就会出错,就像以上那个例子。把Father类中的那个构造函数去掉,程序就能通过编译。如果一个类中,没有一个构造函数,那么编译器就会给这个类加上一个无参构造函数。
  (2)显式的使用super来指定调用哪一个构造函数。在Son类的构造函数中加上super(c,d),程序也可以通过编译。


另外,看如下例子:
  A.java

  class A{

  public A(){

  System.out.println("A无参数构造函数被调用");

  }

  public A(int i){

  System.out.println("A有参数构造函数被调用");

  }

  }

  B.java

  class B extends A{

  public B(){

  }

  public B(int i){

  }

  }

  public static void main(String[] args){

  new B(1);

  }

  }

  这个程序打印:无参数的构造函数被打印。而不是:有参数的构造函数被打印。这说明你只要不使用super来指定,他就会默认的去调用父类无参数的构造函数。


0
1
分享到:
评论

相关推荐

    Java程序设计C实验课题(5th)

    编写一个java程序,设计一个汽车类Vehicle,...声明一个父类A,它只有一个非默认构造方法,声明A的子类B,B具有默认构造方法及非默认构造方法,并在B的构造方法中调用基类A的构造方法。编写测试方法生成B的实例并观察结

    传智播客_C++基础课程讲义_v1.0.7

    3小结 6 8运算符重载 6 8.1概念 6 8.2运算符重载的限制 6 8.3运算符重载编程基础 6 8.4运算符重载提高 6 8.5运算符重载在项目开发中的应用 6 8.7附录:运算符和结合性 6 2、 继承和派生 6 3.1继承概念 6 3.1.1类之间...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    10.2.4 调用父类中的构造方法 256 10.2.5 对象也会“变脸” 258 10.2.6 遵守语法,正确“变脸” 262 10.3 覆盖——与继承如影随形 264 10.3.1 当方法不再通用 264 10.3.2 覆盖——让众口不再难调 265 10.3.3 ...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    10.2.4 调用父类中的构造方法 256 10.2.5 对象也会“变脸” 258 10.2.6 遵守语法,正确“变脸” 262 10.3 覆盖——与继承如影随形 264 10.3.1 当方法不再通用 264 10.3.2 覆盖——让众口不再难调 265 10.3.3 ...

    突破程序员基本功的16课.part2

    2.2 父类构造器 2.2.1 隐式调用和显式调用 2.2.2 访问子类对象的实例变量 2.2.3 调用被子类重写的方法 2.3 父子实例的内存控制 2.3.1 继承成员变量和继承方法的区别 2.3.2 内存中子类实例 2.3.3 父、子类的...

    Java开发技术大全 电子版

    4.5.2使用super调用父类的构造方法157 4.6继承的内部处理158 4.7多态的基本概念159 4.8重载159 4.8.1普通方法的重载160 4.8.2构造方法的重载161 4.8.3重载的解析163 4.8.4重载与覆盖的区别165 4.9运行时多态...

    疯狂JAVA讲义

    5.6.4 调用父类构造器 148 学生提问:为什么我创建Java对象时从未感觉到java.lang.Object的构造器被调用过? 150 5.7 多态 151 5.7.1 多态性 151 5.7.2 引用变量的强制类型转换 152 5.7.3 instanceof运算符 154...

    零基础Java入门编程【day7】

    文章目录继承与多态继承单继承方法的重写super关键字调用父类的构造器super和this的区别简单类对象的实例化过程子类对象的实例化过程面向对象特征——多态虚拟方法调用(Virtual Method Invocation)小结[instanceof ...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    第5章 JNDI和远程方法调用 204 5.1 JNDI的概念 205 5.1.1 命名服务 205 5.1.2 目录服务 206 5.1.3 JNDI的优点 206 5.2 JNDI编程入门 207 5.2.1 文件系统的命名服务 207 5.2.2 JNDI编程 208 5.3 服务器提供的JNDI支持...

    python入门到高级全栈工程师培训 第3期 附课件代码

    11 在子类中调用父类方法 12 super调用父类的方法 13 选择系统作业讲解 第26章 01 学生自主复习 02 分享列表 03 多态 04 封装 05 面向对象概念总结 06 反射 07 反射及动态导入模块 08 类的内置attr属性 09 类内置...

    软件工程-理论与实践(许家珆)习题答案

    答:主要的软件开发方法有:结构化开发方法、Jackson(JSP、JSD)方法、原型化开发方 法、维也纳开发方法(VDM)和面向对象的开发方法。 6. 软件生命期各阶段的任务是什么? 答:软件生命期瀑布模型分为六个阶段: ...

Global site tag (gtag.js) - Google Analytics