A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Asan 中级黑马   /  2013-4-17 19:51  /  1785 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. package cn.learn.test;

  2. public class Test {


  3. public static void main(String[] args) {
  4. Student s = new Student();

  5. }

  6. }
  7. class Person{
  8. Person(){
  9. System.out.println("调用父类的构造方法!");
  10. }
  11. }
  12. class Student extends Person{
  13. Student(){
  14. System.out.println("调用子类的构造方法!");
  15. }
  16. }
复制代码
为什么我的main方法里之创建了学生类,但打印结果为甚打印了
调用父类的构造方法!
调用子类的构造方法!

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

6 个回复

倒序浏览
因为子类实例化的时候一定会调用父类的无参构造方法的。其实在子类的代码里,隐藏了一个super();也就是父类的无参构造方法:
  1. public class Test {

  2.         public static void main(String[] args) {

  3.                 Student s = new Student();

  4.         }

  5. }

  6. class Person {

  7.         Person() {

  8.                 System.out.println("调用父类的构造方法!");

  9.         }

  10. }

  11. class Student extends Person {

  12.         Student() {

  13.                 super();        //这个是隐藏的,调用父类的构造方法

  14.                 System.out.println("调用子类的构造方法!");

  15.         }

  16. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
在对子类对象进行初始化时,父类的构造函数也会运行,那是因为子类的构造函数默认第一行都有一条隐式的super(),super()会访问父类中空参数的构造函数,而且子类中所有的构造函数默认第一行都是super();。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
  1. public class Test {

  2.         public static void main(String[] args) {
  3.                 Student s = new Student();

  4.         }

  5. }

  6. class Person {
  7.         Person() {
  8.                 System.out.println("调用父类的构造方法!");
  9.         }
  10. }

  11. class Student extends Person {
  12.         Student() {
  13.                 //子类会强制调用父类无参的构造方法,并且这个语句是隐藏的,即
  14.                 //super();
  15.                 System.out.println("调用子类的构造方法!");
  16.         }
  17. }
复制代码
并且,如果父类中没有无参的构造方法,比如下面这种情况:
  1. public class Test {

  2.         public static void main(String[] args) {
  3.                 Student s = new Student();

  4.         }

  5. }

  6. class Person {
  7. //这里因为只定义一个有参数的构造方法,把默认的无参构造方法清除了,导致编译报错。
  8.         Person(String name) {
  9.                 System.out.println("调用父类的构造方法!");
  10.         }
  11. }

  12. class Student extends Person {
  13.         Student() {
  14.                 //子类会强制调用父类无参的构造方法,并且这个语句是隐藏的,即
  15.                 //super();
  16.                 System.out.println("调用子类的构造方法!");
  17.         }
  18. }
复制代码
这样的情况下,因为父类没有无参的构造方法,程序是无法编译的。

但是,如果把隐藏的构造方法改成有参数的,则程序可以编译通过,即:
  1. public class Test {

  2.         public static void main(String[] args) {
  3.                 Student s = new Student();

  4.         }

  5. }

  6. class Person {
  7.         Person(String name) {
  8.                 System.out.println("调用父类的构造方法!");
  9.         }
  10. }

  11. class Student extends Person {
  12.         Student() {
  13.                 //子类会强制调用父类无参的构造方法,并且这个语句是隐藏的,即
  14.                 //super();
  15. //这里,将子类的构造方法中隐藏的super()显式写成super(字符串),也就是父类的构造方法,程序可以通过编译
  16.                 super("string");
  17.                 System.out.println("调用子类的构造方法!");
  18.         }
  19. }
复制代码
总结下:
1、子类构造方法默认调用父类的无参构造方法,隐含调用语句super()。
2、父类构造方法如果没有无参的构造方法,子类可以显式的调用父类有参数的构造方法,即super(父类构造方法的参数类型),也可以通过编译。






评分

参与人数 1技术分 +2 收起 理由
陈丽莉 + 2

查看全部评分

回复 使用道具 举报
package cn.learn.test;



public class Test {





public static void main(String[] args) {

Student s = new Student();



}



}

class Person{

Person(){

System.out.println("调用父类的构造方法!");

}

}

class Student extends Person{

Student(){
     super(); //这里会有个默认的父类的构造函数,不写 super(); 也会有
System.out.println("调用子类的构造方法!");

}

}

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
这就是类与类之间使用extends关键字产生的继承关系的特性。在子类的构造函数中如果你不写super(),运行时,虚拟机会在子类构造函数自动添加上去一个super()来调用父类构造函数。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
希望你看一下毕老师的视频,关于继承这部分的。

因为 子类的构造方法中,你没有写明 要调用父类哪一个构造方法的时候,会有一条 隐式的 super() ,代表调用父类的空参数构造方法。

当然了,你也可以写明调用父类的哪一个构造方法,用参数来区分。你传递什么样的参数,就会调用与之对应的构造方法。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马