本来是做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.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,哪位高手可以给我详细分析下其中的过程不?
解决方案 »
- java怎么播放本地音乐
- 关于Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException的问题
- Spring+WebWork 整合问题,困扰我半天了!!
- 请教判断三角形不成立时怎么退出程序?我附上我的源程序
- double类型四舍五入取两位小数,java中程序怎样写?
- 关于java获取操作系统路径的问题
- java HelloWorld.class不行?IE不能运行Applet?
- java applet的运行条件需要什么?
- 我学了java后,接着应该学哪个编译器,如jbuiler,jdk,还是什么,
- 用java实现,类似Delphi中的控件编辑
- JAVA问题
- 关于applet中输出问题
2构造函数是不能被覆盖的,儿子要出生必须先出生老子,对象构造执行顺序,最上层父类的构造函数,以此类推,最后构造自己
3static字段和方法强烈不建议这样使用,因为static的东西都是不能覆盖的,太容易混淆
4
public int getLegs() {
return legs;//省略了this.关键字,this就是自己的意思
}
System.out.println("Create a bird_"+this.legs);//你可以测试下这样写
5上述代码完全违背了使用对象继承的基本思想,同时也是一段另人痛苦的程序
你要在子类重写这个方法,才是用子类定义的成员变量。
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;
}
}
//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;
}
}
bird.java中,你又设了个legs也是private私有的,但是这个legs是bird.java私有的,并没有覆盖父类Animal中
的legs。
也就是说Animal类和子类bird中各有一个private legs,你只是把子类bird中的legs赋直为2,父类Animal的legs
由于是私有的,所以并没有被覆盖,还是4,你调用getLegs()是父类的函数,当然取出的是父类animal的legs直,
所以还是4。
跟你说的this一点关系都没有
如果不设置private,子类也没有同名的属性,取的就是父类的legs(default)
private只是权限上的控制
同名是本质问题
private是权限没有private同名一样出问题的,有private子类照样可以 this.legs super.legs请你说话放尊重点这个贴子才10分,我离下次升级需要近3000分,我觉得这个帖子有点意义才决定回复的,如果你觉得我的蹭分的那种人,你可以看我过去的帖子,我觉得论坛上的朋友帮助大家都花了心血,我在一楼写了5行文字,你见过这样蹭分的吗??既然大家花了心血,理应有所回报.
再次鄙视下
完全不对,1小时就结帖了。我费半天给他调个正确的程序,一分没给,人家那完全不对的给了20分
你有我冤吗?
听说好象csdn有好多刷分的?
不知道,
俺是新人