当前位置: 首页 > 知识库问答 >
问题:

为什么对子类对象有引用的父类类型引用变量不能访问子类的方法

宋鸿德
2023-03-14

既然这个对象(在标题中说明)可以调用子类中的重写方法,为什么它不能调用子类的其他方法?我需要尽可能详细的回答,比如内存组织,JVM中的内部逻辑等。

下面的代码会让你清楚地理解我的问题。

class A
{
  int x=10;
  public  A()
  {
    System.out.println("Constructor of class A called!!!");
  }

  public void sayGreetings()
  {
    System.out.println("accept hye from class A");
  }
}

class C extends A
{
  int x=30;//why this is not accessed by stated object.
  public C()
  {
    System.out.println("Constructor of Class C caled!!!");
  }
  public void sayGreetings()
  {
    System.out.println("accept hye from class C");
  }
  public void ssa()
  {
    System.out.println("Sat Sri Akal ji from class C");
  }
}

public class ParentClassTypeObject 
{
  public static void main(String[] args)
  {
    C cObj=new C();
    cObj.sayGreetings();
    cObj.ssa();
    A aCObj=new C();//this is let say stated object,main object
    aCObj.sayGreetings();/*here we invoked method will be child class's 
                         overriden method.*/
    //aCObj.ssa(); //why this line gives error

    System.out.println("x="+aCObj.x);
  }
}

共有1个答案

亢建白
2023-03-14

因为对象的接口是您在编写以下代码时选择的接口:

A aCObj = new C();

如果希望通过ACOBJ变量访问C属性,请将其声明为C

通过使其成为,您可以在以后编写以下内容:

aCObj = new A();

因此,由于变量可以指向aC,编译器限制您访问由a类型公开的接口定义的方法。

 类似资料:
  • 问题内容: 我正在向我的朋友解释OOP。我无法回答这个问题。(我有多可耻? 我只是想逃避,因为OOP描绘了现实世界。在现实世界中,父母可以容纳孩子,但孩子不能容纳父母。OOP也是如此。我知道它很愚蠢。:P 为什么此陈述无效? 因为aChild的成员是aParent成员的超集。那为什么孩子不能容纳父母。 问题答案: 正是因为aChild是aParent功能的超集。你可以写: 因为每只狐狸都是动物。但

  • 我在学习Java,同时试图理解继承。我不明白为什么子类walk()中重写的方法执行了,而另一个xyz()方法却没有执行。 我的问题是,如果下面的方法调用工作正常,并调用士兵方法walk,

  • 无法使用下面的行从子类访问方法, 假设我在子类中有一个方法,而父类中没有相同的方法。在这种情况下,我们无法使用上述代码行访问子类方法print()。但是请注意,如果我们在父类中有相同的方法,那么我们可以使用上面的代码访问它。 可能没有这样的现实生活场景,但试图理解为什么我无法访问子类使用类型为父的子对象,如果我们没有在父类中定义相同的方法。 示例代码如下: 更多解释——如果我在父类中定义了方法,那

  • 问题内容: Java中的以下代码在elipse上运行时,即使我们将其替换,也会提供相同的输出 与, 请注意,我们已经覆盖了方法。 输出为: 码: 请指出,用这两种方式创建子类对象有什么区别。并且访问方法和变量是否有任何区别?(我们的Java老师说,两种情况下访问方法和变量都不同) 同样,静态方法(例如main)会发生什么。艰难的我知道它是可继承的,但是有人可以在子类中突出它的行为吗? 问题答案:

  • 问题内容: 得知子类的类变量无法访问父类的类变量而没有特别指出父类的名称,我感到很惊讶: 为什么在定义By时我必须引用Ax,而不仅仅是x?这与我对实例变量的直觉是相反的,并且因为在定义B之后我可以引用Bx。 问题答案: 在Python中,在创建类之前,将在其自己的名称空间中执行类的主体(此后,该名称空间的成员将成为该类的成员)。因此,当解释器达到y = x + 1时,此时B类尚不存在,因此没有父类

  • 问题内容: 对象a2的类型为A,但引用了类C的对象。因此,a2应该能够访问m3()。但是,为什么不发生呢?如果在类A中定义了m3()方法,则代码可以正常运行 问题答案: 这意味着您只能访问Class的成员和Class的实现(如果有的话)。 现在m3不是的成员。清楚吗?