JavaSE:继承和多态(上篇)

目录

一、前言

二、继承

(一)继承概念

 (二)继承的语法

(三)父类成员访问

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

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

 1.2子类和父类成员变量同名

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

(四)super关键字

(五)子类构造方法

(六)super和this

(七)代码块执行顺序

(八)final关键字

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

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

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

三、总结


一、前言

各位小伙伴们大家好,今天蜡笔小欣将继续带来大家一起去遨游Java的知识海洋世界,掌握Java中的继承。话不多说,开始我们今天的学习。

二、继承

public class Dog {
    String name;
    int age;
    float weight;
    public void eat() {
        System.out.println(name + "正在吃饭");
    }
    public void sleep() {
        System.out.println(name + "正在睡觉");
    }
    public void bark() {
        System.out.println(name + "汪汪汪");
    }
}

public class Cat{
    String name;
    int age;
    float weight;
    public void eat(){
        System.out.println(name + "正在吃饭");
    }
    public void sleep()
    {
        System.out.println(name + "正在睡觉");
    }
    public void mew(){
        System.out.println(name + "喵喵喵~~~");
    }
}

上面这个Dog类和Cat类有大量重复的部分,我们可以将这些共同点共性抽取,放在一个Animal类,进而实现代码复用。

(一)继承概念

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

 (二)继承的语法

Java 中如果要表示类之间的继承关系,需要借助 extends 关键字,具体如下:
修饰符 class 子类 extends 父类 {
// …
}

因此我们可以创建一个Animal类,将Dog类和Cat类的共同点放在Animal类里面,具体代码如下:

class Animal{
    String name;
    int age;
    float weight;
    public void eat(){
        System.out.println(name + "正在吃饭");
    }
    public void sleep(){
        System.out.println(name + "正在睡觉");
    }
}

 我们再通过继承,让Dog类和Cat类继承Animal类里面的成员变量和方法,具体修改如下:

class Animal {
    String name;
    int age;
    float weight;

    public void eat() {
        System.out.println(name + "正在吃饭");
    }

    public void sleep() {
        System.out.println(name + "正在睡觉");
    }
}

class Dog extends Animal {
    public void bark() {
        System.out.println(name + "汪汪汪");
    }
}

class Cat extends Animal {
    public void mew() {
        System.out.println(name + "喵喵喵~~~");
    }
}

Tips:

1. 子类会将父类中的成员变量或者成员方法继承到子类中,

2.子类继承父类之后,必须要新添加自己特有的成员,体现出与基类的不同,否则就没有必要继承。

(三)父类成员访问

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

1.1子类和父类不存在同名成员变量
class Base {
    int a;
    int b;
}

public class Derived extends Base {
    int c;

    public void method() {
        a = 10; // 访问从父类中继承下来的a
        b = 20; // 访问从父类中继承下来的b
        c = 30; // 访问子类自己的c
    }
}
 1.2子类和父类成员变量同名
class Base {
    int a;
    int b;
    int c;
}

public class Derived extends Base {
    int a; //与父类中成员a同名,且类型相同
    char b; //与父类中成员b同名,但类型不同

    public void method() {
        a = 100; // 访问父类继承的a,还是子类自己新增的a?
        b = 101; // 访问父类继承的b,还是子类自己新增的b?
        c = 102; // 子类没有c,访问的肯定是从父类继承下来的c
// d = 103; // 编译失败,因为父类和子类都没有定义成员变量d
    }
}
结论:
在子类方法中或者通过子类对象访问成员时
1.如果访问的成员变量子类中有,优先访问自己的成员变量。
2.如果访问的成员变量子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错。
3.如果访问的成员变量与父类中成员变量同名,则优先访问自己的。
4. 成员变量访问遵循就近原则,自己有优先自己的,如果没有则向父类中找

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

Tips:
1.成员方法没有同名时,在子类方法中或者通过子类对象访问方法时,则优先访问自己的,自己没有时,再到父类中找,如果父类中也没有则报错。

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

3.通过派生类对象访问父类与子类同名方法时,如果父类和子类同名方法的参数列表不同 ( 重载 ) ,根据调用方法适传递的参数选择合适的方法访问,如果没有则报错。

(四)super关键字

Java给我们 提供了 super 关键字,该关键字主要作用:在子类方法中访问父 类的成员。
super的三个用法:
1.super.成员变量; 访问父类普通成员变量
2.super.方法(); 访问父类普通成员方法
3.super (); 调用父类的构造方法

下面我举个例子,让大家更好地理解:

我们先定义一个父类Student类,具体代码如下:

