这是一个关于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??
}
}
我现在想从现有的超类
对象生成Subclass
object:
Superclass s = new Superclass();
s.a = "a";
s.b = "b";
Subclass sc = new Subclass(s);
sc.x = "x";
这样我仍然可以访问sc.a
,sc.b
等。
如果不在子类的构造函数中“手动”分配所有这些字段,我如何才能最好地做到这一点?
我现在想从现有的超类对象生成一个子类对象
事实上不是,您将通过依赖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
}
除了手抄,你不能。
Java不是JavaScript,其中对象是其他对象的原型,而是在Java,类是其他类的子类。
您必须为基类构造函数或子类中的变量赋值。
可以在子类中声明参数化构造函数,以将值分配给超类中的变量
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 上有堆栈溢出错误 如何正确地