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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© linder_qzy 中级黑马   /  2015-3-8 20:03  /  897 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Person {
  2.         String name;
  3.         int age;
  4.         Person(String name,int age)
  5.         {
  6.                 this.name = name;
  7.                 this.age = age;
  8.         }
  9. }
复制代码
  1. public class Student extends Person{
  2.         int num;       
  3.         Student(String name,int age)
  4.         {
  5.                 super(name,age);
  6.         }
  7.         Student(String name)
  8.         {       
  9.                 this.num = num;
  10.         }
  11.         Student()
  12.         {       
  13.         }
  14.         public void studey()
  15.         {
  16.                 System.out.println("study");
  17.         }
  18. }
复制代码


为什么Student继承了Person之后就子类就不能在写别的构造函数了。比如Student(){} 和Student(String name)
{       
this.num = num;
}
这2句代码就会报错  为什么呢??

5 个回复

倒序浏览
因为继承以后,在Student的构造函数里面,默认持有super(); ,在你代码里面Person空参构造函数不存在
回复 使用道具 举报
来学习学习
回复 使用道具 举报
1、如果一个类中没有定义构造器,编译器在编译时会自动加上默认无参构造器:
  public ClassName {}
2、this 和 super 的区别。
3、每个类直接或间接是Object的子类,Object只有一个无参构造方法。
4、编译器会在每个构造方法的第一行隐式添加父类的默认无参构造器,即添加super()。
   上述代码中 因为父类定义了一个带参数的构造器,因此编译器不会添加默认无参构造方法,但是因为在子类的构造器中没有显式调用父类的某个构造方法,因此编译器会自动添加super()方法, 但是父类中不存在默认无参构造方法,因此会提示默认无参构造方法未定义错误。
因此实现父类中的无参构造函数,就不会报错了。
  1. package cn.lu.test;

  2. class Person {
  3.         String name;
  4.         int age;
  5.         Person(){
  6.                
  7.         }
  8.         Person(String name, int age) {
  9.                 this.name = name;
  10.                 this.age = age;
  11.         }
  12. }

  13. public class Student extends Person {
  14.         int num;

  15.         Student(String name, int age) {
  16.                 super(name, age);
  17.         }
  18.        
  19.         Student(String name) {
  20.                 this.num = num;
  21.         }

  22.         Student() {
  23.         }

  24.         public void studey() {
  25.                 System.out.println("study");
  26.         }
  27. }
复制代码



回复 使用道具 举报
路文龙 发表于 2015-3-8 20:29
1、如果一个类中没有定义构造器,编译器在编译时会自动加上默认无参构造器:
  public ClassName {}
2、t ...

哦哦  感谢了哈 说的很明白
回复 使用道具 举报
构造函数和继承结合的问题
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马