class Feline {
public String type = "f";
public Feline() {
System.out.println("feline");
}
}
public class Cougar extends Feline {
public Cougar() {
System.out.println("cougar");
}
void go() {
type = "c";
System.out.println(this.type + super.type);
}
public static void main(String[] args) {
new Cougar().go();
}
}
在控制台的输出中,我得到了这个:
feline
cougar
cc
我不知道为什么我得到这个输出如果我正在创建一个Cougar对象并且cougar类的构造函数没有对feline类构造函数进行超级调用,我也不明白为什么我得到“CC”调用go()方法时。对不起,如果这是一个非常基本的问题,但我将非常感谢您的帮助。
答案 0 :(得分:3)
Java对象是由内而外构建的:当你说new Cougar()
时,为对象分配第一个空间,然后通过调用Feline构造函数在该空间中构造一个Feline对象,最后你的Cougar构造函数是运行
您可以通过super(..)
调用显式调用指定运行 Cougar构造函数的操作;如果有几个并且你想通过指定参数来选择一个,那么这个特别有用。但是如果你不调用一个,编译器将插入super()
调用。
对于'cc',遇到type = "c";
时,没有定义名为“type”的局部变量。这意味着它是一个成员变量,因此编译器会将其解释为this.type = "c";
。但是只有一个名为“类型”的成员,那就是美洲狮。因此,this.type
和super.type
都是相同的东西,已设置为“c”,而“c”是两次输入。
答案 1 :(得分:0)
您创建了两个类,其中POS
是超类,Feline
是子类。当Cougar
延伸Cougar
时,Feline
会从Cougar
继承type
变量。
现在,Feline
有一个默认构造函数,其中打印了Feline
字符串。 feline
也有一个默认构造函数。根据{{1}}方法中的行Cougar
,您正在创建一个new Cougar().go();
的新对象,该对象调用默认构造函数,并且隐式地调用main
来调用构造函数Cougar
上课。
现在super()
方法将类型设置为Feline
,这意味着变量的值更改为new Cougar().go()
,"c"
是同一副本。因此,当您调用此方法时,它会以这种方式打印:
猫
美洲狮
CC
答案 2 :(得分:0)
在main()中,当你创建对象new Cougar()然后调用构造函数public Cougar(),其中inturn调用父构造函数public Feline()
因此在控制台上显示第一个传入Feline()(//strong/span[text()='the one'])[2]
的sout,然后在控制台上显示Cougar()feline
的sout。
这在java中通常称为cougar
。
然后由于go()方法而在输出中显示cc,因为此运算符和超级运算符的“type”变量指向“c”。
因此,输出是:
因为在实例控制流中首先调用父构造函数
cougar //因为在父构造函数之后调用子构造函数
cc //因为此实例和超级实例的类型变量都指向“c”对象。
答案 3 :(得分:0)
创建子对象时。它会自动调用父构造函数,因为父元素需要为子元素初始化。
因此,当调用子类构造函数时,它会自动调用父默认/非参数构造函数.i.e。 o / p猫美洲狮
和.go()正在更改this.type和super.type的值,这表示相同的值。因为类型变量是可见性是公共的,它也可以在子类中访问,并且子类中没有变量名称类型的变量。
所以,完整的o / p是
猫的美洲狮cc
答案 4 :(得分:0)
根据你的代码:有一个名为" Feline"和儿童班叫做#34; Cougar"。 当它执行时, 它首先转到父/超类(Feline)构造函数并打印:feline。
然后它执行子类(Cougar)构造函数并打印:cougar。
之后它执行main方法; 在你的main方法中,你指的是另一个名为" go"的方法, 然后在" go"内执行代码方法:
在里面它覆盖了变量的值" type" to:" C"。
所以当你要打印type的值时,
this.type = C. 和super.type = C(因为重写)