class Animal
{

public int height =1;

public void output()
{

System.out.println(height);
}
}class Fish extends Animal
{


public int height=2;

public void output()
{

System.out.println(height);
}}
public class Inheritage { public static void main(String[] args) {
          Animal an=new Fish();
          System.out.println(an.height);//1
          an.output();//2
 
}}为什么两个输出分别是1和2? 这个继承的过程大概是怎样的?谢啦!

解决方案 »

  1.   

    是这样的,你先声明了一个Animal类的引用指向了他的一个子类,也就是子类对象指向父类的引用Fish对象就失去了自己的特性被看成它的父类Animal看待,所以这里第一打印出来是1,
    这个就是多态了,也叫动态绑定,
    按照刚才说的应该是调用他父类的output方法,但是这里很特殊,
    Fish它重写了output方法,那么当调用的时候会动态的绑定,an是什么对象就调用它的方法
    构成多态必须要有3个条件
     1.要有继承的关系
     2,父类引用指向子类对象
     3.必须要有方法的重写
                     
    我的文字水平有限说的不好,具体你去网上看多的是      
      

  2.   

    这是一个多态问题,an.height输出的是父类的属性,因为an是一个父类的应用,而an实际是指向子类Fish,而an.output发生的是子类的行为。如果把属性改为private,an.height是错位的。这是一个没有实际意义的题目,在开发过程中没有人会把属性声明为public的,这违反了基本原理。
      

  3.   

    http://blog.csdn.net/lb85858585。欢迎访问我的博客。
      

  4.   

    可以用子类的方法来打印它的,只是你这里比较特殊属性名称一样,子类覆盖掉了你换成别的sHeight = 1;
    在用Fish f = new Fish(),f.sHeight就可以了,
      

  5.   

    可以在子类中引用父类的数值class Fish extends Animal { public int height = 2; public void output() { System.out.println(super.height);
    }
    }
      

  6.   

    System.out.println(super.height);
      

  7.   

    an的编译时类型是Animal,运行时类型是fish
      

  8.   

    子类extends父类。调用方法时候是子类覆盖父类的方法所以是2.
    是Animal an 是一个Animal的引用指向子类的对象。an.height.属性还是父类的 调用的是Animal的height
    如果你这样new 
    Fish fish = new Fish();
    System.out.println(fish.height);
    这输出的就是子类的属性!2
      

  9.   

    第一个是直接访问Animal类的height属性,第二个是通过Fish的output方法覆盖来访问Fish类的height属性