class Student {
    public String name;
    public int age;
    public void method1(){
        System.out.println("这是学生类的method1方法");
    }
    public void method2() {
        System.out.println("这是学生类的method2方法");
    }
}

接着我们定义子类Stu继承父类Student ,在这个子类里有自己的成员变量和方法,具体代码如下:

public class Stu extends Student {
    public String name;//与父类中的成员变量同名且类型相同
    public double age;//与父类中的成员变量同名但类型不相同

    public void method1(int a) {
        System.out.println("这是Stu类中的method1方法");
    }

    public void method3() {
        name = "张三";//对于同名的成员变量,直接访问时,访问的都是子类
        age = 20;
        super.name = "李四";//访问父类的成员变量时,需要借助super关键字
        super.age = 18;//super是获取子类对象中从父类继承下来的部分

        //父类和子类中构成重载的方法
        method1();//访问父类的method1方法
        method1(10);//访问子类中带一个参数的method1方法
    }
}

使用super关键字时要注意:

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

2.在子类方法中,访问父类的成员变量和方法,
3.对于父类的private成员变量,子类会继承继承该成员变量,但不可以访问,
4.java不支持多继承,即一个类只能继承一个父类。

(五)子类构造方法

子类对象构造时,需要先调用基类构造方法,然后执行子类的构造方法。 

下面给大家演示一下:

class Student {
    public String name;
    public int age;
    public void study() {
        System.out.println("正在学习");
    }
}

我们首先定义一个父类Student,包含两个成员变量和一个成员方法。

public class Stu extends Student {
    public String gender;
}

紧接着我们再定义一个子类Stu继承自父类Student,子类中新增一个成员变量gender。

public class Stu extends Student {
    public String gender;
    public Stu() {
        this.gender = gender;
    }
}

当我们想通过构造方法在子类中给gender成员变量初始化,就必须先给基类中继承下来的成员变量初始化,然后初始化自己的成员变量。

class Student {
    public String name;
    public int age;

    public Student(String name, int age) {//父类的构造方法是带有两个参数的
        this.name = name;
        this.age = age;
    }

    public void study() {
        System.out.println("正在学习");
    }
}

public class Stu extends Student {
    public String gender;

    //子类构造方法必须带有明确的基类的参数,然后通过super关键字访问父类成员变量
    public Stu(String name, int age) {
        super(name, age);//super必须写在构造方法的第一行
        //this(name,age);//super()和this()不能同时出现
        this.gender = gender;
    }
}

当父类的构造方法带有参数,那我们需要给子类显式定义构造方法,并且在子类的构造方法中选择合适的父类构造方法进行调用,否则会编译失败。

(六)superthis

super和this的共同点:

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


super和this的不同点:

1. this是当前对象的引用,当前对象即调用实例方法的对象,super相当于是子类对象中从父类继承下来部分成员的引用

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

(七)代码块执行顺序

我们通过下面这个代码来了解继承关系上代码块的执行顺序。


class Student {
    public String name;
    public int age;

    public Student(String name, int age) {//父类的构造方法是带有两个参数的
        this.name = name;
        this.age = age;
        System.out.println("Student:构造方法执行");
    }

    {
        System.out.println("Student:实例代码块执行");
    }

    static {
        System.out.println("Student:静态代码块执行");
    }
}

class Stu extends Student {
    public Stu(String name, int age) {
        super(name, age);
        System.out.println("Stu:构造方法执行");
    }

    {
        System.out.println("Stu:实例代码块执行");
    }

    static {
        System.out.println("Stu:静态代码块执行");
    }
}

public class Test {
    public static void main(String[] args) {
        Stu student1 = new Stu("张三", 19);
        System.out.println("===========================");
        Stu student2 = new Stu("李四", 20);
    }

    public static void main1(String[] args) {
        Student student3 = new Student("王五", 10);
        System.out.println("============================");
        Student student4 = new Student("赵六", 20);
    }
}

运行结果如下:

 

Tips:

1、父类静态代码块优先于子类静态代码块执行,且是最早执行。
2、父类实例代码块和父类构造方法紧接着执行。
3、子类的实例代码块和子类构造方法紧接着再执行。
4、第二次实例化子类对象时,父类和子类的静态代码块都将不会再执行。

(八)final关键字

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

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

public class Test {
    public static void main(String[] args) {
        final int age = 18;
        age=20;//编译错误
    }
}

由于变量age被final修饰,导致变量age变为常量,修改不了。 

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

final class Person {
    public String name;
    public int age;
}
class Student extends Person {//编译错误,无法继承Person类
    public void study() {
        System.out.println("正在学习!");
    }
}

上面代码的父类Person被final修饰,导致子类Student无法继承Person,无法继承父类中的成员变量。 

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

