gpt4 book ai didi

java - 调用子类构造函数的父类(super class)对象?这是如何运作的?

转载 作者:行者123 更新时间:2023-11-30 10:07:40 24 4
gpt4 key购买 nike

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();
}
}

我在学习时遇到了这段代码 static binding from geeksforgeeks .我无法理解这一行:

superclass B = new subclass();

不确定这是如何工作的。基本上,我们是在创建父类(super class)的对象并调用子类的构造函数吗?这对我来说意义不大,因为我一直看到并习惯于:A obj = new obj(); 类型对象创建。

最佳答案

在准备答案时,我发现我必须以两种不同的含义使用父类(super class)和子类这两个词。我将这些类重命名为 ThingCar,并使用“父类(super class)”和“子类”来表示一般概念。

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 的实例 [a reference to] 存储到允许 Car 实例的任何类型的变量中。那就是:

  • 一个 Car 类型的变量,
  • Car 的任何父类(super class)声明的变量(这与 Thing B 声明匹配),
  • Car 直接或间接实现的接口(interface)类型声明的变量。

那么,这行代码会发生什么

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

它创建了一个新的 Car 实例,因此当然会调用 Car 构造函数 (*1) (*2)。然后它将对该实例的引用存储在变量 B 中,它允许所有类型的 Thing 实例,只要它们继承自 Thing从而支持 Thing 对象所期望的一切。

发生了什么

    B.print();

它调用 B 引用的实例的 print() 方法。由于该实例是一个 Car 实例,您得到的是 Car.print() 结果,而不是 Thing.print()

一些补充说明:

如果 Car 有一些在 Thing 中找不到的额外方法(例如 drive() 方法),编译器将不允许您在 B 上调用它们,因为并非所有 Thing 对象都有它们,但只有一些特殊的 Thing 版本(即 Car个)。

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

(*1) 在您的情况下,构造函数未明确定义,而是由 Java 编译器自动生成。

(*2) 子类构造函数总是调用其父类(super class)的构造函数,依此类推直至 Object 构造函数,以初始化子类从其父类(super class)继承的实例的所有方面。

关于java - 调用子类构造函数的父类(super class)对象?这是如何运作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54150512/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com