Java 继承调用超类方法

假设我有以下两个类

public class alpha {


public alpha(){
//some logic
}


public void alphaMethod1(){
//some logic
}
}


public class beta extends alpha {


public beta(){
//some logic
}


public void alphaMethod1(){
//some logic
}
}


public class Test extends beta
{
public static void main(String[] args)
{
beta obj = new beta();
obj.alphaMethod1();// Here I want to call the method from class alpha.
}
}

如果我启动一个 beta 类型的新对象,我如何执行 alpha 类中的 alphamethod1逻辑而不是 beta 类中的 alphamethod1逻辑?我可以只使用 super().alphaMethod1() <-我不知道这是否可行。

EclipseIDE 中的自动输入让我可以选择从类 alpha或类 beta中选择 alphamethod1

190240 次浏览

只需使用 super.alphaMethod1();

参见 Java 中的超级关键字

你可以这样做:

super.alphaMethod1();

注意,super是对父类的引用,但是 super()是它的构造函数。

可以使用 super 从母类调用该方法,但这意味着您可能存在设计问题。 也许 B.alphaMethod1()不应该覆盖 A 的方法,而应该被称为 B.betaMethod1()

如果它取决于具体情况,您可以放置一些代码逻辑,比如:

public void alphaMethod1(){
if (something) {
super.alphaMethod1();
return;
}
// Rest of the code for other situations
}

像这样,它只会在需要的时候调用 A 的方法,并且对于类用户来说是不可见的。

无论何时创建子类对象,该对象都具有父类的所有特性。 这里 Super ()是登录父母的工具。

如果你在那个时候写 super () ,父母的缺省构造函数就叫做。 如果你写超级的也一样。

This 关键字引用当前对象作为访问父级的超级关键字工具。

你不能通过使用 beta 对象来调用 alpha 的 alphaMethod1() ,但是你有两个解决方案:

解决方案1: 从 beta 的 alphaMethod1()调用 alpha 的 alphaMethod1()

class Beta extends Alpha
{
public void alphaMethod1()
{
super.alphaMethod1();
}
}

或者其他测试方法,比如:

class Beta extends Alpha
{
public void foo()
{
super.alphaMethod1();
}
}


class Test extends Beta
{
public static void main(String[] args)
{
Beta beta = new Beta();
beta.foo();
}
}

解决方案2 : 创建 alpha 的对象并调用 alpha 的 alphaMethod1()

class Test extends Beta
{
public static void main(String[] args)
{
Alpha alpha = new Alpha();
alpha.alphaMethod1();
}
}

答案是在这个答案的末尾,但是在你读它之前 你也应该读一下在它之前的内容


您正在尝试做的事情将通过允许跳过在重写方法中添加的可能的验证机制来破坏安全性。

现在让 想象一下我们可以从超类调用方法的版本,通过如下语法

referenceVariable.super.methodName(arguments)

如果我们有类似

class ItemBox{ //can sore all kind of Items
public void put(Item item){
//(1) code responsible for organizing items in box
}


//.. rest of code, like container for Items, etc.
}


class RedItemsBox extends ItemBox {//to store only RED items


@Override
public void put(Item item){ //store only RED items
if (item.getColor()==Color.RED){
//(2) code responsible for organizing items in box
}
}
}

正如您所看到的,RedItemsBox应该只存储 RED 项目。

不管我们使用下面哪一个

ItemBox     box = new RedItemsBox();
RedItemsBox box = new RedItemsBox();

打来的

box.put(new BlueItem());

将从 RedItemsBox调用 put方法(由于多态性)。因此,它将 正确防止 BlueItem对象被放置在 RedItemBox

但是如果我们可以使用诸如 box.super.put(new BlueItem())这样的语法会发生什么呢?

在这里(假设它是合法的) ,我们将从 ItemBox类执行 put方法的版本。
但是,该版本没有步骤负责验证项的颜色。这意味着我们可以将 任何 Item放入 RedItemBox

这种语法的存在意味着在子类中添加的验证步骤可以随时被忽略,使它们变得毫无意义。


在某些情况下,执行“原始”方法的代码是有意义的。

那个地方就是 内部重写方法内部重写方法

注意,来自 ItemBox 和 RedItemBox 的 put方法的注释 //(1) ..//(2)..非常相似。

因此,在重写方法中重用来自“原始”方法的代码是有意义的。 那个可以通过 super.methodName(arguments)调用(如从 RedItemBox 的 put内部) :

@Override
public void put(Item item){ //store only RED items
if (item.getColor()==Color.RED){
super.put(item); // <<<--- invoking code of `put` method
//        from ItemBox (supertype)
}
}

Beta obj = 新的 beta () ; 因为您已经创建了 beta 对象,所以不能直接引用 alpha 对象的 alphamethod1。 它可以被修改为

class Beta extends Alpha
{
public void alphaMethod1()
{
super.alphaMethod1();
}
}