class Animal{
int height=40,weight;
void eat(){
System.out.println("animal eat");
}
void sleep(){
System.out.println("animal sleep");
}
void breathe(){
System.out.println("animal breathe");
}

}
class Fish extends Animal{
int height=30;

void breathe(){
super.height=50;
super.breathe();
System.out.println(super.height);
System.out.println("fish breathe");
}
}
class AA{
public static void main(String args[]){
Animal an=new Animal();
Fish fi=new Fish();
//an.breathe();
// fi.weight=30; fi.breathe();
System.out.println(an.height);
}

}
有个地方不明白了class Fish extends Animal{
int height=30;

void breathe(){
super.height=50;
super.breathe();
System.out.println(super.height);
System.out.println("fish breathe");
}
}这段里面在breathe()方法里我调用父类的height并修改为50然后用super.height打印出来是50,这样我是否已经修改了父类的height变量值为50呢?在AA类里打印父类的哪个height值为40也就是没有修改,这个原因是变量生命周期问题么?在我那方法里即使调用父类的height并赋值为50但是一出breathe这个方法后就失效了?

解决方案 »

  1.   

    子类创建对象时,其实它的里面就创建了一个父类的对象。你的方法修改的是子类里面的父类对象的height,而你的AA中你是通过new创建了另一个animal对象,这个对象的值是新的,并没有改变。
    你要知道的是,子类创建对象时,也在其中创建了父类的一个对象。你的super就是指向这个在子类中的父类这个对象。
      

  2.   

    是这样的,Animal an=new Animal();的时候,你创建了一个对象,height 这个时候是40的。
    然后你创建了一个Fish fi=new Fish();对象,这个时候fi的对象在没执行super.height=50;
    这个的时候hieght还是40,执行吼fi对象的height是50,注意an对象的height还是40
    最后你答应的是an的height。
      

  3.   

    你可以用IDE调试看字段的变化。
      

  4.   

    使用super调用父类属性,当父类属性没有static修饰时,修改的是专属该子类的一个父类属性,其他类继承同样的父类时他们的属性名一样,但是值是不一样的
      

  5.   

    class AA{
    public static void main(String args[]){
    Animal an=new Animal();
    Fish fi=new Fish();
    fi.breathe();
    System.out.println(an.height);
    }
    在main方法里程序先创建了一个父类对象,然后又创建了一个子类对象然后调用子类的breathe()方法在此方法里用super调用父类的成员变量并传值为50然后打印父类的高也就是传进去的50到这里没有错误,下面重新回到main方法里执行输出语句System.out.println(an.height);用父类对象调用他的高,值就为40了,这里难道我没改变父类成员变量的值么?还是成员变量在每个对象里都有一份拷贝我修改的只是子类创建的哪个父类对象的值?而真正父类自己创建的哪个an对象值始终没有变过?各位大哥....这里不明白帮忙讲讲....
      

  6.   

    把height定义为static类型就能改变值了
      

  7.   

    这里有两个问题,一个是作用域问题,一个是值传递问题作用域没什么好说的,作用域范围由大括号控制,出了打括号就失去作用了再有就是值传递问题,JAVA中的值传递分为两种,一种是基本型别传递,一种是引用传递,fi.breathe();是执行Fish中的breathe()方法,此方法中对height的修改只局限于该方法中,并没有修改类Fish中的height,你在main中在加上一句System.out.println(fi.height);你就会发现输出的仍然是30。但是要是这样Fish fi=new Fish();
    Fish fi2 = new Fish();
    fi.breathe();
    System.out.println(fi.height);
    fi2.height = 50;
    fi = fi2;
    System.out.println(fi.height);第二次输出fi.height,就变成50了,这个就是引用传递