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

30-Java 继承

Java 继承

在本教程中,我们将借助示例学习Java中的继承。

继承是OOP(面向对象编程)的重要功能之一,它使我们能够从现有类中定义一个新类。例如,

class Animal { // eat() 方法 // sleep() 方法 } class Dog extends Animal { // bark() 方法 }

在Java中,我们使用extends关键字从类继承。在这里,我们从Animal类继承了Dog类。

Animal是超类(父类或基类),而Dog是子类(子类或派生类)。 子类继承超类的字段和方法。

is-a 关系

继承是is-a关系,只有当两个类之间存在is-a关系时,我们才使用继承。

这里有些实例:

  • 汽车就是车辆。

  • 橙色是一种水果。

  • 外科医生是医生。

  • 狗是动物。

示例1:Java继承

class Animal { public void eat() { System.out.println("I can eat"); } public void sleep() { System.out.println("I can sleep"); } } class Dog extends Animal { public void bark() { System.out.println("I can bark"); } } class Main { public static void main(String[] args) { Dog dog1 = new Dog(); dog1.eat(); dog1.sleep(); dog1.bark(); } }

输出结果

I can eat I can sleep I can bark

在这里,我们从父类Animal继承了Dog的子类。 Dog类从Animal类继承了eat()和sleep()方法。

因此,Dog类的对象可以访问Dog类和Animal类的成员。

protected 关键字

我们在先前的教程中了解了private和public访问修饰符。

  • private 成员只能在类内访问

  • public 成员可以从任何地方访问

您还可以设置方法和字段为protected,受保护的成员可以访问

  • 类内部

  • 在其子类中

  • 在同一包内

这是可以访问访问修饰符的摘要。

| 修饰符 || 包 |子类|全局|
| public |Yes| Yes |Yes| Yes |
| private |Yes| No |No| No |

protectedYesYesYesNo

示例2:protected 关键字

class Animal { protected String type; private String color; public void eat() { System.out.println("I can eat"); } public void sleep() { System.out.println("I can sleep"); } public String getColor(){ return color; } public void setColor(String col){ color = col; } } class Dog extends Animal { public void displayInfo(String c){ System.out.println("I am a " + type); System.out.println("My color is " + c); } public void bark() { System.out.println("I can bark"); } } class Main { public static void main(String[] args) { Dog dog1 = new Dog(); dog1.eat(); dog1.sleep(); dog1.bark(); dog1.type = "mammal"; dog1.setColor("black"); dog1.displayInfo(dog1.getColor()); } }

输出结果

I can eat I can sleep I can bark I am a mammal My color is black

在这里,Animal类中的类型字段受到保护。我们已经从Main类访问了这个字段

dog1.type = "mammal";

这是可行的,因为Animal和Main类都在同一个包(同一个文件)中。

Java方法重写

从上面的示例中,我们知道子类的对象也可以访问其超类的方法。

如果在超类和子类中都定义了相同的方法,会发生什么情况?

好吧,在这种情况下,子类中的方法将覆盖超类中的方法。例如,

示例3:方法重写/覆盖示例

class Animal { protected String type = "animal"; public void eat() { System.out.println("I can eat"); } public void sleep() { System.out.println("I can sleep"); } } class Dog extends Animal { @Override public void eat() { System.out.println("I eat dog food"); } public void bark() { System.out.println("I can bark"); } } class Main { public static void main(String[] args) { Dog dog1 = new Dog(); dog1.eat(); dog1.sleep(); dog1.bark(); } }

输出结果

I eat dog food I can sleep I can bark

在这里,eat()同时出现在超类Animal和子类Dog中。我们创建了子类Dog的对象dog1。

当我们使用dog1对象调用eat()时,将调用Dog内部的方法,而不调用超类的相同方法。这称为方法重写。

在上面的程序中,我们使用了@Override 注释来告诉编译器我们正在重写方法。但是,这不是强制性的。

如果需要从Animal的子类调用eat()方法,则使用super关键字。

示例4:super关键字

class Animal { public Animal() { System.out.println("I am an Animal"); } public void eat() { System.out.println("I can eat"); } } class Dog extends Animal { public Dog(){ super(); System.out.println("I am a dog"); } @Override public void eat() { super.eat(); System.out.println("I eat dog food"); } public void bark() { System.out.println("I can bark"); } } class Main { public static void main(String[] args) { Dog dog1 = new Dog(); dog1.eat(); dog1.bark(); } }

输出结果

I am an Animal I am a dog I can eat I eat dog food I can bark

在这里,我们使用了super关键字通过super()来调用构造函数。 另外,我们使用super.eat()调用Animal超类的eat()方法。

注意:调用构造函数和super方法时使用的区别。

继承类型

继承有五种类型。

