黑马程序员技术交流社区

标题: 继承问题的小迷惑 [打印本页]

作者: 小发    时间: 2013-8-7 10:46
标题: 继承问题的小迷惑
本帖最后由 小发 于 2013-8-8 20:12 编辑

如下面代码
  1. public class Father {
  2.         String tool="computer";
  3.         String language="vb";
  4.         void speak(){
  5.                 System.out.println("language....."+language);
  6.         }
  7.         void use(){
  8.                 System.out.println("tool....."+tool);
  9.         }
  10.         
  11. }
复制代码
  1. public class Son extends Father{
  2.         String language="java";

  3. }
复制代码
  1. public class Test11 {
  2.         public static void main(String[] args) {
  3.                 Son s=new Son();
  4.                 s.speak();
  5.                 System.out.println(s.language);
  6.                 s.use();
  7.                
  8.         }
  9. }
复制代码
为什么s.speak(); 打印的不是java呢
照理说Son继承了Father的 speak();而Son中的String language="java";
应该打印的是java啊
作者: 王松松    时间: 2013-8-7 11:04
因为,你的子类没有覆盖父类的方法,那么调用speak()方法时调用的是父类的方法,这时方法里面的变量前相当于this.language,所以打印的是父类的 "vb”。

与你用学习!{:soso_e141:}
作者: 张玉建    时间: 2013-8-7 11:06
/*
这里子类继承的父类,子类沿袭了父类的功能到子类,
子类是具备这个功能,但该功能却与父类不一致了,
所以复写父类的功能,定义自己子类的功能主题,
这里子类中定义了子类的变量,未覆盖父类的功能主体,
当主函数调用该方法时,那个方法指向的是父类。*/
作者: 小发    时间: 2013-8-7 11:14
张玉建 发表于 2013-8-7 11:06
/*
这里子类继承的父类,子类沿袭了父类的功能到子类,
子类是具备这个功能,但该功能却与父类不一致了,

明白了
子类当中没有重写父类的speak方法,那么调用子类对象的speak方法时候会用继承下来的父类中的方法
作者: 昨夜星风    时间: 2013-8-7 12:03
本题中虽然 Son extends Father,子类沿袭了父类的功能到子类,
在栈内存中建立对象new Son()   但是在方法区   子类当中没有重写父类的speak方法
所以在调用speak方法时,执行的是加载好的父类中的speak方法

作者: HM张博文    时间: 2013-8-7 12:18
二楼的正解,参考下吧
作者: 糯米酿酒    时间: 2013-8-7 13:47
子类没有复写父类的方法,调用的任然是父类的,相当于父类中的this.language
作者: 心灵之歌    时间: 2013-8-7 20:44
public class Father {
        String tool="computer";
        String language="vb";
        void speak(){
                System.out.println("language....."+language);
        }
        void use(){
                System.out.println("tool....."+tool);
        }
        
}
复制代码
public class Son extends Father{
        String language="java";

}
复制代码
public class Test11 {
        public static void main(String[] args) {
                Son s=new Son();
                s.speak();
                System.out.println(s.language);
                s.use();
               
        }
}
复制代码
为什么s.speak(); 打印的不是java呢////因为 language是属性,不是方法。子类继承父类,属性值不会改变。
照理说Son继承了Father的 speak();而Son中的String language="java";
应该打印的是java啊





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