皇甫佳文 发表于 2025-10-1 17:30:13

day08-fire

重写/多态/类型转换/其他

重写

子类和父类拥有同名非静态(static)方法时会发生重写

父类的引用可以指向子类(和多态有关)
B类
package com.example.demo.oop.obj;

public class B {
    public void a(){
      System.out.println("B=>a()");
    }
}A类
package com.example.demo.oop.obj;

public class A extends B {
    @override//注解:有功能的注释
    public void a(){
      System.out.println("A=>a()");
    }
}Test 发生了重写了
package com.example.demo.oop.obj;

public class Demo03 {

    public void main(String[] args) {
      A a=new A();
      B b=new A();
      a.a();//A=>a()
      b.a();//A=>a()
    }
}static的进一步:类和对象

当A,B类里的同名方法是static的时候,这时候输出结果就是A=>a()和B=>a(),这是因为static是类级别的,内存加载时会直接加载在堆空间。那么谁(A或B声明)就会指向谁的方法,这时候就没有发生重写。只有当其方法为非静态方法是,即对象级别的,那么new时就根据类名来确定方法。(和下面结合一下重写理解可能会更好)
关于重写和多态的问题

这里有个问题:父类的对象可以指向子类:
这是 Java 中多态(Polymorphism) 的核心体现之一,语法上称为 “向上转型(Upcasting
本质是 “子类是父类的一种特殊形式”(比如 “狗是动物的一种”),符合 “is-a” 关系 —— 既然 Dog 属于 Animal 范畴,用 Animal 类型的变量来 “指代” Dog 对象,逻辑上完全成立
Q:A是B的子类,可以B a=new A(),但是不能A a =new B()对吧?就是可以说子像父,但是不能说父像子一样?
A:核心逻辑就是 “is-a” 关系的单向性,父类引用可以指向子类对象,子类引用不能指向父类对象
关于调用成员限制:只能调用父类中声明的成员
父类引用指向子类对象后,只能访问父类中定义的方法 / 属性,无法直接访问子类特有的方法 / 属性(除非通过 “向下转型” 强制转换类型)
简言之:父类引用能 “装” 子类对象,但只能用父类有的 “功能”。
final & static

final确保工具类/方法不被修改,而static确定了其属于对象还是类级别
**summary: ** 重写:
<ol>必须有继承关系
方法名要一致
修饰符可以扩大,但是不能缩小 private
页: [1]
查看完整版本: day08-fire