  • 单一继承- B类A仅从类继承。

  • 多级继承- B类从A类继承,然后C类从B类继承。

  • 分层继承- A类作为B,C和D父类。

  • 多重继承-类C从接口A和扩展B。

  • 混合继承-两种或多种继承的混合。

Java不支持通过类的多重继承和混合继承。但是,我们可以通过接口在Java中实现多重继承。我们将在后面的章节中了解接口。

为什么要使用继承?

  • 最重要的用途是代码的可重用性。父类中存在的代码无需在子类中再次编写。

  • 通过方法重写实现运行时多态。在后面的章节中,我们将学习有关多态的更多信息。

🎁 福利时间

如果你正在备战面试或者想要学习其他知识,给大家推荐一个宝藏知识库,作者整理了一些列 Java 程序员需要掌握的核心知识,有需要的自取不谢。

知识库地址:https://farerboy.com/


http://www.jsqmd.com/news/712363/

相关文章:

  • 巨人网络年营收50亿:同比增73% 扣非后净利21亿 斥资20亿理财 中东资本成第四大股东
  • PTR算法:机器人学习的自适应样本权重优化方法
  • 论文阅读:ICLR 2026 ARMOR: Aligning Secure and Safe Large Language Models via Meticulous Reasoning
  • Docker AI Toolkit 2026全栈配置实战(含LLM本地化部署避坑清单)
  • ARM MPAM内存映射寄存器架构与编程实践
  • FreeRTOS多任务编程避坑指南:为什么用了Mutex还会死锁?
  • 构建自主AI智能体服务器:从LLM规划到工具集成的工程实践
  • 大语言模型自回归生成机制与优化实践
  • 三周斩获800 Star!这个100% AI生成的开源项目,凭什么成为OpenClaw生态新宠?
  • RP2040与FPGA协同设计:Pico-Ice开发板解析
  • 基于Docker的安全网盘的设计与实现
  • 2026无人机院校低空专业共建的核心落地逻辑解析:无人机加盟合作/无人机合作/无人机培训合作/无人机学习培训/无人机招商/选择指南 - 优质品牌商家
  • 2026防爆除尘器技术全解析:焦化厂除尘设备/熔铝炉除尘器/环保除尘设备/矿山除尘器/移动卸料小车除尘设备/脉冲布袋除尘器改造/选择指南 - 优质品牌商家
  • 避坑指南:UE5 Cesium加载本地倾斜摄影,为什么你的模型总对不准位置?
  • 腾讯的跨链服务平台
  • CogVideoX-2b CSDN专用版:高清视频生成效果实测,画面流畅自然
  • RealWorldQA:真实场景智能问答系统的架构与优化
  • 高维离散视觉生成:CubiD模型的技术突破与应用
  • 5分钟快速上手:XUnity自动翻译器让外语游戏秒变中文版
  • 2026年Q2声光报警器专业生产商标杆名录及维度解析:报警主机品牌、警示灯品牌、声光报警器企业、声光报警器供应商选择指南 - 优质品牌商家
  • 【实测避坑】英文论文降AI:5大工具红黑榜与底层精修逻辑
  • 星动纪元宣布融资2亿美元:顺丰领投 红杉IDG加持
  • YOLOv5s模型改造实战:手把手教你将Neck换成BiFPN(附完整代码)
  • PrintJS打印实战:从‘缩放按钮’到‘修改源码’,我是如何一步步优化el-table打印体验的
  • 神经网络验证基准VNN-COMP的技术演进与实践解析
  • Google Mug库——一个现代的通用工具库
  • 适配您选型调研智能教育工具,部署可对接专属顾问
  • 如何高效管理ComfyUI扩展:ComfyUI Manager完整指南
  • AI与人类协作在数据科学中的效能评估与实践
  • FPGA在100GbE网络中的关键技术实现与优化