Java上行范围解析问题

Java上行范围解析问题,java,Java,我有一个基类“Shapes”和一个扩展类“Circle”。两者都有一个getName方法。 我的测试班是“司机”班 我将圆形对象向上投射为形状,并将其传递给名为polyTest的函数。 在该函数中,我想调用getName,但我不想触发getName的circle对象实现,而是希望触发基类实现 super.getName()不起作用 我的密码是贝娄 public class Driver{ public static String polyTest (Shapes s){

我有一个基类“Shapes”和一个扩展类“Circle”。两者都有一个getName方法。 我的测试班是“司机”班

我将圆形对象向上投射为形状,并将其传递给名为polyTest的函数。 在该函数中,我想调用getName,但我不想触发getName的circle对象实现,而是希望触发基类实现

super.getName()不起作用

我的密码是贝娄

public class Driver{
     public static String polyTest (Shapes s){
        return s.getName(); 
       /*Instead of s.getName()... (gives me the Circle class implementation of getName() )
       I want to call s.Shapes::GetName, the base class implementation of getName. */
     }

     public static void main(String[] args){
      Circle c = new Circle();

      //Test Basic inheritance & basic polymorphism.
      //System.out.print(c.getName());

      //Upcast test.
      Shapes s = (Shapes) c;
      System.out.print( polyTest(s) );    
     }
}

public class Circle extends Shapes{
     Circle(){
      super();
     }

     public String getName(){
      return "I am a Circle";
     }
}

public abstract class Shapes{
     Shapes (){
     }

     public String getName(){
      return "I am a Shape";
     }
}

恐怕这就是多态性Java的工作方式。您不能强制虚拟方法调用在方法本身之外非虚拟地执行(您可以调用
super.getName()
)。这样做的能力将破坏封装-例如,一个类可能会在调用超级方法之前在重写的方法中以特定的方式验证其参数。。。如果你能绕开它说“我只想调用原始实现”,那么你就违背了重写方法的初衷

您应该重新设计代码,这样就不需要调用特定的实现。多态性的要点是允许子类专门化行为,而无需调用方提前知道该实现是什么


当然,如果您想要一个方法是不可重写的,您可以将其设置为final。

恐怕多态性Java就是这样工作的。您不能强制虚拟方法调用在方法本身之外非虚拟地执行(您可以调用
super.getName()
)。这样做的能力将破坏封装-例如,一个类可能会在调用超级方法之前在重写的方法中以特定的方式验证其参数。。。如果你能绕开它说“我只想调用原始实现”,那么你就违背了重写方法的初衷

您应该重新设计代码,这样就不需要调用特定的实现。多态性的要点是允许子类专门化行为,而无需调用方提前知道该实现是什么

当然,如果希望方法不可重写,可以将其设为final

  • 您不需要向上投射
    圆形
    形状
    。(顺便问一下,为什么
    形状
    圆形
    ?)
  • 如果你不想让你的
    Circle
    类实现它自己的
    getName
    方法,就不要重写它
  • 如果您需要为其他内容重写
    getName
    方法,您可能需要将
    getnameinsemontext
    添加到
    Shapes
    类中,并在必要时在派生类中重写它
  • 您不需要向上投射
    圆形
    形状
    。(顺便问一下,为什么
    形状
    圆形
    ?)
  • 如果你不想让你的
    Circle
    类实现它自己的
    getName
    方法,就不要重写它
  • 如果您需要为其他内容重写
    getName
    方法,您可能需要将
    getnameinsemontext
    添加到
    Shapes
    类中,并在必要时在派生类中重写它

  • 看起来设计上有问题。顺便说一句,您不需要向上转换到
    形状
    。你想做什么?看起来设计有问题。顺便说一句,您不需要向上转换到
    形状
    。你想做什么?[Quote]如果你能绕开这一点说“我只想调用原始实现”,那么你就违背了首先重写该方法的全部目的。[/Quote]我不仅仅想使用基本实现,我只是想知道我是否重写了getName,是否会失去对原始实现的访问。在C++中,仅仅因为我重写并不意味着我失去了对继承的实现的访问权限。我知道我可以访问Circle src文件中的orig实现,但不能访问它之外的orig实现。。。似乎一个人被覆盖的impl卡住了。在Java中。Thx.对不起,我的回复中没有字符了。那么,在Java中确实如此吗?如果您重写,您将被重写的实现卡住?[Quote]如果您可以绕过它并说“我只想调用原始实现”,那么您将首先违反重写该方法的全部目的。[/Quote]我不仅仅想使用基本实现,我只是想知道我是否重写了getName,是否会失去对原始实现的访问。在C++中,仅仅因为我重写并不意味着我失去了对继承的实现的访问权限。我知道我可以访问Circle src文件中的orig实现,但不能访问它之外的orig实现。。。似乎一个人被覆盖的impl卡住了。在Java中。Thx.对不起,我的回复中没有字符了。那么,在Java中确实如此吗?如果您重写,您将无法使用重写的实现?1。我知道我不需要对它进行升级,我这样做是为了看看是否可以对继承的实现进行axs。oop的问题是非全能生物编写代码。。。想知道我是否失去了对基本实现的访问权。。。以防万一,我想使用旧的实现来满足意想不到的需求。我知道我不需要对它进行升级,我这样做是为了看看是否可以对继承的实现进行axs。oop的问题是非全能生物编写代码。。。想知道我是否失去了对基本实现的访问权。。。以防万一,我想使用旧的实现来满足任何意想不到的需求。