【继承之extends关键字和super关键字】

简介: 【继承之extends关键字和super关键字】

继承是什么?为什么要继承?

有时候创建一些类的成员变量和方法时,会发现它们之间有共同的地方,为了减少重复的代码,提高效率,java的面向对象提出了继承,就是把共同的代码拿出来放进一个类里面,需要调用它的时候继承它就可以了。

总结:继承是一种思想,对共性进行抽取,达到代码复用的效果

怎么继承?

继承的语法 关键字extends

在Java中如果要表示类之间的继承关系,需要借助extends关键字

修饰符 class 子类 extends 父类 {

}

继承前:

class Cat {
    public String name;
    public int age;
    public void eat() {
        System.out.println(this.name + "正在吃饭");
    }
    public void miao(){
        System.out.println(this.name+"正在喵喵叫");
    }
}
class Dog{
    public String name;
    public int age;
    public void eat(){
        System.out.println(this.name+"正在吃饭");
    }
    public void bark(){
        System.out.println(this.name+"正在汪汪叫");
    }
}

继承后:

//把Cat和Dog相同的内容放到另一个类里
//因此Animal被称为父类,Cat和Dog为子类
class Animal{
    public String name;
    public int age;
    public void eat() {
        System.out.println(this.name + "正在吃饭");
    }
}
class Cat extends Animal {
    public void miao(){
        System.out.println(this.name+"正在喵喵叫");
    }
}
class Dog extends Animal{
    public void bark(){
        System.out.println(this.name+"正在汪汪叫");
    }
}

总结:

Dog和Cat都继承了Animal类,其中:Animal类称为父类/基类或超类,Dog和Cat可以称为Animal的子类/派生类,继承之后,子类可以复用父类中成员

子类中访问父类的成员变量

第一种:

1.子类和父类的成员变量不同名

第二种:

2.子类和父类成员变量同名

在子类方法中 或者 通过子类对象访问成员时:

1.当子类与父类的成员变量同名时,优先使用子类自己的

2.如果访问的成员变量 子类没有 就去访问父类的

3.如果子类和父类都没有,则编译会报错

class Base{
    public int a = 15;
    public int b = 20;
}
class Derived extends Base {
    public int a = 77;
    public void method(){
        System.out.println("a = "+a);
        System.out.println("b = "+b);
    }
}
public class Test2 {
    public static void main(String[] args) {
        Derived derived = new Derived();
        derived.method();
        //输出 a = 77  
        //     b = 20
    }
}

子类中访问父类的成员方法

1. .子类和父类的成员方法名字不同

class Base{
    public void method(){
        System.out.println("Base:method:");
    }
}
class Derived extends Base{
    public void method2(){
        System.out.println("Derived:method:");
    }
    public void tset3(){
       method();
       method2();
    }
}
public class Test2 {
    public static void main(String[] args) {
        Derived  derived = new Derived();
        derived.tset3();
        // 输出 Base:method:
              //Derived:method:
    }
}

2…子类和父类的成员方法名字相同

class Base{
    public void method(){
        System.out.println("Base:method:");
    }
}
class Derived extends Base{
    public void method2(){
        System.out.println("Derived:method:");
    }
    public void method(){
        System.out.println("Derived:method:");
    }
    public void tset3(){
       method();
       method2();
    }
}
public class Test2 {
    public static void main(String[] args) {
        Derived  derived = new Derived();
        derived.tset3();
        //输出 Derived:method:
        //     Derived:method:
    }
}

这时候说

