Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Java继承】——面向对象编程的基石

【Java继承】——面向对象编程的基石

作者头像
User_芊芊君子
发布于 2025-05-13 00:59:24
发布于 2025-05-13 00:59:24
7000
代码可运行
举报
运行总次数:0
代码可运行

【前言】

Java面向对象编程中,继承是一个非常重要的概念。它允许我们创建一个新类,这个新类可以继承现有类(称为父类或超类)的属性和方法,同时还可以添加自己特有的属性和方法。通过继承,我们可以实现代码的复用,减少重复代码,提高开发效率。本文将详细介绍Java继承的相关知识,并通过代码示例和图表进行深入讲解。

一、什么是继承?

举个例子吧,相信大家都看过西虹市首富吧,沈腾演的王多鱼通过他二爷的考验,最终继承了他二爷的财产。

1.继承的概念

继承是面向对象程序设计使代码重复利用的重要手段。 看下面两段代码,猫和狗都有名字,年龄和行为。但我们这样写就存在重复,这时候继承就体现出作用了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Cat {
    String name;
    int age;
    public void eat(){
        System.out.println("吃饭");
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Dog {
    String name;
    int age;
    public void eat(){
        System.out.println("吃饭");
    }
}

我们可以继承原有类的属性,还可以进行扩展。原有类就是父类,而我们新定义的就是子类。

Dog和Cat都继承了Animal类,其中:Animal类称为⽗类/基类或超类,Dog和Cat可以称为Animal的⼦类/派⽣类,继承之后,⼦类可以复⽤⽗类中成员,⼦类在实现时只需关⼼⾃⼰新增加的成员即可。

2.继承的语法

在Java中如果要表⽰类之间的继承关系,需要借助extends关键字,具体如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
修饰符 class ⼦类 extends ⽗类 {
// ...
}

还是用上面哪个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Animal {
    String name;
    int age;
    public void eat(){
        System.out.println("吃饭");
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Cat extends Animal {
    void show(){
        System.out.println("喵喵喵");
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Dog extends Animal {
    void show(){
        System.out.println("汪汪汪");
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Test {
    public static void main(String[] args) {
        Dog dog = new Dog();
        Cat cat = new Cat();
        System.out.println(dog.name);
        System.out.println(dog.age);
        dog.eat();
        dog.show();
    }
}

执行结果:

【注意】

  • ⼦类会将⽗类中的成员变量或者成员⽅法继承到⼦类中
  • ⼦类继承⽗类之后,必须要新添加⾃⼰特有的成员,体现出与基类的不同,否则就没有必要继承了

3.父类成员的访问

3.1 ⼦类中访问⽗类的成员变量
  • ⼦类和⽗类不存在同名成员变量
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Base {
   public int a;
   public int b;
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Derived extends Base{
    public int c;
    public void method(){
        this.a = 10;
        this.b = 20;
        this.c = 30;
    }
}

  • 成员方法没有同名的时,子类先访问自己的,其次再从父类中找,没有的话就会报错
  • 因为子类继承了父类,所以可以通过this关键字来访问
  • 成员⽅法名字相同
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Test {
    public static void main(String[] args) {
        Derived derived = new Derived();
        derived.method();
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Derived extends Base{
    public int c;
    public int a=100;
    public void method(){

        System.out.println(this.a);
        System.out.println(this.b);
        System.out.println(this.c);
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Base {
   public int a=10;
   public int b;
}

同名时,访问子类自己的,父类和子类都有一个a,父类是10,子类是100,他打印出来就是100

3.2 ⼦类中访问⽗类的成员⽅法

这里与成员变量同理,就不多做解释了

4.super关键字

当父类与子类的成员名称相同时,我们又需要在子类中访问父类的成员,这时候就要用到super关键字

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Base {
   public int a=10;
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Derived extends Base{
    public int a=100;
    public void method(){
        System.out.println(this.a);
        System.out.println(super.a);
    
    }
}

执行结果:

【总结】

  • super+点号+父类成员变量
  • super+点号+父类成员方法
  • super还可以访问父类的构造方法
  • 静态的不能访问----static
  • 静态方法中不可以使用this和super,因为静态的是不依赖对象的

5.子类构造方法

我们要构造子类对象时,需要先调用父类的构造方法,然后执行子类的构造方法,所以,需要先对父类进行构造,如下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

构造完成后,他还会报错,这时我们需要初始化自己的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public Dog(){
        super("旺财",10);
    }

如果父类构造方法没有参数,子类会自动生成不带参数的构造方法,就不会报错,但如果带参数,我们就需要自己构造,初始化 【注意事项】

  • 通过super(参数)的形式 可以调⽤⽗类指定的构造⽅法
  • super()的形式 只能出现在⼦类的构造⽅法当中且必须在第⼀⾏
  • super(…)只能在⼦类构造⽅法中出现⼀次,并且不能和this同时出现

6.super和this

【相同点】

  1. 都是Java中的关键字
  2. 只能在类的⾮静态⽅法中使⽤,⽤来访问⾮静态成员⽅法和字段
  3. 在构造⽅法中调⽤时,必须是构造⽅法中的第⼀条语句,并且不能同时存在

【不同点】

  1. this是当前对象的引⽤,当前对象即调⽤实例⽅法的对象,super相当于是⼦类对象中从⽗类继承下 来部分成员的引⽤
  2. 在⾮静态成员⽅法中,this⽤来访问本类的⽅法和属性,super⽤来访问⽗类继承下来的⽅法和属性
  3. 在构造⽅法中:this(…)⽤于调⽤本类构造⽅法,super(…)⽤于调⽤⽗类构造⽅法,两种调⽤不能 同时在构造⽅法中出现
  4. 构造⽅法中⼀定会存在super(…)的调⽤,⽤⼾没有写编译器也会增加,但是this(…)⽤⼾不写则没 有

7.继承关系上代码块的初始化顺序

这里还是举上面那个例子 父类Animal

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Animal {
    public String name;
    public int age;
    static {
        System.out.println("Animal的静态代码块 static{}");
    }
    {
        System.out.println("Animal的实例代码块{}");
    }
    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("执行Animal的2个参数的构造方法");
    }

子类Dog

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Dog extends Animal{
    static {
        System.out.println("Dog的静态代码块 static{}");
    }
    {
        System.out.println("Dog的实例代码块{}");
    }
    public Dog(String name,int age){
        super("旺财",10);
        System.out.println("Dog类带两个参数的构造方法执行了");
    }

子类Cat

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Cat extends Animal{
    static {
        System.out.println("Cat的静态代码块 static{}");
    }
    {
        System.out.println("Cat的实例代码块{}");
    }
    public Cat(){
        super("咪咪",10);
        System.out.println("Cat类带两个参数的构造方法执行了");
    }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Test {
    public static void main(String[] args) {
        Dog dog = new Dog("旺财",10);
    }
}

执行结果:

【总结】

  • 先分别执行父类和子类的静态
  • 然后是父类的实例,父类的构造
  • 最后是子类的实例,子类的构造

8.访问修饰限定符-protected 关键字

在类和对象章节中,为了实现封装特性,Java中引⼊了访问限定符,主要限定:类或者类中成员能否在类外或者其他包中被访问。

9.继承方式

  • java中不支持多继承——比如一个子类继承两个父类,这是不行的
  • 继承关系也不要超过三层A—B—C;

10.final关键字

final关键字可以⽤来修饰变量、成员⽅法以及类。 • 修饰变量或字段,表⽰常量(即不能修改)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
final int a = 10;
a = 20;//报错

• 修饰类:表⽰此类不能被继承

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
final public class Animal {
...
}
public class Bird extends Animal {
...
}

• 修饰⽅法:表⽰该⽅法不能被重写

二、继承与组合

和继承类似, 组合也是⼀种表达类之间关系的⽅式, 也是能够达到代码重⽤的效果。组合并没有涉及到特殊的语法(诸如 extends 这样的关键字), 仅仅是将⼀个类的实例作为另外⼀个类的字段。

  • 继承表⽰对象之间是is-a的关系,⽐如:狗是动物,猫是动物
  • 组合表⽰对象之间是has-a的关系,⽐如:汽⻋
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 轮胎类
class Tire{
// ...
}
// 发动机类
class Engine{
// ...
}
// ⻋载系统类
class VehicleSystem{
// ...
}
class Car{
private Tire tire;
// 可以复⽤轮胎中的属性和⽅法
private Engine engine;
// 可以复⽤发动机中的属性和⽅法
private VehicleSystem vs;
// 可以复⽤⻋载系统中的属性和⽅法
// ...
}

// 奔驰是汽⻋
class Benz extend Car{
// 将汽⻋中包含的:轮胎、发送机、⻋载系统全部继承下来
}

组合和继承都可以实现代码复⽤,应该使⽤继承还是组合,需要根据应⽤场景来选择,⼀般建议:能 ⽤组合尽量⽤组合。 【总结】

  • 继承是Java面向对象编程的核心概念之一,通过继承可以实现代码复用、提高可维护性,并为多态的实现奠定基础。在使用继承时,需要注意访问修饰符、构造方法和方法重写等细节。合理运用继承,可以让我们的代码更加简洁、灵活和易于维护。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【面向对象编程】继承
在编程中,继承可以实现代码的复用,减少重复编写代码的工作量。通过继承,子类可以继承父类的属性和方法,并且可以根据需要进行扩展和修改,提高了代码的可维护性和可扩展性。再例如现实世界的复杂性,但事物之间存在某种共性,那么程序设计就需要考虑
用户11288949
2024/09/24
1110
【面向对象编程】继承
java 语言【继承和多态】
Java中使用类对现实世界中实体来进行描述,类经过实例化之后的产物对象,则可以用来表示现实中的实体,但是 现实世界错综复杂,事物之间可能会存在一些关联,那在设计程序是就需要考虑。 比如:狗和猫,它们都是一个动物。 使用Java语言来进行描述,就会设计出:
用户11319080
2024/10/17
1190
java 语言【继承和多态】
【JavaSE】Java入门五(面向对象 2——继承)
继承机制:是面相对象程序设计实现代码复用最重要的手段,它允许程序员在保持原有结构特性的基础上进行扩展,增加新功能,从而产生新的类(派生类)。
小皮侠
2024/04/08
1340
【JavaSE】Java入门五(面向对象 2——继承)
【Java】继承、super、final、子类构造方法
Java中使用类对现实中实体进行描述,类经过实例化之后的产物对象则可以用来表示现实中的实体,但是现实世界错综复杂,事物之间可能会存在一些关联,那在设计程序时就需要考虑如何简化。
椰椰椰耶
2024/10/15
2080
【Java】继承、super、final、子类构造方法
Java面向对象三大特性
利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。 数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节, 只保留一些对外接口使之与外部发生联系。用户无需知道对象内部的细节, 但可以通过对象对外提供的接口来访问该对象。
李红
2019/06/06
4370
Java面向对象三大特性
(还在没有对象而发愁吗,new出来)->Java面向对象入门
强调的是我该怎么去做。即功能的执行过程,即先干啥,后干啥。在面向过程中,我们会写很多的函数,每一个函数负责完成某一个功能。
上分如喝水
2021/08/16
9080
(还在没有对象而发愁吗,new出来)->Java面向对象入门
Java继承
1、Base的func1和More里面的func1构成了重载,这也说明了 重载不一定要在同一个类里面
用户9996207
2023/01/13
7870
Java继承
【JAVA面向对象编程】--- 探索子类如何继承父类
(1).先帮助父类初始化(通过super(属性)),(2).再通过this.属性 = ...初始化属性。
ImAileen
2024/01/18
1540
【JAVA面向对象编程】--- 探索子类如何继承父类
JavaSE继承和多态
注:子类会将父类中的成员变量或者成员方法继承到子类中,子类可以添加自己的成员属性及方法
用户9645905
2023/04/07
3210
JavaSE继承和多态
「万字图文」史上最姨母级Java继承详解
在Java课堂中,所有老师不得不提到面向对象(Object Oriented),而在谈到面向对象的时候,又不得不提到面向对象的三大特征:封装、继承、多态。三大特征紧密联系而又有区别,本课程就带你学习Java的继承。
bigsai
2020/11/19
4400
「万字图文」史上最姨母级Java继承详解
《JavaSE》---12.<面向对象系列之(继承)>
前面我们已经讲过了类和对象,封装等知识。在此基础上,面向对象程序的三大特征封装,继承,多态。就剩下继承和多态了。本文就是为了让大家了解并熟悉什么是继承,那么我们为什么要用到继承呢?这是由于在我们定义的许许多多的类中,难免有许多类具有相似之处,例如狗类,猫类,兔子类这些类都具有相似之处。我们可以去定义一个动物类(父类)然后让这些狗类,猫类,兔子类(这些子类)去继承这个父类。得到父类已经定义好的内容,这样我们创建新的类(子类)时就不用再重新去定义这些变量了。这就被称作继承,需要满足条件子类是父类。比如狗是动物,猫是动物,那么狗和猫类就可以去继承动物类了,这将用到关键字extends。
用户11288958
2024/09/24
1170
《JavaSE》---12.<面向对象系列之(继承)>
Java-面向对象
哈喽!大家好,我是小简。今天开始学习《Java-面向对象》,此系列是我做的一个 “Java 从 0 到 1 ” 实验,给自己一年左右时间,按照我自己总结的 Java-学习路线,从 0 开始学 Java 知识,并不定期更新所学笔记,期待一年后的蜕变吧!<有同样想法的小伙伴,可以联系我一起交流学习哦!>
小简
2023/01/04
1K0
Java-面向对象
Java学习笔记——面向对象编程(核心)
面向对象是相对于面向过程而言的。面向过程,强调的是功能行为。面向对象,将功能封装进对象,强调具备了功能的对象。 面向对象更加强调运用人类在日常的思维逻辑中采用的思想方法与原则,如抽象、分类、继承、聚合、多态等。
梦飞
2022/06/23
4370
【Java 基础】三大特征之继承
在前一篇博客中,我们已经讲完了面向对象程序三大特性之一的封装,而这篇博客我们主要来讲继承,也属于面向对象程序三大特性之一。
IsLand1314
2024/10/15
1580
【Java 基础】三大特征之继承
Java面向对象三大特性(封装、继承、多态)
OOP 语言:也就是面向对象编程。 面向对象的语言有三大特性:封装、继承、多态。三大特性是面向对象编程的核心。下面就来介绍一下面向对象的三大特性。 如果想了解面向对象可以看一下这一篇博客类和对象
全栈程序员站长
2022/09/17
3510
Java面向对象三大特性(封装、继承、多态)
javase-10.继承
继承 (inheritance) 机制 :是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加新功能 ,这样产生新的类,称 派生类 。继承呈现了面向对象程序设计的层次结构, 体现了由简单到复杂的认知过程。继承主要解决的问题是:共性的抽取,实现代码复用 。
用户11369350
2024/11/19
390
javase-10.继承
【Java SE】继承和多态
Java中使用类对现实世界中实体来进行描述,类经过实例化之后的产物对象,则可以用来表示现实中的实体,但是现实世界错综复杂,事物之间可能会存在一些关联,那在设计程序是就需要考虑。我们先来看一段代码:
xxxflower
2023/04/16
3240
【Java SE】继承和多态
Java继承、final/protected说明、super/this辨析
上面的这个animal就是基类,我们的这个dog和bird都是继承这个基类的特征,使用的是extends这个关键字,表示我们的子类继承父类,父类的这个成员变量和成员方法我们子类都会拥有的;
阑梦清川
2025/02/24
940
Java继承、final/protected说明、super/this辨析
【day11】面向对象编程进阶(继承)
本文深入探讨面向对象编程的核心概念,包括继承、方法重写、this和super关键字的使用,以及抽象类和方法的定义与实现。通过本文的学习,你将能够:
程序员波特
2024/12/23
1630
【day11】面向对象编程进阶(继承)
面向对象:封装?继承?多态?
构造方法是为了创建对象而存在的,一个对象的创建肯定会执行构造方法。一般在构造方法中做初始化操作。构造方法的的特点:没有返回值,连void都不能有;方法名和类名一模一样;方法里面没有返回值(但是可以写一个单独的 return;)
阿Q说代码
2021/05/13
5770
相关推荐
【面向对象编程】继承
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验