JAVA系列 小白入门参考资料 继承

news2024/11/25 11:03:22

目录

1. 为什么需要继承

2. 继承的概念

3. 继承的语法

4. 父类成员访问 

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

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

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

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

1. 成员方法名字不同

2. 成员方法名字相同  

​5. super关键字

6. 子类构造方法

7. super和this  

相同点

不同点

8. 继承关系的执行顺序

9. 继承方式 

单继承

多层继承 

不同类继承同一个类 

10. final关键字


1. 为什么需要继承

Java 中使用类对现实世界中实体来进行描述,类经过实例化之后的产物对象,则可以用来表示现实中的实体,但是现实世界错综复杂,事物之间可能会存在一些关联。因此需要一些程序设计来解决这个问题。
下面通过代码来发现问题
//定义一个狗类
class Dog{
    public String name;
    public int age;
    public String color;


    public void eat() {
        System.out.println(this.name + "在吃东西");
    }

    public void run() {
        System.out.println(this.name + "在跑");
    }
}

//定义一个鸟类
class Bird{
    public String name;
    public int age;
    public String color;


    public void eat() {
        System.out.println( this.name + "在吃东西");
    }

    public void fly() {
        System.out.println( this.name + "在飞");
    }
}

public class blog {


    public static void main(String[] args) {
        Dog dog = new Dog(); //创建对象
        //初始化
        dog.name = "小灰";
        dog.age = 10;
        dog.color = "灰色";
        //调用方法
        dog.eat();
        dog.run();


        Bird bird = new Bird();
        bird.name = "小花";
        bird.age = 10;
        bird.color = "花色";
        bird.eat();
        bird.fly();


    }
}

我们可以看到Dog类和Bird类中有以下相同的成员变量和成员方法

    public String name;
    public int age;
    public String color;


    public void eat() {
        System.out.println(this.name + "在吃东西");
    }

因此 我们为了节省代码,提高代码的复用性,我们引入了继承这个概念。

2. 继承的概念

继承 (inheritance) 机制 :是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性
的基础上进行 扩展,增加新功能 ,这样产生新的类,称 派生类 。继承呈现了面向对象程序设计的层次结构, 体现了
由简单到复杂的认知过程。继承主要解决的问题是: 共性的抽取,实现代码复用

3. 继承的语法

修饰符 class 子类 extends 父类 {
      // ...
}
关键字是 extends

因为 小狗和小鸟 都是属于动物,他们有自己的年龄、颜色等等属性。也会吃东西等等相同动作,并且作为宠物都会给他们给予名字 。

因此 我们创建一个新的类(Animals) 作为父类,并将 这些相同的属性和动作作为成员变量和成员方法  放入其中。

以下代码为使用继承之后。我们可以明显的看到 代码少了很多。

并且在现实生活中我们只需要关注子类特有的属性和方法即可

class Animals{
    public String name;
    public int age;
    public String color;


    public void eat() {
        System.out.println(this.name + "在吃东西");
    }
}

class Dog extends Animals{
    public void run() {
        System.out.println(this.name + "在跑");
    }
}

class Bird extends Animals{
    public void fly() {
        System.out.println( this.name + "在飞");
    }
}

public class blog {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.name = "小灰";
        dog.age = 10;
        dog.color = "灰色";
        dog.eat();
        dog.run();

        Bird bird = new Bird();
        bird.name = "小花";
        bird.age = 10;
        bird.color = "花色";
        bird.eat();
        bird.fly();
    }
}

4. 父类成员访问 

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

        1.子类和父类不存在同名成员变量
class Father {
    public int a = 10;
    public int b = 20;
}

class Son extends Father {
    public int c = 30;
    public void Method(){
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
    }
}


public class Test {
    public static void main(String[] args) {
        Son son = new Son();
        son.Method();
    }
}

程序正常运行,并且子类可以访问父类的成员变量,并打印值。 

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

使用关键字 super

我们先来看 如果  子类和父类成员变量同名 会输出什么?

class Father {
    public int a = 10;
    public int b = 20;
}

class Son extends Father {
    public int a = 100;  // 如果子类有  先访问子类的。  子类没有的  才会去看父类是否有
    public int c = 30;   
    public void Method(){
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
    }
}


public class Test {
    public static void main(String[] args) {
        Son son = new Son();
        son.Method();
    }
}

由此我们可知,会输出子类的 同名成员变量。

那么如果我们非要访问 父类变量呢?

就是前面所提的 super 

