当前位置: 首页 > news >正文

无参构造器+多态+接口与抽象类

无参构造器+多态+接口与抽象类(2.2)

一、父类的无参构造器在继承关系里的作用?

1.满足子类默认构造器的隐式调用

子类中创建无参构造器时,会在第一行自动加上super(),去调用父类的无参构造器。若父类中没有无参构造器,则super()就会报错。

2.保证父类初始化流程完整

即使父类的无参构造器里什么代码都没写,JVM 也会先完成父类成员变量的默认初始化

3.支持子类对象正常实例化

当使用 new 子类()创建子类对象时,必须先触发父类构造器的执行,而父类的无参构造器就是这个执行入口。

没有这个入口,子类对象就无法被完整创建。

二、多态

1.多态性:

  • 在父类中定义的行为,被子类继承之后,表现出不同的行为。

  • 效果:同一行为在父类及其各个子类中具有不同的语义。

    引用变量既可以指向相同类型的类的对象,也可以指向该类的任何一个子类的对象。例如:Animal a = new Bird();

2.示例:

image-20260202221126239

  • 如果把子类对象赋给父类引用(将子类对象当作父类对象看待),那么就只能调用父类中已有的方法。

  • 如果子类把父类方法覆盖了,再把子类对象赋给父类引用,通过父类引用调用该方法时,调用的是子类重写之后的方法。

3.instanceof运算符:

判断对象真实类型,为向下转型做安全检查返回布尔值,避免 ClassCastException

Java编译器允许在具有直接或间接继承关系的类之间进行类型转换

image-20260202222021777

向上转型(多态):子类对象->父类引用

向下转型:父类引用->子类引用

  • 必须使用强制类型转换

  • 必须在有意义的情况下进行,即强转必须是合理的

  • 编译器对于强制类型转换采取的是一律放行的原则(只检查语义)

    例如:

    ①Bird bird = (Bird) xxx;

    无论xxx是哪种类型,编译器都不会报错。

    ②Animal animal = new Animal();
    Bird bird = (Bird)animal;

    编译无错,运行出错, ClassCastException异常

向上转型:

