java - 使用子类和超类引用访问实例方法
问题描述
这是示例代码:
package com.ankur.javapractice;
public class SuperClass {
public void someMethod(int val) {
System.out.println("Public method in SuperClass");
}
}
class SubClass extends SuperClass {
public void someMethod() {
System.out.println("Public method in SubClass");
}
public static void main(String[] args) throws InterruptedException {
SuperClass superClassRef = new SubClass();
SubClass subClassRef = new SubClass();
//superClassRef.someMethod(); // (1)
subClassRef.someMethod(8); // (2)
}
}
我理解为什么 (1)在编译时不起作用(这就是我将其注释掉的原因)。它不起作用,因为someMethod()
不知道,superClassRef
因为它是 typeSuperClass
并且SuperClass
没有定义someMethod()
。
我的问题是(2)为什么/如何在编译时工作?使用与上面相同的解释,在编译时也不someMethod(int)
知道,subClassRef
因为它是类型SubClass
并且SubClass
没有定义someMethod(int)
。
编辑和更新:
一些答案指出,SubClass
继承someMethod(int)
自SuperClass
. 这是正确的,我理解;我的后续问题是编译器如何考虑继承关系?
解决方案
是someMethod(int)
在父类中定义的SuperClass
,但是当子类使用extends
关键字继承父类时,子类继承其父类的所有公共和受保护成员并且可以直接使用它们,这称为继承
子类继承其父类的所有公共和受保护成员,无论子类在哪个包中。如果子类与其父类在同一个包中,它也继承父类的包私有成员。您可以按原样使用继承的成员、替换它们、隐藏它们或用新成员补充它们:
- 继承的方法可以直接使用。
推荐阅读
- java - 在常量池中操作字符串与在非常量池中操作字符串 - 性能
- c# - 如何编写包含项目列表的 Xamarin 表单页面,其中每个项目都可以在其中包含事务?
- c# - 如何按嵌套集合最大属性排序
- php - 将准备好的语句结果存储到 json 数组中的问题
- angular - 在 Asp.net core 2.2.1 中访问 XMLHttpRequest
- docker - 从没有网络服务器的 docker 容器中提供静态文件,由 nginx 反向代理指向
- python - 初始化和验证表单后更改 BoundField 值
- javascript - 使用 :hidden 选择器删除隐藏元素
- python-3.x - 如何在程序结束时关闭python进程
- spring - 使用 Hibernate JPA 处理工作单元的问题