黑马程序员技术交流社区

标题: 继承代码求解!! [打印本页]

作者: java小兵    时间: 2014-12-1 14:55
标题: 继承代码求解!!
本帖最后由 java小兵 于 2015-1-26 21:35 编辑
  1. class Person
  2. {
  3.         public String name;
  4.         public int age;
  5.         public Person()        
  6.         {
  7.                 System.out.println("father");
  8.                 say();
  9.         }
  10.         public void say()
  11.         {
  12.                 System.out.println("person can say.");
  13.         }
  14. }
  15. class Student extends Person
  16. {
  17.         public String school;
  18.         
  19.         public Student()
  20.         {
  21.                 System.out.println("son");
  22.                
  23.         }
  24.         public void say()
  25.         {
  26.                 System.out.println("student speak:"+name+age+school);
  27.         }
  28. }
  29. class  ExtendsDe
  30. {
  31.         public static void main(String[] args)
  32.         {
  33.                 Student s = new Student();
  34.                 s.name="jack,";
  35.                 s.age=20;
  36.                 s.school=",midschool.";
  37.                 s.say();
  38.                 System.out.println("Hello World!");
  39.         }
  40. }
复制代码
输出结果是:
father
student speak:null0null
son
student speak:jack,20,midschool.
Hello World!

问题是怎么样去掉结果的前两句??




作者: cs8630323    时间: 2014-12-1 15:55
{:3_68:}删掉代码
作者: 金福林    时间: 2014-12-1 16:42
class Person
{
        public String name;
        public int age;
        public Person()        
        {
//删掉这两句就好了
               // System.out.println("father");
                //say();
        }
        public void say()
        {
                System.out.println("person can say.");
        }
}
作者: 依米阳光    时间: 2014-12-1 17:05
个人见解:
首先你得知道为什么会出现这样的结果,因为Student类继承Person类,当执行 Student s = new Student()时
①调用Student类的构造函数
②调用Person类的构造函数
③执行Person类的构造函数
④执行Student类的构造函数
当执行③时s.name="jack,";s.age=20; s.school=",midschool.";并未执行,所以会出现你所说的运行结果。解决办法如二楼所说。
作者: Cfan_yang    时间: 2014-12-1 17:09
say()方法覆写了父类的say()方法。
作者: 雨过山更翠    时间: 2014-12-1 17:49
删了不就完了吗,我来赚点钱
作者: Smart_lll    时间: 2014-12-1 18:07
最简单的办法就是删除代码,或者注释掉代码,另一种方式可以改成这样:就是在父类中再写一个含参数的构造函数,至于构造函数的参数可以自己定义,函数体为空即可,接着将子类中隐式调用父类中的super()改成显式调用父类中含参数的的改造方法即可。
class Person
{
        public String name;
        public int age;
        public Person(String str){} //参数自定 函数体为空即可。
        public Person()        
        {
                System.out.println("father");
                say();
        }
        public void say()
        {
                System.out.println("person can say.");
        }
}
class Student extends Person
{
        public String school;
        
        public Student()
        {
                super(school);  // 显式调用父类中的函数体为空的构造函数
                System.out.println("son");
               
        }
        public void say()
        {
                System.out.println("student speak:"+name+age+school);
        }
}
class  ExtendsDe
{
        public static void main(String[] args)
        {
                Student s = new Student();
                s.name="jack,";
                s.age=20;
                s.school=",midschool.";
                s.say();
                System.out.println("Hello World!");
        }
}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2