// 父类
class Animal {public void move() {System.out.println("动物在移动");}public void eat() {System.out.println("动物在进食");}
}// 子类
class Bird extends Animal {// 重写父类方法@Overridepublic void move() {System.out.println("鸟在飞");}// 子类独有方法public void sing() {System.out.println("鸟在唱歌");}
}public class Test {public static void main(String[] args) {// 向上转型:父类引用指向子类对象Animal a = new Bird();// 可以调用父类的方法,运行时执行子类的重写实现a.move();  // 输出:鸟在飞a.eat();   // 输出:动物在进食// 不能直接调用子类独有的方法,编译报错// a.sing();}
}

向下转型:

public class Test {public static void main(String[] args) {Animal a = new Bird(); // 先向上转型// 1. 安全检查:判断a的真实类型是不是Birdif (a instanceof Bird) {// 2. 向下转型:把父类引用转成子类引用Bird bird = (Bird) a;// 3. 可以调用子类独有的方法bird.sing(); // 输出:鸟在唱歌// 也可以调用重写的方法bird.move(); // 输出:鸟在飞}}
}

总结:

向上转型做通用,让代码适配多个子类、减少重复、降低耦合,是多态的基础;

向下转型做专属,是向上转型的补充,解锁子类独有功能,实现个性化逻辑,仅在需要使用子类独有特性时才用

三、接口与抽象类

对比维度 抽象类(Abstract Class) 接口(Interface)
定义方式 使用 abstract class 关键字定义 使用 interface 关键字定义
继承 / 实现规则 子类通过 extends 单继承(一个类只能继承一个抽象类) 类通过 implements 多实现(一个类可实现多个接口);接口通过 extends 多继承其他接口
成员变量 可包含任意权限(public/protected/ 默认 /private)的变量,变量可修改 成员变量默认是 public static final(常量),必须初始化且不可修改
成员方法 可包含:- 抽象方法(abstract 修饰,无实现)- 非抽象方法(普通方法、静态方法、final 方法等,有实现) JDK8+ 可包含:- 抽象方法(默认 public abstract,无实现)- default 方法(有实现,供实现类调用或重写)- static 方法(有实现,通过接口名调用)JDK9+ 支持 private 方法(仅接口内部使用)
构造方法 有构造方法(用于子类初始化时调用,完成抽象类成员的初始化) 无构造方法(接口不存储实例状态,无需初始化)
设计定位 体现 “is-a” 关系(子类是父类的一种),用于抽取子类的共性(包含属性 + 方法),作为子类的 “模板” 体现 “like-a” 关系(类具备接口的行为),用于定义多个类的共同行为规范,作为不同类的 “协议”
实例化方式 不能直接实例化,需通过 “子类继承并完全重写抽象方法” 后,实例化子类对象 不能直接实例化,需通过 “实现类实现并完全重写抽象方法” 后,实例化实现类对象
http://www.jsqmd.com/news/334978/

相关文章:

  • 题解:[省选联考 2020 A/B 卷] 冰火战士
  • <span class=“js_title_inner“>我让AI帮我扫端口,结果它真的会用Nmap了</span>
  • 手把手教你Jenkins+Pytest+Allure 集成测试环境
  • Git高级技巧:利用rebase和cherry-pick保持提交历史的整洁性
  • Web安全实战:XSS与CSRF攻击防护方案全解析
  • 大数据处理入门:Apache Spark核心RDD操作与性能调优
  • 前端工程化进阶:Webpack 5模块联邦原理与实践
  • Ivanti移动端点管理器遭遇两个零日漏洞攻击
  • 《引领变革!AI应用架构师打造中小学初等教育AI智能体,推动智能化教育辅助全面变革》
  • GraphQL与REST API对比:为你的项目选择合适的数据查询方案
  • 【课程设计/毕业设计】基于Java web开发的农产品销售的设计与实现/电商平台/农场品销售平台基于JavaWeb的东北特色农产品电商后台管理系统的设计与开发【附源码、数据库、万字文档】
  • 基于灰狼算法优化孪生OS-ELM的多输入回归预测附Matlab代码
  • 告别权限混乱!cpolar帮助宝塔 FTP实现远程文件管理自由
  • 即插即用系列(代码实践)| CVPR 2025 EfficientViM:基于“隐状态混合SSD”与“多阶段融合”的轻量级视觉 Mamba 新标杆
  • SSM毕设项目:基于JavaWeb的东北特色农产品电商后台管理系统的设计与开发(源码+文档,讲解、调试运行,定制等)
  • 卷积神经网络(CNN) 与SE(Squeeze-and-Excitation)注意力机制锂电池剩余寿命预测,MATLAB代码
  • Leetcode279:完全平方数
  • 基于PSO-ELM、GA-ELM、SSA-ELM、GA-SSA-ELM和ELM对比的多输入回归预测附Matlab代码
  • SSM计算机毕设之基于JAVA的机床厂车辆管理系统的设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • SSM毕设项目:基于SSM的高校共享单车管理系统设计与实现(源码+文档,讲解、调试运行,定制等)
  • Pytest fixture 及 conftest详解!
  • 基于GA优化LSSVM的应变片式力传感器温度补偿附Matlab代码
  • SSM毕设项目:基于JAVA的机床厂车辆管理系统的设计与实现(源码+文档,讲解、调试运行,定制等)
  • DevOps流水线设计:使用Jenkins与GitLab CI/CD自动化部署
  • 大数据实时处理方案对比:Flink与Spark Streaming架构选型指南
  • Rust并发编程:所有权系统与线程安全设计模式
  • 软件测试面试?太简单了 2026测试面经 (答案+思路+史上最全)
  • 【毕业设计】基于JAVA的机床厂车辆管理系统的设计与实现(源码+文档+远程调试,全bao定制等)
  • Go语言并发编程模式:从Goroutine到Channel的最佳实践
  • <span class=“js_title_inner“>让美好纪念,都触手可及!文心+飞桨携手厦门碳水时代助力AI影像实物化</span>