class Person {
    public String name;
    public int age;

    final void eat() {
        System.out.println("正在吃饭!");
    }
}

class Student extends Person {//编译错误,无法继承Person类

    public void eat() {//编译错误,无法重写eat方法
        System.out.println("正在吃面包");
    }

    public void study() {
        System.out.println("正在学习!");
    }
}

 因为父类Person中的eat方法被final修饰,导致子类Student不能对eat方法进行重写,所以编译错误。

三、总结

继承允许一个类(子类)继承另一个类(父类)的属性和方法。通过继承,子类可以获得父类的属性和方法,同时还可以定义自己的属性和方法,从而实现代码的复用和扩展。继承的关键字是extends,子类通过extends关键字来继承父类。通过继承,子类可以重写父类的方法,从而实现多态性。此外,Java中只支持单继承,即一个类只能有一个直接的父类,但可以有多个间接的父类。继承可以帮助我们更好地组织和管理代码,实现代码的层次结构,使代码更加清晰和易于理解。但如果我们过度使用继承也会导致代码的耦合性增加,不利于代码的重构和扩展。

以上就是本期分享的全部内容,希望本期的内容能够对大家有所帮助,下次蜡笔小欣再跟大家分享Java中多态的知识点,感谢大家的支持与鼓励,我们下次再见!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SOA-面向服务架构

SOA-面向服务架构 1.概述2.SOA的设计原则包括:3. SOA实现方法1.Web Service2. 服务注册表3. 企业服务总线 细讲 超赞笔记 1.概述 SOA (Service-Oriented Architecture,SOA),从应用和原理的角度,目前有2种…

Ubuntu20.04 server系统部署安装(VMware上)和初始化配置

Ubuntu20.04 server部署安装(VMware上)和初始化配置 一、Ubuntu20.04 server系统部署安装上下键控制上下,可以选择配置的目标,回车表示确定,并进行下一步1.1镜像下载2.1 VMware上创建虚拟机2.2 选择语言,键…

STM32CubeIDE基础学习-HC05蓝牙模块和手机通信

STM32CubeIDE基础学习-HC05蓝牙模块和手机通信 文章目录 STM32CubeIDE基础学习-HC05蓝牙模块和手机通信前言第1章 硬件连接第2章 工程配置第3章 代码编写3.1 手机指令控制LED 第4章 实验现象总结 前言 前面的文章学习了串口通过轮询和中断的简单使用方法,现在就来用…

解密AI人工智能的整体分层架构:探索智能科技的未来之路

随着人工智能技术的迅猛发展,AI已经渗透到我们生活的方方面面。而支撑AI人工智能系统运作的核心是其整体分层架构。本文将深入探讨AI人工智能的整体分层架构,揭示其中的奥秘,探索智能科技的未来之路。 ### AI人工智能整体分层架构的重要性 …

Java:链表

一、链表简介 1、链表与顺序表的区别 上一篇博客我介绍了顺序表,这次我们来认识认识链表!先来看看二者的区别: 顺序表:由于顺序表实际上是一个数组,因此它在物理上是连续的,逻辑上也是连续的! …

uniapp怎么使用接口返回的iconfont图标

uniapp怎么使用接口返回的iconfont图标 首先在你的项目中添加该图标&#xff0c;名称要对应 实际应用 item.ICONFONT_NAME“tools”; item.ICONFONT_COLOR“FA5151”; <view class"iconfont" :class"icon-item.ICONFONT_NAME" :color"item.ICON…

Appium 三种wait方法(appium 学习之改造轮子)

学过selenium的都知道&#xff0c;一般等待元素加载有三种办法: sleep Thread.sleep&#xff08;60000&#xff09; 强制等待60simplicitlyWait driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); 隐式等待&#xff0c;全局等…

vue-ueditor-wrap上传图片报错:后端配置项没有正常加载,上传插件不能正常使用

如图所示&#xff0c;今天接收一个项目其中富文本编辑器报错 此项目为vue2项目&#xff0c;富文本编辑器为直接下载好的资源存放在public目录下的 经过排查发现报错的函数在ueditor.all.min.js文件内&#xff0c;但是ueditor.all.min.js文件夹是经过压缩的 所以直接&#xff…

Transformer论文阅读

Transformer论文阅读 摘要结论1 Introduction &#xff08;导言&#xff09;2 Background3 Model Architecture3.1 Encoder and Decoder StacksEncoderLayer NormDecoder 3.2 Attention3.2.1 Scaled Dot-Product Attention3.2.2 Scaled Dot-Product Attention3.2.3 Application…

