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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 鲍亚坤 中级黑马   /  2012-3-31 12:01  /  2859 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Foo{
  2.         public int a = 3;
  3.         public void addFive(){
  4.                 a+=5;
  5.                 System.out.print("f ");
  6.         }
  7. }
  8. public class Exam01 extends Foo{

  9.         public int a = 8;
  10.         public void addFive(){
  11.                 this.a +=5;
  12.                 System.out.print("e ");
  13.                 System.out.println(a);
  14.         }
  15.         public static void main(String[] args) {
  16.                 // TODO Auto-generated method stub
  17.                 Foo f = new Exam01();
  18.                 f.addFive();
  19.                 System.out.println(f.a);
  20.         }

  21. }
复制代码
为什么输出结果是e 3
e:父类指向子类
3:这是为什么?求解

8 个回复

正序浏览
没看明白你想表达什么,18行 Foo f = new Exam01();你想创建父类的对象还是子类的对象,改成Exam01 f = new Exam01();运行结果应该跟你想要的一样。

回复 使用道具 举报

   关于多态,转型这里毕老师的视频讲的很详细,明白,java基础08天03视频。
  先说一下转型的问题:
     毕老师举得例子是:
            Animal  a= new Cat();//这是类型提升,即向上转型,将猫转型成了动物   
         动物都有吃东西这一方法,所以
                   a.eat();//具体吃的是猫,所以这里对应的是猫的具体的吃东西的方法。
这里就会有打印出来是调用Exam01中的方法,打印出来3了。
     记住,多态至始至终都是子类在做变化!

而  System.out.println(f.a);
打印的时候,因为f是Foo类型,f是父类,访问自己类中特有数据,不能访问子类中的,所以f.a是Foo类中的3

楼主明白了么,这里设计到了向上向下转型,多态知识,多练习下就明白了,呵呵

回复 使用道具 举报
鲍亚坤 发表于 2012-3-31 12:30
不行。去了也是e 3

我搞错了 哈哈 没仔细看

应该用父类对象new父类对象
18行   Exam01 exam = new Exam01();

回复 使用道具 举报
鲍亚坤 发表于 2012-3-31 12:30
不行。去了也是e 3

不对呀 我运行的就是e 13
回复 使用道具 举报
      因为你重写了父类的方法(这是一种多态的表现),所以调用的是子类的方法.所以执行类容的是你子类的内容。
      Foo f = new Exam01();
.          f.addFive();
           System.out.println(f.a);//而你f.a指向的父类的属性。

回复 使用道具 举报
koma501 发表于 2012-3-31 12:11
第二行代码
public int a = 3;
把修饰符public去掉就可以了

不行。去了也是e 3
回复 使用道具 举报
第二行代码
public int a = 3;
把修饰符public去掉就可以了
如果不去掉,打印的就是父类中a的值
去掉就子类方法覆盖父类方法addFive();执行子类中代码public int a = 8;

11.        public void addFive(){

12.                this.a +=5;

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