class Father {
    public int a = 10;
    public int b = 20;
}

class Son extends Father {
    public int a = 100;
    public int c = 30;
    public void Method(){
        System.out.println(super.a);// 输出父类的 a
        System.out.println(this.a);// 谁调用 就输出谁的a 
        System.out.println(b);
        System.out.println(c);
    }
}


public class Test {
    public static void main(String[] args) {
        Son son = new Son();
        son.Method();
    }
}

在子类方法中 或者 通过子类对象访问成员时
1.如果访问的成员变量子类中有,优先访问自己的成员变量。
2.如果访问的成员变量子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错。
3.如果访问的成员变量与父类中成员变量同名,则优先访问自己的。
成员变量访问遵循就近原则,自己有优先自己的,如果没有则向父类中找

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

1. 成员方法名字不同

class Father{
    public void Func() {
        System.out.println("Func");
    }
}

class Son extends Father{
    public void Func2() {
        System.out.println("Func2");
    }

    public void Func3() {
        Func();
        Func2();
    }
}

public class Test {
    public static void main(String[] args) {
        Son son = new Son();
        son.Func3();
    }
}

2. 成员方法名字相同  

 我们在Son类中添加一个   和 Father类一模一样Func成员方法,看结果如何?

class Father{
    public void Func() {
        System.out.println("Func");
    }
}

class Son extends Father{
    public void Func() {
        System.out.println("Son::Func");
    }

    public void Func2() {
        System.out.println("Func2");
    }

    public void Func3() {
        Func();
        Func2();
    }
}

public class Test {
    public static void main(String[] args) {
        Son son = new Son();
        son.Func3();
    }
}

结果是 子类有同名方法,先调用自己的方法。 

如果想要在子类调用 父类中的同名成员方法,还是需要用到关键字super

//在此就不过多 赘写代码了 
//基于上面的代码
//这里我将最核心的代码修改部分,单提了出来
 
public void Func3() {
        this.Func();
        super.Func();
        this.Func2();
    }

5. super关键字

作用:在子类方法中访问父类的成员。

如何使用,前面代码已经展示了其作用。

注意事项:
1. 只能在非静态方法中使用
2. 在子类方法中,访问父类的成员变量和方法。 

6. 子类构造方法

父子,即先有父,后有子。所以在我们的代码中,当我们想创建子类对象时,要先调用和实现父类的构造方法,然后再实现子类构造方法 

在之前的代码中,虽然父类和子类都没有显式的定义构造方法。但其实 子类中 有隐藏的代码

public class Father {
    public Father(){
    System.out.println("Father()");
    } 
}

public class Son extends Father{
    public Son(){
    // super(); // 注意子类构造方法中默认会调用基类的无参构造方法:super(),
    // 用户没有写时,编译器会自动添加,而且super()必须是子类构造方法中第一条语句,
    // 并且只能出现一次
    System.out.println("Son()");
  }
}

下面代码是父类已经有定义好的构造方法

class Animals{
    public String name;
    public int age;
    public String color;

    //父类的构造方法
    public Animals(String name, int age, String color) {
        this.name = name;
        this.age = age;
        this.color = color;
    }

    public void eat() {
        System.out.println(this.name + "在吃东西");
    }
}

class Dog extends Animals {

    //子类的构造方法
    public Dog() {
        super("小罗",10,"白色");
    }

    public void run() {
        System.out.println(this.name + "在跑");
    }
}

class Bird extends Animals {

    //子类的构造方法
    public Bird(String name, int age, String color) {
        super(name, age, color);
    }

    public void fly() {
        System.out.println( this.name + "在飞");
    }
}


public class Blog {
    public static void main(String[] args) {
        Dog dog = new Dog();// 根据构造方法   
        //第一种初始化方式
        dog.name = "小灰";
        dog.age = 10;
        dog.color = "灰色";
        dog.eat();
        dog.run();

        Bird bird = new Bird("小辣椒",10,"红色");// 根据构造方法  //第二种初始化方法
        bird.eat();
        bird.fly();
    }
}

注意:

1. 若父类显式定义无参或者默认的构造方法,在子类构造方法第一行默认有隐含的super()调用,即调用基类构造方法
2. 如果父类构造方法是带有参数的,此时需要用户为子类显式定义构造方法,并在子类构造方法中选择合适的父类构造方法调用,否则编译失败。
3. 在子类构造方法中,super(...)调用父类构造时,必须是子类构造函数中第一条语句。
4. super(...)只能在子类构造方法中出现一次,并且不能和this同时出现

