有人能解释一下这个小代码吗?

时间:2018-03-27 04:54:16

标签: java

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()方法时。对不起,如果这是一个非常基本的问题,但我将非常感谢您的帮助。

5 个答案:

答案 0 :(得分:3)

Java对象是由内而外构建的:当你说new Cougar()时,为对象分配第一个空间,然后通过调用Feline构造函数在该空间中构造一个Feline对象,最后你的Cougar构造函数是运行

您可以通过super(..)调用显式调用指定运行 Cougar构造函数的操作;如果有几个并且你想通过指定参数来选择一个,那么这个特别有用。但是如果你不调用一个,编译器将插入super()调用。

对于'cc',遇到type = "c";时,没有定义名为“type”的局部变量。这意味着它是一个成员变量,因此编译器会将其解释为this.type = "c";。但是只有一个名为“类型”的成员,那就是美洲狮。因此,this.typesuper.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(因为重写)