![](/img/trans.png)
[英]Can someone explain to me construction of this code that uses stream();
[英]Can someone explain me this little code?
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()方法。 抱歉,这是一个非常基本的问题,但我会感谢您的帮助。
Java对象是由内而外构造的:当您说new Cougar()
,首先为该对象分配了空间,然后通过调用Feline构造函数在该空间中构造了Feline对象,最后运行了Cougar构造函数。
您可以通过super(..)
调用显式调用它来指定运行哪个 Cougar构造函数。 如果有多个,并且您想通过指定参数来选择一个,则该功能特别有用。 但是,如果您不调用一个,编译器将插入super()
调用。
至于'cc',当type = "c";
遇到,没有定义名为“ type”的局部变量。 这意味着它是一个成员变量,因此编译器将其解释为this.type = "c";
。 但是只有一个成员称为“类型”,而这个成员在Cougar中。 因此this.type
和super.type
都是同一件事,已被设置为“ c”,并且“ c”被键入两次。
您创建了两个类,其中Feline
是超类,而Cougar
是子类。 当Cougar
扩展Feline
, Cougar
继承了Feline
type
变量。
现在, Feline
具有默认的构造函数,其中会打印feline
字符串。 Cougar
还具有默认构造函数。 按照这一行new Cougar().go();
在main
方法中,您正在创建一个Cougar
的新对象,该对象将调用默认构造函数,并隐式地调用super()
来调用Feline
类的构造函数。
现在, new Cougar().go()
方法将类型设置为"c"
,这意味着将变量的值更改为super.type
和this.type
是同一副本。 因此,当您调用此方法时,它的打印方式如下:
猫科动物
美洲狮
抄送
在main()中,当您创建对象new Cougar()时,将调用构造函数public Cougar(),从而依次调用父构造函数public Feline()
因此,首先在控制台上显示Feline()的feline
,然后在控制台上显示Cougar()的cougar
。
在Java中,这通常称为“ Instance Control flow
。
然后,由于go()方法,cc在输出中显示,因为此运算符和超级运算符的“ type”变量都指向“ c”。
因此,输出为:
猫科动物//因为在实例控制流中首先调用了父构造函数。
cougar //因为在父构造函数之后调用了子构造函数。
cc //因为此实例和超级实例的类型变量都指向“ c”对象。
创建子对象时。 它会自动调用父级构造函数,因为父级需要为子级初始化。
因此,当子类构造函数被调用时,它会自动调用父默认/非参数构造函数。即o / p feline cougar
.go()更改this.type和super.type的值,并且表示相同的值。 因为类型变量是可见性是公共的,所以它也可以在子类中访问,并且在子类中没有类型为变量名的变量。
因此,完整的o / p为
猫美洲狮cc
根据您的代码:有一个称为“猫科动物”的父类和一个名为“ Cougar”的子类。 当它执行时,它首先转到父/父类(Feline)构造函数并打印:feline。
然后,它执行子类(Cougar)的构造函数并打印:cougar。
之后,它执行main方法; 在您的主要方法中,您引用的是另一个称为“ go”的方法,然后在“ go”方法中执行代码:
在其中,它将名为“ type”的变量的值覆盖为:“ C”。
因此,当您要打印类型的值时,
this.type = C和super.type = C(由于覆盖)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.