7. superthis  

super  和  this  都可以在成员方法中用来访问:成员变量和调用其他的成员函数,都可以作为构造方法的第一条语句,那他们之间有什么区别呢?

相同点

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

不同点

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

8. 继承关系的执行顺序

在之前的学习中我们知道了

1.静态代码块先执行,并且只执行一次,在类加载阶段执行

2.当有对象创建时,才会执行实例代码块,实例代码块执行完成后,最后构造方法执行

class Persons{
    String name;
    int age;

    public Persons(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("Person构造方法被调用");
    }

    {
        System.out.println("Person实例代码块被调用");
    }

    static {
        System.out.println("Person静态代码块被调用");
    }
}

class Students extends Persons{
    public Students(String name, int age) {
        super(name, age);
        System.out.println("Students构造方法被调用");
    }

    {
        System.out.println("Students实例代码块被调用");
    }

    static {
        System.out.println("Students静态代码块被调用");
    }

}

public class job {
    public static void main(String[] args) {
        Students students = new Students("小罗",18);
        Students students2 = new Students("小米",18);
    }
}

无奖竞猜:大家猜一下输出结果是什么?

通过分析执行结果,得出以下结论
1、父类静态代码块优先于子类静态代码块执行,且是最早执行
2、父类实例代码块和父类构造方法紧接着执行
3、子类的实例代码块和子类构造方法紧接着再执行
4、第二次实例化子类对象时,父类和子类的静态代码块都将不会再执行

9. 继承方式 

单继承

多层继承 

 不同类继承同一个类 

 最重要的是,不可以同一个类继承不同的类

10. final关键字

final关键可以用来修饰变量、成员方法以及类。

1.修饰变量或字段,表示常量(即不能修改)

2.修饰类:表示此类不能被继承

3.修饰方法:表示该方法不能被重写 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1633810.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用Visual Studio在CMake项目中链接第三方库(OpenCV为例)

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 为什么要链接第三方库? 提高效率:使用第三方库可以加速开发过程,因为你不需要从头开始编写所…

2024.4.25 LoadRunner 测试工具详解 —— Controller Analysis

目录 Controller 的使用 创建场景 Controller 快捷方式创建场景 VUG 针对写好脚本创建场景 场景设计 设计初始化 设计启动机制 设计性能测试脚本的执行时间 设计虚拟用户退出机制 场景运行 添加监控指标至图标格区域 Analysis 的使用 汇总报告 测试报表 吞吐量图 …

消灭AI“耗电巨兽”?暴雨服务器推出液冷节能降耗算力方案

在科技飞速发展的今天,人工智能已成为驱动未来的重要力量。随着AI及大模型技术的进一步普及和应用场景的拓宽,相关算力需求呈指数级增长,大规模的AI训练和推理过程均需消耗大量电力,如同一个巨大的电力黑洞,吞噬着海量…

线阵相机和面阵相机简介

