考虑一下:
class Building {
Building() {
System.out.print("b ");
}
Building(String name) {
this();
System.out.print("bn "+name);
}
}
public class House extends Building {
House() {
System.out.print("h ");
}
House(String name) {
this();
System.out.print("hn "+name);
}
public static void main(String a[]) {
new House("x ");
}
}对于上面的程序,我认为输出一定是h hn x,但是输出是b h hn x。
为什么?
后来
public class TestDays {
public enum Days {
MON,TUE,WED
};
public static void main(String []args) {
for(Days d : Days.values())
;
Days [] d2=Days.values();
System.out.println(d2[2]);
}
}我看不懂上面的程序。请帮帮我。
class Mammal {
String name="furry";
String makeNoise() {
return "generic noise";
}
}
class Zebra extends Mammal {
String name="stripes";
String makeNoise() {
return "bray";
}
}
public class ZooKeeper {
public static void main(String args[]) {
new ZooKeeper().go();
}
void go() {
Mammal m=new Zebra();
System.out.println(m.name+m.makeNoise());
}
}在上面的程序中,makeNoise()被覆盖。因此输出必须是条纹bray。但是输出是毛茸茸的bray。
发布于 2010-07-14 10:59:06
问题1:
我以为输出一定是
x,但是输出是b h hn x。
您忽略了这样一个事实:House()构造函数隐式地调用Building的无参数构造函数。
问题2:
我看不懂上面的程序。请帮帮我。
它正在打印枚举的第三个值。空的for循环看起来有点奇怪,但我怀疑这只是一个输入错误。如果有其他你不理解的东西,你必须说出是什么。(我把读心器头盔忘在家里了……乔恩·斯基特睡着了。)
问题3:
在上面的程序中,makeNoise()被覆盖。因此输出必须是条纹bray。但是输出是毛茸茸的bray。
你看到“毛发”而不是“条纹”的原因是一个类的属性是而不是覆盖的。一个Zebra实例实际上有两个名为name的字段,您的代码绑定到一个或另一个取决于引用变量的声明类型。在本例中,声明的m类型为Mammal,因此您将获得该名称的哺乳动物版本。
发布于 2010-07-14 11:22:34
1.- b最先出现,因为下面的代码:
House() {
System.out.print("h ");
}首先调用超类no args构造函数(这是由编译器完成的),所以你应该这样想:
House() {
super();
System.out.print("h ");
}2-您正在声明一个Java enum
for循环迭代所有可能的值( MON、TUE、WED )
for(Days d : Days.values())
;但是,它不会做任何事情(参见;这意味着“什么都不做”)
然后,使用这些值创建一个数组
Days [] d2=Days.values();最后打印第三个位置( Java中的数组是从零开始的,所以0-1-2是第三个位置)
System.out.println(d2[2]);哪种方式打印WED
3.-参见Stephen C answer。您将获得超类属性。
https://stackoverflow.com/questions/3243068
复制相似问题