java - 子类的对象不能调用自己的方法

标签 java inheritance casting extends upcasting

如果c是一个ChildClass对象那么为什么它不能调用ChildClass的方法? 喜欢:

ParentClass c=new ChildClass(); //Here ChildClass extends ParentClass

特别是:

Object s=new StringBuffer();

这里sStringBuffer的对象,但是s.append(null)是编译时错误。为什么会这样?

最佳答案

编译器的工作是确保您不会调用任何与您调用它的变量不匹配的方法。为了帮助编译器完成此操作,我们为所有变量赋予一个“类型”。类型可以是原始类型(如“int”),也可以是类、枚举或接口(interface)。如果它是一个类、一个接口(interface)或一个枚举;那么编译器将允许您在该变量上使用该类、接口(interface)或枚举中列出的方法。

变量的“类型”不一定与变量引用的对象的“类”相同。在您的示例中,类型是 Object,但类是 StringBuffer。但是编译器用来检查方法调用是否正确的是类型,而不是类;因为编译器不能知道您可能使用变量引用的每个对象的类。

如果语言不以这种方式工作,那么具有类型的变量就没有任何意义。这就是 Javascript 的工作方式 - 所有内容都被声明为 var 并且没有真正的类型系统。当我们说 Java 是“静态类型”时,我们的意思是我们必须为变量指定类型,这样做可以帮助编译器保护我们免遭误用变量。

关于java - 子类的对象不能调用自己的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25696612/

相关文章:

java - 定义了 equals 和 hashCode,arrayList 方法仍然不起作用

java - 使用 transient 对象创建持久对象

java - GWT 如何使用 CSS 在面板中布局小部件

java - 使用 MVP 模式的 Android Facebook 登录实现

c++ - 未知类型名称错误

c++ - 是否有可能有一个基类方法调用所有派生类的相同(但被覆盖的方法)?

java - 设计模式处理具有许多成员的类(不是构建器)

c# - .NET - 使用 "as"显式转换与 (someType)someobject 有何不同(在内部),为什么?

java - 复制另一个 ArrayList 的 ArrayList 时抛出异常

Java 接口(interface) - 致命缺陷