日记

今天的 Java 学习直接进入 “硬核模式”,原本以为类和对象的基础已经摸透,结果在面向对象三大特性之继承与多态上栽了大跟头,折腾了整整一下午,才算勉强摸到点门道。
上午先复习了封装,把之前写的Person类完善了一下,给私有属性name和age加上get/set方法,还加了参数校验 —— 比如年龄不能小于 0,这部分还算顺利。但一到继承,问题就来了。我想写一个Student类继承Person类,先敲了public class Student extends Person {},结果想在Student里调用Person的有参构造方法时,编译器直接报 “Implicit super constructor Person () is undefined”。
查了半天才明白,Java 中子类构造方法默认会调用父类的无参构造,如果父类只写了有参构造,没显式定义无参构造,子类就会报错。我试着在父类里补了无参构造,或者在子类构造方法第一行加super(name, age),这才解决问题。原来super关键字不仅能调父类属性方法,还能调构造器,而且必须放在第一行,这个规则记到本子上,生怕再忘。
下午的重点是多态,这绝对是今天最难啃的骨头。老师举了 “动物叫” 的例子:父类Animal有shout()方法,子类Dog重写(Override)成 “汪汪叫”,Cat重写成 “喵喵叫”。我照着写了代码,却死活理解不了 “父类引用指向子类对象”——Animal animal = new Dog(); 这行代码让我盯着屏幕看了 20 分钟。
为什么animal明明是Animal类型,调用shout()却会输出狗叫?查了资料才知道这是动态绑定,程序运行时才会确定调用的是子类的方法,而不是编译时的父类方法。为了验证,我故意在父类和子类都写了同名的普通方法和静态方法,结果发现静态方法不会被重写,父类引用调用静态方法时,还是执行父类的版本,这才分清 “重写” 和 “隐藏” 的区别

posted @ 2026-01-02 18:43  星666火  阅读(3)  评论(0)    收藏  举报