public void method(){
        System.out.println("Derived:method:");
//和
 public void method(){
        System.out.println("Base:method:");
    }
    //构成重载了

总结:

1.通过子类对象访问父类与子类中不同名方法时,优先在子类中找,找不到去父类找,两者都找不到则编译报错。

2.通过派生类对象访问父类与子类同名方法时,优先访问子类的成员方法

super关键字(在子类中访问父类成员)

如果要在子类方法中访问父类同名成员时,Java提供了super关键字,该关键字主要作用:在子类方法中访问父类的成员

1. 访问父类的成员方法

class Base{
    public void method(){
        System.out.println("Base:method:");
    }
}
class Derived extends Base{
    public void method2(){
        System.out.println("Derived:method:");
    }
    public void method(){
        System.out.println("Derived:method:");
    }
    public void tset3(){
       super.method();
       method2();
    }
}
public class Test2 {
    public static void main(String[] args) {
        Derived  derived = new Derived();
        derived.tset3();
        //输出 Base:method:
         //   Derived:method:
    }
}

2.访问父类的成员变量

class Base{
    public int a = 15;
    public int b = 20;
}
class Derived extends Base {
    public int a = 77;
    public void method(){
        System.out.println("a = "+super.a);
        System.out.println("b = "+b);
    }
}
public class Test2 {
    public static void main(String[] args) {
        Derived derived = new Derived();
        derived.method();
    }
}

【注意事项】

  1. 只能在非静态方法中使用

总结:

在子类方法中,如果想要明确访问父类中成员时,借助super关键字即可。

总结

本章内容较容易理解,理解继承的原理,语法是修饰符 class 子类 extends 父类,子类继承父类用extends关键字,在成员名字相同时在子类中访问父类成员用supet关键字。

相关文章
|
存储 SQL JSON
Delta Lake、Hudi与Iceberg详解
Delta Lake、Hudi与Iceberg详解
1271 0
Delta Lake、Hudi与Iceberg详解
|
6月前
|
人工智能 监控 JavaScript
MCP实战之Agent自主决策-让 AI玩转贪吃蛇
MCP服务器通过提供资源、工具、提示模板三大能力,推动AI实现多轮交互与实体操作。当前生态包含Manus、OpenManus等项目,阿里等企业积极合作,Cursor等工具已集成MCP市场。本文以贪吃蛇游戏为例,演示MCP Server实现流程:客户端连接服务端获取能力集,AI调用工具(如start_game、get_state)控制游戏,通过多轮交互实现动态操作,展示MCP在本地实践中的核心机制与挑战。
692 39
MCP实战之Agent自主决策-让 AI玩转贪吃蛇
|
9月前
|
存储 人工智能 自然语言处理
2025年适用大中企业的CRM系统综合对比
在数字化转型浪潮中,CRM系统对大中型企业至关重要。本文对比了2025年适用于大中型企业的4款CRM系统:纷享销客、Salesforce、销售易和红圈CRM。从功能特点、集成拓展性、实施服务、客户评价四个维度展开分析,展现各系统优势与局限,为企业在选择CRM系统时,综合自身业务需求、预算和发展规划等因素做出决策提供参考。
|
9月前
|
人工智能
SPO来袭:Prompt工程师90%不存在了?AI自动优化时代开启!
当你点进这个标题时内心是怎样复杂的心情,质疑,鄙夷,或者是惊讶?这也正是我们最初点开这篇论文时的心情。然而, 在完成项目测试后, 我们瘫坐在椅子上, 默默打下了 'Prompt工程师,不存在' 这几个
443 0
|
存储 人工智能 语音技术
ACL 2024:引领学术视听研究,上海交大、清华大学、剑桥大学、上海AILAB联合发布学术视听数据集M3AV
【7月更文挑战第16天】在ACL 2024会议上,四校合作推出M3AV,一个涵盖367小时跨学科视频的多模态、多类型、多用途学术讲座数据集。包含语音、肢体语言、幻灯片内容,支持多任务学习,如内容识别、语音处理。高质量人工标注,尤其是命名实体,提供丰富分析机会。尽管规模大、处理复杂,且标注主观性影响可比性,M3AV仍为视听研究带来新挑战和机遇。[论文链接](https://arxiv.org/abs/2403.14168)
252 4
|
人工智能 搜索推荐 API
开源2.0|从事视频剪辑的“熬者们”,自动化剪辑工具 FunClip请收好
开源2.0|从事视频剪辑的“熬者们”,自动化剪辑工具 FunClip请收好
开源2.0|从事视频剪辑的“熬者们”,自动化剪辑工具 FunClip请收好
|
机器学习/深度学习 算法
【Deepin 20系统】机器学习分类算法模型xgboost、lightgbm、catboost安装及使用
介绍了在Deepin 20系统上使用pip命令通过清华大学镜像源安装xgboost、lightgbm和catboost三个机器学习分类算法库的过程。
455 4
|
Web App开发 JSON JavaScript
WebGL简易教程(十五):加载gltf模型
WebGL简易教程(十五):加载gltf模型
464 1
|
开发工具 git
mac git配置 idea
mac git配置 idea
346 1
|
消息中间件 存储 Java
RocketMQ下载安装、集群搭建保姆级教程
RocketMQ下载安装、集群搭建保姆级教程
599 0