本来是做package的练习的,但是出现了个意外的问题,请大家帮忙解释下原因.
程序是这样的,有三个简单的类:1.Animal类,编译后放在Animal包中
                            2.Bird类,继承自Animal类,编译后放在Birds包中
                        3.PackageTest类,用来测试的主类.
代码如下:
//Animal.java
package Animal;
public class Animal
{
private static int count=0;
private int legs=4;
public Animal()
{
     count++;
     System.out.println("Create a animal");
}
public void setLegs(int legs)
{
     this.legs=legs;
}
public int getLegs()
{
     return legs;
}
public int getCount()
{
     return count;
}
}
//Bird.java
package Animal.Birds;
import Animal.Animal;
public class Bird extends Animal
{
private static int count=0;
private int legs=2;
public Bird()
{
count++;
System.out.println("Create a bird");
}
}
//PackageTest.java
import Animal.Animal;
import Animal.Birds.Bird;
public class PackageTest
{
public static void main(String[] args)
{
Animal animal=new Animal();
System.out.println(animal.getLegs());
Bird bird=new Bird();
System.out.println(bird.getLegs());

}
}
运行的结果是:
--------------------Configuration: <Default>--------------------
Create a animal
4
Create a animal
Create a bird
4
----------------------------------------------------------------
既然Bird类继承自Animal类,那么就有Animal类的getLegs()这个函数,我把Bird类中的legs设成了2,
我的本意是让System.out.println(bird.getLegs());这一句打印出鸟的2条腿,结果打印的却是父类
的4条腿.明明将鸟设成了2条腿,为什么打印结果会是4条腿!难道是在调用构造函数之前先生成了成员属性?所以调用Bird的构造函数的时候先有了Bird的legs=2,然
后再调用父类的构造函数时又先有了Animal的legs=4?所以后来的legs=4将之前的Bird中的legs=2覆盖
了?就算是覆盖也应该是子类覆盖父类啊?!为什么父类反而覆盖了子类呢?本人初学java,哪位高手可以给我详细分析下其中的过程不?

解决方案 »

  1.   

    1这段代码十分晦涩,真正编程中估计不会有人这么写
    2构造函数是不能被覆盖的,儿子要出生必须先出生老子,对象构造执行顺序,最上层父类的构造函数,以此类推,最后构造自己
    3static字段和方法强烈不建议这样使用,因为static的东西都是不能覆盖的,太容易混淆
    4
    public int getLegs() {
    return legs;//省略了this.关键字,this就是自己的意思
    }
    System.out.println("Create a bird_"+this.legs);//你可以测试下这样写
    5上述代码完全违背了使用对象继承的基本思想,同时也是一段另人痛苦的程序
      

  2.   

    你调用从父类继承来的成员方法,方法体内的变量是子类隐藏的从父类继承来的legs变量。
    你要在子类重写这个方法,才是用子类定义的成员变量。
      

  3.   

    常规的应该这样:
    package animal;public abstract class Animal {
    private static int count = 0;
    protected int legs; public Animal() {
    count++;
    System.out.println("Create an animal instance using " + this.getClass() + ".");
    } public final int getLegs() {
    return this.legs;
    } public int getCount() {
    return count;
    } public static void main(String[] args) {
    Bird bird = new Bird();
    System.out.println(bird.getLegs());
    Animal dog = new Dog();
    System.out.println(dog.getLegs());
    }
    }
    package animal;public class Bird extends Animal {
    public Bird() {
    super();
    this.legs = 2;
    }
    }
    package animal;public class Dog extends Animal {
    public Dog() {
    super();
    this.legs = 4;
    }
    }
      

  4.   

    你搞一个断点就知道怎么回事了,你的bird的getlags方法没有重写,访问的是基类animal的getlags,可是基类的lags是基类的lags,所以就是4了。加上红色部分就是你想要的2了
    //Bird.java 
    package Animal.Birds; 
    import Animal.Animal; 
    public class Bird extends Animal 

    private static int count=0; 
    private int legs=2; 
    public Bird() 

    count++; 
    System.out.println("Create a bird"); 

    public int getLags(){
    return this.lags;
    }

      

  5.   

    Animal.java 中的legs是private,也就是私有的,它的子类是是改变不了父类中的这个legs 直的
    bird.java中,你又设了个legs也是private私有的,但是这个legs是bird.java私有的,并没有覆盖父类Animal中
    的legs。
    也就是说Animal类和子类bird中各有一个private legs,你只是把子类bird中的legs赋直为2,父类Animal的legs
    由于是私有的,所以并没有被覆盖,还是4,你调用getLegs()是父类的函数,当然取出的是父类animal的legs直,
    所以还是4。
      

  6.   

    解释得太棒了,我明白了,Thank you~~~~~
      

  7.   

    跟private 有什么关系 不设置private 按上面写法一样的结果,只是不设置private可以用super.legs=2;默认操作legs就是this.这是什么世道啊,楼主做人要厚道啊,尤其在这里做人大家忙活半天就这结果.
      

  8.   

    9楼的你丸权是胡扯,人家问为什么是那结果,你给人家解释一队不相关的理论,明显是蹭分的,
    跟你说的this一点关系都没有 
    如果不设置private,子类也没有同名的属性,取的就是父类的legs(default)
      

  9.   

    问题在于子类里面有同名属性你难到没看到吗,这个问题在于有同名属性时,取父类使用super,取自己的使用this,默认是this
    private只是权限上的控制
    同名是本质问题
    private是权限没有private同名一样出问题的,有private子类照样可以 this.legs super.legs请你说话放尊重点这个贴子才10分,我离下次升级需要近3000分,我觉得这个帖子有点意义才决定回复的,如果你觉得我的蹭分的那种人,你可以看我过去的帖子,我觉得论坛上的朋友帮助大家都花了心血,我在一楼写了5行文字,你见过这样蹭分的吗??既然大家花了心血,理应有所回报.
    再次鄙视下
      

  10.   

    大哥你说的好象跑题了,你觉得父类的private属性,子类可以访问吗,用super可以访问吗
      

  11.   

    我也气愤啊,大哥,刚才回个正确的程序,人家一分没给,给了那个人20分,可是我测试后,那个人的程序结果
    完全不对,1小时就结帖了。我费半天给他调个正确的程序,一分没给,人家那完全不对的给了20分
    你有我冤吗?
    听说好象csdn有好多刷分的?
    不知道,
    俺是新人