当前位置: 首页 > 知识库问答 >
问题:

调用子类构造函数的超类对象?那是怎么回事?

王才英
2023-03-14
public class NewClass 
{ 
    public static class superclass 
    { 
        static void print() 
        { 
            System.out.println("print in superclass."); 
        } 
    } 
    public static class subclass extends superclass 
    { 
        static void print() 
        { 
            System.out.println("print in subclass."); 
        } 
    } 

    public static void main(String[] args) 
    { 
        superclass A = new superclass(); 
        superclass B = new subclass(); //This line?
        A.print(); 
        B.print(); 
    } 
} 

共有1个答案

皮承基
2023-03-14

在准备我的答案时,我发现我不得不用两种不同含义的词超类和子类。我将把这些类重命名为thingcar,并使用“超类”和“子类”作为一般概念。

public class NewClass 
{ 
    public static class Thing
    { 
        static void print() 
        { 
            System.out.println("print in superclass."); 
        } 
    } 
    public static class Car extends Thing
    { 
        static void print() 
        { 
            System.out.println("print in subclass."); 
        } 
    } 

    public static void main(String[] args) 
    { 
        Thing A = new Thing(); 
        Thing B = new Car(); //This line?
        A.print(); 
        B.print(); 
    } 
}

表达式new Car()总是创建Car类型的实例。总是。结果是对CAR实例的引用。

现在,您可以将CAR实例的[引用]存储到允许CAR实例的任何类型的变量中。那就是:

    null
    Thing B = new Car(); //This line?

它创建一个新的CAR实例,因此当然调用CAR构造函数(*1)(*2)。然后,它将对该实例的引用存储在变量b中,该变量允许所有类型的thing实例,只要它们继承自thing,并因此支持thing对象的所有内容。

发生了什么

    B.print();

调用b引用的实例的print()方法。由于该实例是CAR实例,因此您得到的是CAR.print()结果,而不是thing.print()

我建议您习惯Java命名惯例,例如,类名总是以大写字母开头,变量总是以小写字母开头。Java人员非常习惯于这些约定,以至于我们发现阅读不遵循这些规则的代码真的很困惑。

(*1)在您的例子中,构造函数不是显式定义的,而是由Java编译器自动生成的。

(*2)子类构造函数总是调用其超类的构造函数,依此类推直到对象构造函数,以初始化子类从其超类继承的实例的所有方面。

 类似资料:
  • 问题内容: 考虑以下代码: 如果我们在超类中有一个构造函数,那么我们为子类构造的每个对象(例如,用于类调用的对象及其父对象)都将调用它。 为什么会这样? 该程序的输出为: 在超类的构造函数中 在子类的构造函数中 总和是25 在超类的构造函数中 在子类的构造函数中 总和是29 问题答案: 因为它将确保在调用构造函数时,它可以依赖于其超类中已初始化的所有字段。 请参阅此处的 3.4.4

  • 为什么第一个输出有柱线 = 空?是因为在创建类 B 之前调用了 B.foo() 吗?如果是,那么为什么可以调用 B.foo()?还是因为 B.foo() 中的字段栏试图从 A 获取柱线字段但无法访问它? 我的问题与链接的问题不同,我不是在问调用顺序,我是在问为什么第一个输出为空?另一个问题不是关于字段或空变量。 我不明白B.foo中的bar变量是如何为空的,如果它是在A和B中定义的。

  • 问题内容: 我正在尝试创建一个将字段作为参数的构造函数,然后将其放入存储在超类中的字段中。这是我正在使用的代码 在超类中,我用 我有一个访问器方法 我收到一个错误“ 味道在超类中具有私有访问权 ”,但是我认为这无关紧要,因为我正在调用将其返回到字段的访问器方法? 问题答案: 您应该做什么: 在您的超类中添加一个构造函数: 在Crisps类中: 注释 对您的问题的一些评论: “在超类中,我已经用”

  • 我见过子类的构造器方法被用于具有超类类型的变量。例如: 是类型对象还是类型?由于类inherit from,因此它的方法可能比它的超类多。实例调用这些函数是否只能存在于中,而不能存在于中?在这种情况下,和可以互换吗?例如:

  • 可能的重复: 为什么this()和super()必须是构造函数中的第一条语句? 为什么子类构造函数必须显式调用超类构造函数?这是什么原因呢?

  • 问题内容: 我有两个类,和,扩展了前一个类。 具有以下构造函数: 我将注意到所有实例变量都已设置为private。 同时,具有以下构造函数: 但是,这为我的构造函数引发了“找不到符号”错误。 我尝试使用,但是我的超类的私有范围阻止了这种情况。 我发现向我的构造函数中添加字段并允许我调用超级构造函数,但是我想知道是否存在一种无需在子类构造函数中传递其所有参数的情况下调用超级构造函数的方法? 问题答案