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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 执笔梦 金牌黑马   /  2014-5-5 21:19  /  1671 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package baseDemo;

class A{
        private String name="aaaaa";

        public String getName() {
                System.out.println(this.getClass().getName());//在这是子类。
                return name;
        }

        public void setName(String name) {
                this.name = name;
        }
       
       
}
class B extends A{
        private String name="bbbb";
       
}
public class ExtendsDemo {

        public static void main(String[] args) {
                        B b = new B();                 //创建子类对象
                        System.out.println(b.getName()); //输出:aaaaa    在这为什么返回的是父类的name;
        }
}

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

6 个回复

倒序浏览
本帖最后由 菠萝包丶 于 2014-5-6 00:05 编辑

由于,代码的框显示不出来,重新在下一楼楼重新整理下。读完下完的还是有问题的话。看看下面的简单继承例子:

  1. class Car
  2. {
  3.        private int CarNumber;//定义成员变量:车牌号
  4.        void SetNumber(int  CarNumber)//成员方法:设置车牌号
  5.        {
  6.                this.CarNumber=CarNumber;
  7.        }
  8.        void ShowNumber()//输出车牌号
  9.        {
  10.                System.out.println("My Car No. is:"+CarNumber);
  11.        }
  12. }
  13. class Bus extends Car//继承父类的方法,没有复写继承的方法,并有自己的两个方法,子类实际4个方法
  14. {
  15.        private int Capacity;/我们可以把这个参数以及下面的同参数,改成CarNumber,但是结果是一样的,只不过名字相同而已
  16.        void SetCapacity(int Capacity)
  17.        {
  18.              this.Capacity=Capacity;
  19.        }
  20.         void ShowCapacity()
  21.        {
  22.                System.out.println("My Capacity is:"+Capacity);
  23.        }
  24. }
  25. class CarDemo
  26. {
  27.        public static void main(String[] args)
  28.        {
  29.               Bus DemoBus=new Bus();
  30.               DemoBus.SetNumber(6868);//子类对象调用继承的父类方法,没有重写该方法,所以它只会对父类的this.数据进行操作
  31.               DemoBus.ShowNumber();
  32.               DemoBus.SetCapacity(30);
  33.               DemoBus.ShowCapacity();
  34.        }
  35. }
  36.       
复制代码

回复 使用道具 举报
本帖最后由 菠萝包丶 于 2014-5-6 00:14 编辑

楼主,针对你的代码,我研究了一下。
  1. class A
  2. {
  3.         private String name="aaaaa";

  4.         public String getName()
  5.         {
  6.                                 System.out.println(this.getClass());
  7.                                 System.out.println(this.getClass().getName());                        
  8.                                 return name;
  9.         }

  10.         public void setName(String name)
  11.         {
  12.                 this.name = name;
  13.         }
  14.         
  15.         
  16. }
  17. class B extends A
  18. {
  19.         private String name="bbbb";
  20.                 //public String getName()
  21.                 //{
  22.                 //        return name;
  23.                 //}
  24. }
  25. class ExtendsDemo
  26. {
  27.         public static void main(String[] args)
  28.                 {
  29.                                 B b = new B();//创建子类对象
  30.                                 System.out.println(b.getName());
  31.                 }
  32. }
复制代码

以下是个人跟舍友的看法:在该子类中,没有对getName方法进行复写,所以,子类中的方法本质是不属于B的,它只是继承了过来,当你通过B调用没有重写的方法时,它只认识父类的this,所以调用的this.getname也只是A的name。

简单说就是,不要让相同的名字变量,影响我们对函数调用的思维。没复写的话getName()方法跟子类的name没关系。你可以把它想成正常的方法调用,只不过因为你没有重写,所以这方法只会回去调用它本类的成员。我重写A类的方法后,结果就是输出bbbb了。你要了解继承之后没复写的父类方法是怎么被调用的。可以看上面的车和巴士的例子

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

回复 使用道具 举报
为何我把楼主的代码贴上后,编译可以通过,但是运行的话报错,
然后把第一行的
package baseDemo;   删掉后,编译与运行没错误,得出结果
B
aaaaa
回复 使用道具 举报
菠萝包丶 发表于 2014-5-5 22:31
楼主,针对你的代码,我研究了一下。

以下是个人跟舍友的看法:在该子类中,没有对getName方法进行复写, ...

我知道一般不要重名,只是好奇哈,return this.name,可是这个this不是代表子类吗?
我在上面输出了this的类名,是子类。不懂:(
回复 使用道具 举报
本帖最后由 ☆枫の云 于 2014-5-5 22:53 编辑

有点儿意思,我也开始以为也是返回bbb...在网上查了查:恍然大悟..
虽然子类继承了父类的,如果没有重写,严格意义上来说, 只能说子类能直接访问这个属性或者是方法,但是这个方法还是在父类的里面。子类相当于将整个父类放在了自己的里面。所以在没有重写的情况,由于这个方法还是在父类中间的方法,所以返回的还是父类的属性。
例子如下
1,子类继承父类,会继承父类的所有属性(properties)和方法(methods),包括private修饰的属性和方法,但是子类只能访问和使用非private的,所以可以这么理解: 子类对象的内部 包涵了一个完整父类对象;

2.  new Zi()就是创建一个子类对象,而子类对象内部包涵了父类对象,所以又要先new Fu(), 也就是说
创建子类对象 = 创建父类对象 + 其他
//        Zi() {

//                super(); 这是JVM默认加上去的

//        }


3.子类对象没有重写(Overriding)父类的方法,那么这个方法就还"包涵"在父类对象里,,子类对象用getI()方法,其实质调用的是 子类对象"肚子里的"那个父类对象的方法.

4 return i; JAVA规定,变量前面没有特别说明是谁的变量,那么就适用"就近原则",显然父类对象的属性int i是最近的,下面这个例子可以更好的理解就近原则;
  1. <pre class="brush: java" style="color: rgb(0, 0, 0); line-height: 24px; ">public class Test {

  2.         static int age = 1;

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

  4.                

  5.                 System.out.println(age);//输出1     此处没有指明这个age是谁的,适用就近原则,JVM认为age是成员变量static int age;

  6.                

  7.                 int age = 2;

  8.                 System.out.println(age);//输出2        此处没有指明这个age是谁的,适用就近原则,JVM认为age是  局部变量int age;

  9.                

  10.                 System.out.println(Test.age);//输出1 此处指明了是类Test的age,JVM就不能再用就近原则了.

  11.         }

  12. }</pre>
复制代码

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 菠萝包丶 于 2014-5-6 00:04 编辑
执笔梦 发表于 2014-5-5 22:44
我知道一般不要重名,只是好奇哈,return this.name,可是这个this不是代表子类吗?
我在上面输出了this的 ...

对的,你调用的方法getclass()的确是返回对象所属的类。但是这是B调用Object的方法,该方法返回对象所属的类。而这个方法跟this没有关系,你可以看我二楼给的简单继承例子,你别想太复杂。只不过出现了成员变量重名现象,你就会想的太复杂。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马