SAP Fiori开发中的JavaScript基础知识9 - 代码注释,严格模式,JSON

1 背景 本文将介绍JavaScript编程中的三个小知识点&#xff1a;也即代码注释&#xff0c;严格模式&#xff0c;JSON文件。 2 代码注释 JavaScript的代码注释方式如下&#xff1a; // Single line comment/* Multi line comment */3 严格模式 JavaScript的"strict mod…

【Flume】尚硅谷学习笔记

实时监控目录下多个新文件 本案例是将虚拟机本地文件进行实时监控&#xff0c;并将上传的数据实时上传到HDFS中。 TAILDIR SOURCE【实现多目录监控、断点续传】 监视指定的文件&#xff0c;一旦检测到附加到每个文件的新行&#xff0c;就几乎实时地跟踪它们。如果正在写入新行…

前端学习<二>CSS基础——10-CSS3选择器详解

CSS3介绍 CSS3在CSS2基础上&#xff0c;增强或新增了许多特性&#xff0c; 弥补了CSS2的众多不足之处&#xff0c;使得Web开发变得更为高效和便捷。 CSS3的现状 浏览器支持程度不够好&#xff0c;有些需要添加私有前缀 移动端支持优于PC端 不断改进中 应用相对广泛 ### …

网络性能提升10%,ZStack Edge 云原生超融合基于第四代英特尔®至强®可扩展处理器解决方案发布

随着业务模式的逐渐转变、业务架构逐渐变得复杂&#xff0c;同时容器技术的兴起和逐渐成熟&#xff0c;使得Kubernetes、微服务等新潮技术逐步应用于业务应用系统上。 为了充分释放性能、为业务系统提供更高效的运行环境&#xff0c;ZStack Edge 云原生超融合采用了第四代英特尔…

第十四届蓝桥杯javaA组 阶乘的和

这个题我做的时候已经看出来&#xff0c;最小的m一定是最小的Ai&#xff0c;然后如果想让想让m1那么只能让最小的Ai的数量是m1的倍数因为比如说mAmin 1 那么想让m&#xff01;是 Ai阶乘和的倍数只有 nAmin&#xff01;%m&#xff01;0 然后我就不知道如何就m等于Amin2的情况了…

Spring 自定义注解 为 BeanDefinition 添加 qualifier 信息 从而约束自动装配范围

为什么写这篇文章 Spring 支持类型注入&#xff0c;并且可以通过Qualifier 或者Mate 调整类型注入的范围。但是通过自定义注解结合现有的 Qualifier 使用起来有种种困难。 将 Qualifier 融合在自定义注解中&#xff0c;在使用 AliasFor 遇到问题仅仅检查注解中的一部分内容是否…

2024年北京通信展|北京国际信息通信展览会|北京PT展

2024年北京通信展|北京国际信息通信展览会|北京PT展 2024年中国国际信息通信展览会&#xff08;PTEXPO&#xff09;&#xff0c;是由工业和信息化部主办的ICT行业盛会&#xff0c;自1990年创办以来&#xff0c;已成功举办31届&#xff0c;是反映信息通信行业发展最新成果的重要…

最小质因数 == 最大质因数,不等式秒了!

起因&#xff1a; 在洛谷做题遇到了这道题~ 一看咿呀&#xff0c;又是道数学题~ 首先我们要了解一下&#xff0c;什么是质数&#xff1f; 我记得好像有年高考题的前几题好像考了这玩意来着&#xff0c;质数的概念好像在小学学过&#xff0c;上了初中后基本都没有用过了~ 质数就…

error lsof 0.1 does not meet the minimal requirement

很多小伙伴在linux虚拟机中采用Centos 7镜像安装TitanIDE时&#xff0c;会报错如下信息 error lsof 0.1 does not meet the minimal requirement 这是因为lsof依赖版本较低&#xff0c;只需要在命令行输入 sudo yum install lsof 按下回车以后&#xff0c;命令行会弹出提示命令…

C语言例1-7:以下程序段中执行循环的次数是

代码如下&#xff1a; x-2; do { xx*x; } while(!x); 执行循环次数是&#xff1a;1 先执行后判断 代码如下&#xff1a; #include<stdio.h> int main(void) {int x;x-2;do{ xx*x; printf("\n");printf("x %d\n",x);}while(!x);return 0; } 结果…

Linux - 第三节

改变用户类型 su 仅单纯的进行身份变化 依旧处于普通用户里面 su - 进行重新登录更改身份 退出用exit / ctrld su 用户名 改成成其他身份 对一条命令进行提权 sudo command r:可读 w:可写 x:可执行 -:对应的权限位置&#xff0c;没有权限 去掉所有权限 chmod u…