什么在这里调用超类构造函数?

时间:2015-03-04 22:13:08

标签: java inheritance constructor superclass super

我在寻找考试准备问题时遇到了这段代码。 我不明白什么是调用超类构造函数 在这段代码?

输出是--->猫美洲狮cc

THL

        public class Feline{

        public String type = "f ";

        public Feline(){
            System.out.print("feline ");
        }
        }

-

    public class Cougar extends Feline {

    public Cougar(){
            System.out.print("cougar ");
    }

    public static void main(String[] args){
            new Cougar().go();                    
    }                                                                                     
    void go(){                            
            type = "c ";                                
            System.out.print(this.type + super.type);
    }
    }

3 个答案:

答案 0 :(得分:3)

如果你有一个扩展其他类的类,例如Cougar extends Feline,那么必须是对构造函数顶部的超类的调用。如果不编写一个,Java假定您打算调用默认的超类构造函数。所以你的构造函数:

public Cougar(){
    System.out.print("cougar ");
}

实际上解释为:

public Cougar(){
     super();
     System.out.print("cougar ");
}

因此调用超类构造函数。有趣的是要注意,因为所有类都是类Object的扩展,所以在你将要编写的每个构造函数的开头都调用一个超类构造函数 - 要么是一个你已经包含的显式类。或者没有参数,或者如果你没有指定默认的超类构造函数。

答案 1 :(得分:1)

在这种情况下,Java编译器将自动插入对super()的调用。我建议阅读this Java tutorial,特别是这一部分:

  

注意:如果构造函数没有显式调用超类构造函数,Java编译器会自动插入对超类的无参数构造函数的调用。如果超类没有无参数构造函数,则会出现编译时错误。对象确实有这样的构造函数,因此如果Object是唯一的超类,则没有问题。

答案 2 :(得分:0)

如果你没有包含对parent构造函数的调用,那么在当前类的第一行执行之前将调用parent(no arg)构造函数