黑马程序员技术交流社区

标题: 父类和子类输出求解释 [打印本页]

作者: 鲍亚坤    时间: 2012-3-31 12:01
标题: 父类和子类输出求解释
  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:这是为什么?求解
作者: 高铭    时间: 2012-3-31 12:11
第二行代码
public int a = 3;
把修饰符public去掉就可以了
如果不去掉,打印的就是父类中a的值
去掉就子类方法覆盖父类方法addFive();执行子类中代码public int a = 8;

11.        public void addFive(){

12.                this.a +=5;


作者: 鲍亚坤    时间: 2012-3-31 12:30
koma501 发表于 2012-3-31 12:11
第二行代码
public int a = 3;
把修饰符public去掉就可以了

不行。去了也是e 3
作者: 李震 李震 李震    时间: 2012-3-31 12:33
      因为你重写了父类的方法(这是一种多态的表现),所以调用的是子类的方法.所以执行类容的是你子类的内容。
      Foo f = new Exam01();
.          f.addFive();
           System.out.println(f.a);//而你f.a指向的父类的属性。


作者: 高铭    时间: 2012-3-31 13:03
鲍亚坤 发表于 2012-3-31 12:30
不行。去了也是e 3

不对呀 我运行的就是e 13
作者: 高铭    时间: 2012-3-31 13:19
鲍亚坤 发表于 2012-3-31 12:30
不行。去了也是e 3

我搞错了 哈哈 没仔细看

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


作者: 肖发腾    时间: 2012-3-31 13:58

   关于多态,转型这里毕老师的视频讲的很详细,明白,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 14:42
没看明白你想表达什么,18行 Foo f = new Exam01();你想创建父类的对象还是子类的对象,改成Exam01 f = new Exam01();运行结果应该跟你想要的一样。






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