线阵相机 线阵相机,顾名思义就是所探测的物体要在一个很长的界面上。线阵相机的传感器只有一行感光像素,所以线阵相机一般具有非常高的扫描频率和分辨率。 线阵相机特点 线阵相机使用的线扫描传感器通常只有一行感光单元(少数彩色线阵使用…

密文域可逆信息隐藏技术综述(上)

加密图像可逆信息隐藏是一种加密原始图像后,在密文图像中可逆地隐藏附加数据,并且在数据提取后,原始图像可以被无损重建的技术。RDH-EI的分类如图1所示。 按对图像的加密方法,现有RDH-EI算法可分为对称加密域和非对称(公钥)加密域…

新手向:HTML进阶

一&#xff0c;列表 列表分为有序列表&#xff0c;无序列表&#xff0c;定义列表三种 1.有序列表 ol 嵌套 li&#xff0c;ol 是有序列表&#xff0c;li 是列表条目 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8">…

结构方程模型【SEM】:非线性、非正态、交互作用及分类变量分析

张老师&#xff08;研究员&#xff09;&#xff0c;长期从事R语言结构方程模型、群落生态学、保护生物学、景观生态学和生态模型方面的研究和教学工作&#xff0c;已发表了多篇论文&#xff0c;拥有丰富的科研及实践经验。 利用结构方程模型建模往往遇到很多‘特殊’情况&…

【论文阅读】Multi-Attention Based Ultra Lightweight Image Super-Resolution

Multi-Attention Based Ultra Lightweight Image Super-Resolution 论文地址摘要1 简介2 相关工作3 建议的方法3.1 特征融合组&#xff08;FFG&#xff09;3.2 多注意力块&#xff08;MAB&#xff09; 4 Experimental Setup4.1 消融研究4.2 Comparison with Existing Methods 5…

Rust HashMap

一、HashMap是什么&#xff0c;怎么用 1、HashMap是什么 HashMap 也是 Rust 标准库中提供的集合类型&#xff0c;但是又与动态数组不同&#xff0c;HashMap 中存储的是一一映射的 KV 键值对&#xff0c;并提供了平均时间复杂度为 O(1) 的查询方法。 2、HashMap怎么用 &…

基于Sping Boot集成的websocket实现聊天室

Spring Boot整合WebSocket实现聊天室 Spring Boot 提供了 Websocket 组件 spring-boot-starter-websocket&#xff0c;用来支持在 Spring Boot环境下对Websocket 的使用。 下面我们就以多人在线聊天室为例&#xff0c;演示 Spring Boot 是如何整合Websocket 实现服务端消息推…

Github Action Bot 开发教程

Github Action Bot 开发教程 在使用 Github 时&#xff0c;你可能在一些著名的开源项目&#xff0c;例如 Kubernetes&#xff0c;Istio 中看到如下的一些评论&#xff1a; /lgtm /retest /area bug /assign xxxx ...等等&#xff0c;诸如此类的一些功能性评论。在这些评论出现…

从0开始学习制作一个微信小程序 前端学习部分(7)数据控制操作,修改、判断等

系列文章目录 本系列会从前后端的全面角度讲述制作小程序&#xff0c;从零开始学小程序&#xff0c;跟着本系列就够了&#xff01; 前端学习篇 学习篇第一篇我们讲了编译器下载&#xff0c;项目、环境建立、文件说明与简单操作&#xff1a;第一篇链接 第二、三篇分析了几个重要…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(六)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 12 - 13节&#xff09; P12《11.ArkUI组件-循环控制》 forEach() 方法的使用方式&#xff1a; 在预览界面点击红框的按钮&#xf…

KKView远程控制2.0版本发布,TeamViewer面临巨大挑战

KKView远程控制2.0版本发布&#xff0c;TeamViewer面临巨大挑战 近日&#xff0c;备受瞩目的远程控制软件KKView发布了其全新2.0版本&#xff0c;KKView以其独特的创新性和用户友好的设计&#xff0c;为远程办公、远程培训等领域提供了更加高效、便捷的解决方案。 KKView远程…

Hive 表定义主键约束

文章目录 1.建表语句2.主键约束3.主键约束的意义参考文献 1.建表语句 先看一下官方给的完整的见表语句&#xff1a; CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name -- (Note: TEMPORARY available in Hive 0.14.0 and later)[(col_name data…

助力企业部署国产云原生数据库 XSKY星辰天合与云猿生完成产品互兼容认证

近日&#xff0c;北京星辰天合科技股份有限公司&#xff08;简称&#xff1a;XSKY 星辰天合&#xff09;与杭州云猿生数据有限公司&#xff08;简称“云猿生”&#xff09;完成了产品互兼容认证&#xff0c;星辰天合企业级分布式统一数据平台 XEDP 与云猿生的开源数据库管控平台…

【银角大王——Django课程——用户表的基本操作】

Django课程——用户表的基本操作 模板的继承用户管理用户列表展示新建用户Django组件原始方法【麻烦&#xff0c;太原始】form组件modelform组件 使用modelsform组件编写添加页面 模板的继承 &#xff08;1&#xff09;先写一个页面模板————这个案例中的模板基本上就是一个…

【Spring AI】09. ETL 管道

文章目录 ETL PipelineAPI 概述入门指南ETL 接口和实现DocumentReaderJsonReaderTextReaderPagePdfDocumentReaderParagraphPdfDocumentReaderTikaDocumentReader DocumentTransformerTextSplitterTokenTextSplitterContentFormatTransformerKeywordMetadataEnricherSummaryMet…

ABAP 数据写入Excel 并保存

参考老白 https://www.cnblogs.com/liaojunbo/archive/2011/09/06/2168552.html 但是缺zcl_excel 。需要从 dotabap要引入abap2xlsx 英文版进入后 尝试了一下 1&#xff09;列的宽度自适应么有找到在哪里&#xff1f; 列宽设置 lo_worksheet->set_column_width( ip_co…

Linux第十五章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…