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

java初始化子类构造函数中的基类字段

鲜于德泽
2023-03-14

这是一个关于java中子类的非常基本的问题,我还是不明白……

假设我有一个超类,它有三个字段,并且只有默认的构造函数:

public class Superclass {
    public int a;
    public int b;
    public int c;
}

我想添加一个字段x。我无法更改Superclass,所以我创建了一个子类:

public class Subclass extends Superclass {
    public int x;
    public Subclass(Superclass s) {
        super();
        // what to do??
    }
}

我现在想从现有的超类对象生成Subclassobject:

Superclass s = new Superclass();
s.a = "a";
s.b = "b";
Subclass sc = new Subclass(s);
sc.x = "x";

这样我仍然可以访问sc.asc.b等。

如果不在子类的构造函数中“手动”分配所有这些字段,我如何才能最好地做到这一点?

共有3个答案

费锋
2023-03-14

我现在想从现有的超类对象生成一个子类对象

事实上不是,您将通过依赖Superclass对象的状态来实例化Subclass对象。

当你将超类作为子类构造函数的参数传递时,你只需要使用它的字段来调用超级构造函数,如果你声明它:

public Subclass(Superclass s) {
    super(s.a, s.b, s.c); // constructor  may simplify
}

或者如果你有一个没有arg的超级构造函数:

public Subclass(Superclass s) { 
    a = s.a;
    b = s.b;
    c = s.c;
}

请注意,Java强烈建议对实例字段使用私人修饰符,您应该通过公共方法访问字段。

构造函数的更简洁的方式如下所示:

public SuperClass(int a, int b, int c) {
    this.a = a;
    this.b = b;
    this.c = c;
}

public Subclass(Superclass s) {
    super(s.getA(), s.getB(), s.getC()); // constructor  may simplify
}
慕铭
2023-03-14

除了手抄,你不能。

Java不是JavaScript,其中对象是其他对象的原型,而是在Java,类是其他类的子类。

钱锐
2023-03-14

您必须为基类构造函数或子类中的变量赋值。

可以在子类中声明参数化构造函数,以将值分配给超类中的变量

class Subclass extends Superclass {
public int x;
public Subclass(int a,int b, int c,int x) {
    super();
    this.x = x;
    this.a=a;
    this.b=b;
    this.c=c;
 }
}

或者,您可以在基类和子类中声明参数化的构造函数,而不是调用< code>super(),而是调用参数化的构造函数< code>super(a,b,c)

class Superclass {
public int a;
public int b;
public int c;

public Superclass(int a, int b, int c) {
    this.a = a;
    this.b = b;
    this.c = c;
 }   
}

class Subclass extends Superclass {
public int x;

public Subclass(int a,int b, int c,int x) {
    super(a,b,c);
    this.x = x;
 }
}
 类似资料:
  • 问题内容: 我最近一直在用C#和Java进行编程,并且很好奇初始化我的类字段的最佳位置。 我应该在申报时这样做吗: 还是在构造函数中?: 我真的很好奇你们中的一些资深人士认为这是最佳做法。我要保持一致,并坚持一种方法。 问题答案: 我的规则: 不要在声明中的默认值初始化()。 如果你没有用于更改字段值的构造函数参数,则最好在声明中进行初始化。 如果字段的值由于构造函数参数而改变,则将初始化放入构造

  • 生成类对象时,其成员可以用类的构造函数初始化。构造函数是与类同名的成员函数。程序员提供的构造函数在每次生成类对象(实例化)时自动调用。构造函数可以重载.提供初始化类对象的不同方法。数据成员应在类的构造函数中初始化或在生成对象之后设置其数值。 常见编程错误 6.7 类的数据成员只能在类定义中初始化。 常见编程错误 6.8 试图声明构造函数的返回类型和返回植是个语法错误。 编程技巧 6.5 适当时候(

  • 问题内容: 我不明白原始是如何转换为char数组的。如果我尝试使用其他代码,则会引发编译错误。 问题答案: 有两个属性: 因为您位于的构造函数中,所以您有权访问其私有字段和。 您无法从String类的外部访问这些字段,因此,如果尝试执行此操作,将抛出编译错误。

  • 问题内容: 如果未将ArrayList初始化为字段,则将项目添加到ArrayList时出现NullPointerException。谁能解释为什么? 当我将ArrayList初始化为字段时起作用: 当我将ArrayList声明为字段然后在Class构造函数中对其进行初始化时,它不起作用: 问题答案: 因为构造函数中的版本正在创建一个新变量,而该变量恰好与您的成员字段名称相同,而成员字段仍未设置。这

  • 问题内容: 编译该程序时,出现错误- 错误-找不到构造函数Person()。为什么定义Person()是必要的? 问题答案: 创建时,您要同时创建一个。为了确保构造正确,编译器在构造函数中添加了一个隐式调用: 由于没有无参数构造函数,因此失败。 您可以通过以下任一方式解决它 添加对super的显式调用,如下所示: } 或通过将no-arg构造函数添加到: } 通常,编译器还会隐式添加无参数构造函数

  • 我试图从WebClient中替换RestTemplate,因为根据Java文档,RestTemple将被弃用。Spring团队建议尽可能使用WebClient。 之前的RestTempalte代码如下 我想从WebClient替换RestTemplate。所以我实现了类WebClientConnection,如下所示 我使用这个依赖项 Webclient create 上有堆栈溢出错误 如何正确地