Loading [MathJax]/jax/output/CommonHTML/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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
这应该是最全的K8s-Pod调度策略了
API Server接受客户端提交Pod对象创建请求后的操作过程中,有一个重要的步骤就是由调度器程序kube-scheduler从当前集群中选择一个可用的最佳节点来接收并运行它,通常是默认的调度器kube-scheduler负责执行此类任务。
小小科
2020/06/15
19.1K0
浅入Kubernetes(10):控制节点的部署,选择器、亲和性、污点
在前面的学习中,我们学到了 Deployment 部署,以及副本数(ReplicaSet),但是 Pod 部署到哪个 Worker 节点是随机,即使有 3个 Woker 和设定 3个 副本,不一定每个 Node 刚刚好运行一个 Pod,也可能其中 Node 运行着三个副本。
痴者工良
2021/04/26
8750
【K8S专栏】Kubernetes调度管理
在日常工作中,每个机场都有调度室,用来管理飞机应该从哪里降落,停在什么地方。在Kubernetes也有这样的调度器,主要作用就是将Pod安排到合适的节点上。
没有故事的陈师傅
2022/09/15
6650
【K8S专栏】Kubernetes调度管理
Kubernetes之调度篇
这边肯定会有其他场景也会有对pod的调度有特殊要求,这边只是列举了其中几个情况,对于上述遇到的情况我们需要怎么处理,其实k8s给我们提供了丰富的调度策略来满足我们的需求。下面我们来一一说下这些调度策略。
聂伟星
2020/08/25
1.5K0
Kubernetes 的亲和性污点与容忍
我们在使用k8s过程中经常有这样的需求:我的k8s集群有多台服务器,配置不尽相同。我想把数据库部署到CPU、内存比较好的这几台机;我想把静态承载服务部署到有固态硬盘的机器等;而这些需求,就是我们今天要讲的k8s的调度:
乔达摩@嘿
2023/03/23
7910
Kubernetes 的亲和性污点与容忍
Kubernetes 调度和驱逐
kubectl通过读取集群配置文件 ~/.kube/config 将请求发给apiserver,之后apiserver将创建pod的属性信息写入到etcd中,etcd会响应一个状态给apiserver,保存etcd成功会在控制台显示pod/<pod名称> created,之后调度组件scheduler上线,负责将新的pod分配到合适的节点上,调度之后,将结果响应给apiserver,apiserver再将结果保存到etcd中,kubelet当发现有个pod被绑定到自己的节点上时,就会调用docker的api去创建容器,容器创建之后,docekr会返回一个状态给kubelet,创建成功之后,kubelet再通知apiserver容器状态,之后apiserver再将状态写入到etcd中,之后就可以使用kubelet get pod去查看pod的状态了
匿名用户的日记
2021/12/14
7250
Kubernetes 调度和驱逐
K8s调度策略
在K8s中,调度是指将Pod放置到合适的节点上。调度器通过 K8s 的监测机制来发现集群中新创建且尚未被调度到节点上的Pod。 调度器会将所发现的每一个未调度的Pod调度到一个合适的节点上来运行。
谢公子
2023/02/27
1.1K0
K8s调度策略
8-Kubernetes入门基础之调度器与亲和性介绍
priority 选项 描述: 优先级由一系列键值对组成,键是该优先级项的名称,值是它的权重(非常重要)一般得权重越高即优先级越高,通过算法对所有的优先级项目和权重进行计算得出最终的结果; 这些优先级选项包括:
全栈工程师修炼指南
2022/09/29
7890
Kubernetes (K8S)中深入理解Pods调度
我们部署的 Pod 是通过集群的自动调度策略来选择节点的,默认情况下调度器考虑的是资源足够,并且负载尽量平均,但是有的时候我们需要能够更加细粒度的去控制 Pod 的调度,比如我们希望一些机器学习的应用只跑在有 GPU 的节点上;但是有的时候我们的服务之间交流比较频繁,又希望能够将这服务的 Pod 都调度到同一个的节点上。这就需要使用一些调度方式来控制 Pod 的调度了,主要有两个概念:亲和性和反亲和性,亲和性又分成节点亲和性(nodeAffinity)和 Pod 亲和性(podAffinity)。
王先森sec
2023/10/17
7140
Kubernetes 之集群调度
我们现在有这样一个需求,就是集群中多台服务的配置是不一致的。这就导致资源分配并不是均匀的,比如我们需要有些服务节点用来运行计算密集型的服务,而有些服务节点来运行需要大量内存的服务。而在 k8s 中当然也配置了相关服务来处理上述的问题,那就是 Scheduler。
民工哥
2021/04/21
8060
k8s 服务升级为啥 pod 会部署到我们不期望的节点上??看来你还不懂污点和容忍度
做自动化的同事今天居然问我 k8s 中为什么我部署的 pod 会跑到你们开发的节点上来?我可以去控制它吗?🧐🧐
阿兵云原生
2023/09/27
2880
k8s 服务升级为啥 pod 会部署到我们不期望的节点上??看来你还不懂污点和容忍度
图文并茂带你解读 Kube-scheduler
Hello folks,今天为大家分享一个由 ContainerLabs 出品的关于 Kubernetes Scheduler 的文章。
Luga Lee
2023/02/14
8640
图文并茂带你解读  Kube-scheduler
Kubernetes | 集群调度 - ClusterScheduling
Scheduler 是 Kubernetes 的调度器,主要的任务是把定义的 pod 分配到集群的节点上。听起来非常简单,但有很多要考虑的问题:
Zkeq
2023/05/14
4600
Kubernetes | 集群调度 - ClusterScheduling
k8s pod调度_调度方式
在默认情况下,一个Pod在哪个Node节点上运行,是由Scheduler组件采用相应的算法计算出来的,这个过程是不受人工控制的。但是在实际使用中,这并不满足需求,因为很多情况下,我们想控制某些Pod到达某些节点上,那么应该怎么做?这就要求了解kubernetes对Pod的调度规则,kubernetes提供了四大类调度方式。
全栈程序员站长
2022/09/22
9280
kubernetes高级调度的一些方式
nodeAffinity有两种,优选和必选,其为:preferredDuringSchedulingIgnoredDuringExecution和requiredDuringSchedulingIgnoredDuringExecution。
极客运维圈
2020/03/21
4190
13个鲜为人知的Kubernetes技巧
Kubernetes 具备完整的生态系统,提供了许多功能,可以显著增强容器化应用程序的管理、可伸缩性和安全性。以下是 13 个技巧,每个都详细说明了技巧解释、使用示例、上下文应用以及注意事项。
云云众生s
2024/03/28
1940
Kubernetes Pod详解
Pod中通过共享Network Namespace的方式进行网络的共享,但是如果是以下方式进行Network Namespace共享会有问题:
shysh95
2022/05/24
8300
Kubernetes Pod详解
Kubernetes中资源的管理与调度
不知道有没有小伙伴跟我一样在集群创建应用的时候没有详细计算过自己的资源配比。然后我是看到kubectl top node 一看每个节点还有很多的资源,就直接创建了几个资源配比较高的应用,而且这几个应用是高负载运行的....然后的结果就是集群中好多应用开始崩溃了......
对你无可奈何
2021/06/24
1.5K0
k8s 实践经验(五)pod 详解(2)
在讲解本章之前,我先通过一个故事,来描绘一下 k8s 中 node 和 pod 的爱恨情仇。
看、未来
2022/05/09
6710
k8s 实践经验(五)pod 详解(2)
K8s pod详解
○ 可以在根容器上设置IP地址,其它容器都共享此IP(Pod的IP),以实现Pod内部的网络通信(这里是Pod内部的通讯,Pod之间的通讯采用虚拟二层网络技术来实现,我们当前环境使用的是Flannel)。
大忽悠爱学习
2022/09/27
2.1K0
K8s pod详解
相关推荐
这应该是最全的K8s-Pod调度策略了
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档