Java继承调用对象';s超类&x27;s法

Java继承调用对象';s超类&x27;s法,java,inheritance,Java,Inheritance,我有一个甲级: A - void method1 以及一个B类,它扩展了覆盖a方法1的a: B->A - void method1 稍后,我将创建一个引用为A的B实例: A a = new B(); 我想在特定情况下使用A的method1版本。有没有一种方法可以称之为: a.super.method1(); 编辑: 为了澄清任何困惑,以下是我试图实现的目标: 我有一个叫做Account的父类。下面我有3个子类,SavingsAccount、CheckingAccount和Money

我有一个甲级:

A
- void method1
以及一个B类,它扩展了覆盖a方法1的a:

B->A
- void method1
稍后,我将创建一个引用为A的B实例:

A a = new B();
我想在特定情况下使用A的method1版本。有没有一种方法可以称之为:

a.super.method1();
编辑: 为了澄清任何困惑,以下是我试图实现的目标:

我有一个叫做Account的父类。下面我有3个子类,SavingsAccount、CheckingAccount和MoneyMarketAccount

每种方法都有自己的存款/取款方法,并有与之相关的特定费用

有一个名为Bank的管理器类,其中包含Account对象的ArrayList。我有一个方法,
void transfer
,我正在尝试创建该方法,该方法允许我使用这两个帐户并在它们之间转账

有时,如果资金不足或其他错误,不同的方法会抛出异常,因此,如果两个帐户中的一个失败,我需要能够撤销交易

这就是我遇到的问题:


如果
到账户
无法接收存款,我需要重新存放从
到账户
提取的资金,但是
到账户
可能有存款费用,因此我只想调用父账户类的存款方法,因为它没有任何相关费用;然而,从我收到的评论和回答来看,我可能不得不编写另一个不被覆盖的方法,它只执行与帐户存款相同的操作。

您可以在类中使用
super
关键字。您不能在该类之外使用它们

因此,在类中,您可以执行(模拟代码)


您不能从客户端代码(即调用该方法的代码)执行此操作。只能在子类方法中执行此操作

super.method1();

并且只适用于层次结构上的一个级别。

您不能直接使用super,因为它只存在于B内部。但您可以间接使用:

public B extends A {
  public void method1() {
    // B's method 1
  }

  public void superMethod1() {
     super.method1();
  }
}
因此,如果一个类使用了一个B变量,那么他们可以调用
superMethod1()
,得到a的method1

但是说到这里,这对变量不起作用,因为您的代码当前已经设置好,不能不强制转换

i、 例如,你可以做:

B b = new B();
b.superMethod1();
但这对您的设置不起作用:

A a = new B();
// not without casting
((B)a).superMethod(); // ugh... ugly! AND dangerous!


请注意,您的问题虽然本身并不糟糕,但可能表明程序设计不好,而需要这样做的代码至少对我来说有一股糟糕的代码味道。

使用
a=new a()或者,如果您想像
aa=new B()那样,可以从B的method1调用super.method1()

是什么让这成为一个糟糕的问题?我不认为这是一个糟糕的问题。这个问题是有主题的,很容易理解。我把它投了更高的票,以补偿有人投的反对票。不是一个反对票——但这完全违背了多态性的目的。您可以在
B
@ElliottFrisch中调用
super.method1()
,因为我接收的对象是A,所以我不能调用
A.anotherMethodInB()
,因为我不知道它是B。您还需要查找方法
重载
覆盖
之间的区别。你在这个问题中的意思是方法
重写
。好的,所以根本没有办法从对象本身的外部引用对象的超类。@David没有办法在类之外使用。@David:我不知道,但这打破了各种OOP规则。它带有一种可怕的代码气味。这个需要什么???@HovercraftFullOfEels我正在为一个赋值编写一个类,这个赋值有3个帐户类型,它们都是父帐户摘要的子类。我需要能够取消交易,最简单的方法是调用超类的方法,因为它们没有任何费用或与特定帐户类型相关的其他变量更改。另外,在方法中,我将它们作为Account对象接收,而不是作为特定的accountType对象接收。@David:每个类都应该有自己的cancel方法,该方法应该处理该类的细节。既然cancel方法在类中,那么在cancel中,当然可以调用超级方法。
A a = new B();
// not without casting
((B)a).superMethod(); // ugh... ugly! AND dangerous!