当父 class 似乎没有更改任何属性时,两次声明一个方法背后的目的是什么(有吗?)?
What is (is there?) a purpose behind declaring a method twice when parent class appears to not change any properties?
所以我正在查看这些各自的 classes(和子classes)...
public class Control{
public Control(){}
public Control(String name, String type, ContainerControl owner){
//do stuff here
}
}
public class ContainerControl extends Control{
public ContainerControl() { super(); }
public ContainerControl(String name, String type, ContainerControl owner)
{
super(name, type, owner);
controls = new Controls(); //exists somewhere else
}
}
public class SSTab extends ContainerControl{
public SSTab(){ super(); }
public SSTab(String name, String value, ContainerControl owner)
{
super(name, value, owner);
}
}
我对使用 super () 的无参数方法声明背后的目的感到困惑。
根据我所做的研究,我倾向于相信它们对于使用各自父 classes 的属性重载方法或覆盖是必要的。然而,当他们调用 super() 时,据我所知,它会在 super class 中找到无参数方法(再次做同样的事情),我看不出实际上可以改变什么。
作为一个拥有大量子classes 的大型项目的一部分,我不能只从每个 class 和 运行 中删除第一个方法声明,请参阅发生了什么(确定是否有目的),我似乎找不到参考来解释这些使用 super 的初始方法声明实际上在做什么。
任何帮助或链接将不胜感激!
跟进问题:
为什么SSTab不能只用CControl用参数初始化,而CControl可以用参数初始化?当存在带有参数的构造函数变量时,我看不出无参数构造函数变量是如何初始化对象的必要性的,无论如何调用 super 。
这是构造函数重载的示例 - 因为它们并不是真正的方法。
以这种方式重载构造函数允许您创建一个 Control
尚未初始化的对象,以及一个已提供名称的 Control
对象。
我假设每个 class 也公开了 public 设置必填字段的方法,但这在问题的示例代码中没有显示(可以理解,IMO)。
此外,有时在通过反射加载对象时使用无参数构造函数很有用(尽管您也可以使用反射调用带参数的构造函数)。
这是构造函数重载;构造函数不是方法。
我不确定控件的定义位置,但我很确定这是一个错字。无论如何,Super 用于调用 method/constructor 的 parent 版本。子类的构造函数中始终需要它,例如您提供的示例。可以这样想:
SSTab 是一个容器控件object;因此,为了制作 SSTab,您首先必须制作 ContainerControl。但是,CControl 是一个控件 object。因此,必须先做一个ControlObject。有点像,你的出生是因为你的 parent 出生了。他们的诞生是因为他们 parent 的诞生。
跟进回答:
我能说的(基于我对你问题的理解)是,这有点像有一定的规律可循。例如,在现实生活中,如果您没有律师,我们会为您提供一名律师。如果您调用 SSTab(param x, y z),并且您不调用超级函数(使用 params x y z),那么将为您提供默认函数(这将创建一个空的 CControl 和一个空的控件)。因为您没有在 SSTab 中定义使用另一个,它将使用默认的,这并不总是您想要做的
所以我正在查看这些各自的 classes(和子classes)...
public class Control{
public Control(){}
public Control(String name, String type, ContainerControl owner){
//do stuff here
}
}
public class ContainerControl extends Control{
public ContainerControl() { super(); }
public ContainerControl(String name, String type, ContainerControl owner)
{
super(name, type, owner);
controls = new Controls(); //exists somewhere else
}
}
public class SSTab extends ContainerControl{
public SSTab(){ super(); }
public SSTab(String name, String value, ContainerControl owner)
{
super(name, value, owner);
}
}
我对使用 super () 的无参数方法声明背后的目的感到困惑。 根据我所做的研究,我倾向于相信它们对于使用各自父 classes 的属性重载方法或覆盖是必要的。然而,当他们调用 super() 时,据我所知,它会在 super class 中找到无参数方法(再次做同样的事情),我看不出实际上可以改变什么。
作为一个拥有大量子classes 的大型项目的一部分,我不能只从每个 class 和 运行 中删除第一个方法声明,请参阅发生了什么(确定是否有目的),我似乎找不到参考来解释这些使用 super 的初始方法声明实际上在做什么。
任何帮助或链接将不胜感激!
跟进问题:
为什么SSTab不能只用CControl用参数初始化,而CControl可以用参数初始化?当存在带有参数的构造函数变量时,我看不出无参数构造函数变量是如何初始化对象的必要性的,无论如何调用 super 。
这是构造函数重载的示例 - 因为它们并不是真正的方法。
以这种方式重载构造函数允许您创建一个 Control
尚未初始化的对象,以及一个已提供名称的 Control
对象。
我假设每个 class 也公开了 public 设置必填字段的方法,但这在问题的示例代码中没有显示(可以理解,IMO)。
此外,有时在通过反射加载对象时使用无参数构造函数很有用(尽管您也可以使用反射调用带参数的构造函数)。
这是构造函数重载;构造函数不是方法。
我不确定控件的定义位置,但我很确定这是一个错字。无论如何,Super 用于调用 method/constructor 的 parent 版本。子类的构造函数中始终需要它,例如您提供的示例。可以这样想:
SSTab 是一个容器控件object;因此,为了制作 SSTab,您首先必须制作 ContainerControl。但是,CControl 是一个控件 object。因此,必须先做一个ControlObject。有点像,你的出生是因为你的 parent 出生了。他们的诞生是因为他们 parent 的诞生。
跟进回答:
我能说的(基于我对你问题的理解)是,这有点像有一定的规律可循。例如,在现实生活中,如果您没有律师,我们会为您提供一名律师。如果您调用 SSTab(param x, y z),并且您不调用超级函数(使用 params x y z),那么将为您提供默认函数(这将创建一个空的 CControl 和一个空的控件)。因为您没有在 SSTab 中定义使用另一个,它将使用默认的,这并不总是您想要做的