面试王牌 JAVA 多态只针对方法 不针对属性
子类是永远继承父类的非私有化方法,当子类中重写父类方法时,调用的是子类的方法,没有重写时,调用的是父类中的方法
1 多态是只针对方法,而不是属性的,但是写法上,子类重写父类的属性,编译器是不会报错的
class Person{
String name = "person" ;
public void shout(){
System.out.println(name);
}
}
class Stu extends Person{
String name = "student" ;
String school = "school" ;
}
public static void main(String[] args){
Person p = new Stu();
p.shout();
}
答案是Person
若是把main方法里的 Person p = new Stu() 改成 Stu s = new Stu()
s.shout()输入什么.
输出的也是Person,因为子类Stu并没有重写父类方法shout(),所以在调用shout方法的时候,
shout方法中引用的属性都将是super.属性。至于属性继承方面,确实是覆盖了,但是在父类的方法
中并未能引用到子类的属性。(子类中可以输出父类的方法,那是因为子类,没有重写父类的方法)
老师说子类继承父类之后 子类里就有父类非私有的所有属性和方法的一份拷贝
那我的p.shout()就是调用自己本身拷贝的方法.而不是父类的那个shout()方法 是这样吗?我把题目运行了 .结果发现 老师的话把我绕进去了.....谢谢大家的解答的 .
首先,不管你是Person p = new Stu(); 还是 Stu stu = new Stu(),
结果都是输出
父类的属性值
2 也是关于属性多态的
class Person{
String name = "person";
}
class Son extends Person {
String name = "son";
}
public class Test {
public static void main(String[] args){
Person p = new Son();
System.out.println(p.name);
}
}
结果为person。
为什么不是son?
变量是静态绑定,方法是动态绑定。静态绑定就是变量本身什么类型,就用哪个里面的。例如,你的p.name的p是Person类型,那么name就是Person类中的name。而如果是动态绑定,那么会从本身类型开始向超类型查找。如果name是方法,那么用于p是Son类的一个对象,所以会从Son开始找name方法,如果找不到再到父类中找
因为Person p = new Son();
就是把子类转型为父类
子类转型为父类的规则:
-
只能调用父类的属性
-
只能调用父类未被复写的方法
-
只能调用被子类复写的方
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~