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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨志 高级黑马   /  2012-4-27 09:41  /  1387 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class  Father{

        public Father(String name){
                System.out.println("father name");
        }
}

class Son extends Father{
        public Son(){
                System.out.println("Son");
        }
}
public class TestExtends{
        public static void main(String[] args){
                new Father("dddd");
                new Son();
        }
}

真心感觉没错!但是为什么会找不到符号!

8 个回复

倒序浏览
没有给父类写无参数的构造函数,因为你的子类构造函数是无参数的,具体程序如下:
class  Father{
        public Father()
        {}
        public Father(String name){
                System.out.println("father name");
        }
}

class Son extends Father{
        public Son(){
                System.out.println("Son");
        }
}
public class TestExtends{
        public static void main(String[] args){
                new Father("dddd");
                new Son();
        }
}
回复 使用道具 举报
  1. class  Father{

  2.         public Father(String name){//这里不要带参数
  3.                 System.out.println("father name");
  4.         }
  5. }

  6. class Son extends Father{
  7.         public Son(){
  8.                 System.out.println("Son");
  9.         }
  10. }
  11. public class TestExtends{
  12.         public static void main(String[] args){
  13.                 new Father("dddd");//这里不加参数
  14.                 new Son();
  15.         }
  16. }
复制代码
报错的愿意:你Son类继承Father类,在实例化Son类(子类)时,会调用父类(Father)的构造方法,你实例化子类的时候没有给参数,所以你父类要提供一个不带参数的构造方法。
回复 使用道具 举报
Kristy_Li 发表于 2012-4-27 09:51
没有给父类写无参数的构造函数,因为你的子类构造函数是无参数的,具体程序如下:
class  Father{
        public  ...

子类初始化的时候要去调用父类的构造函数?
回复 使用道具 举报
杨志 发表于 2012-4-27 09:59
子类初始化的时候要去调用父类的构造函数?

子类在实例化时首先调用父类的构造方法。
回复 使用道具 举报
杨志 发表于 2012-4-27 09:59
子类初始化的时候要去调用父类的构造函数?

嗯,子类调用父类的构造函数,如果子类有无参数的构造函数,那么父类也一定要有无参数的构造函数!
回复 使用道具 举报
丁佼 黑马帝 2012-4-27 10:11:37
7#
本帖最后由 丁佼 于 2012-4-27 10:18 编辑

子类构造函数的第一句,如果你没写的话java会隐式自动添加一句 super();
功能是调用父类的无参数的构造函数。
(题外话:当有一个类你没有为它写任何构造函数的时候,java会隐式的建立一个无参数的构造函数。)
而你的父类里因为已经有了有参数的自定义构造函数,java不会再为它建立无参数的构造函数,
所以子类调用super()的时候就报找不到符号了。

附你子类的被java看到的代码:
  1. class Son extends Father{
  2. public Son(){
  3. super(); //调用父类无参数构造函数,你自己不显式的调用的话,java也会帮你把这句隐式的自动添加上去的。
  4. System.out.println("Son");
  5. }
  6. }
复制代码
如果硬是不想写空参数的父类构造函数的话,在子类构造函数第一句中显式的注明要调用的父类有参构造函数就行了,
  1. class Son extends Father{
  2. public Son(){

  3. super("x");
  4. /*调用父类的有参构造函数,就是说,不管你怎么写,既然是子类,就要做到儿子的本分,第一句必须是引用父类的构造函数就对了,至于用哪一个就看你自己需要了。*/

  5. System.out.println("Son");
  6. }
  7. }
复制代码
这样是可以编译运行的,你可以编译运行一下。

回复 使用道具 举报
通俗的说,没有父亲哪有儿子,你要产生子类实例,当然就必须先实例化父类,当执行new Son() 时,当然先实例化Father类,默认的Father()无参构造方法不存在,当然无法实例化父类。
回复 使用道具 举报
class  Father{
        public Father(){
                System.out.println("father name");
        }

        public Father(String name){
                System.out.println("father name");
        }
}

class Son extends Father{
        public Son(){
                System.out.println("Son");
        }
}
public class TestExtends{
        public static void main(String[] args){
                new Father("dddd");
                new Son();    //调用Son无参数构造方法是会先调用父类的无参数构造方法,而你的父类Father没有定义无参数构造方法,正确的代码应该在父类Father中添加无参数构造方法
        }
}

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马