重写/多态/类型转换/其他
重写
子类和父类拥有同名非静态(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 |