Java面向对象的三大特性之一——继承

目录

一、继承概念

二、为什么要继承

三、继承语法(关键字extends)

四、父类成员访问

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

        (1)子类和父类不存在同名的成员变量

        (2)子类和父类中存在同名的成员变量

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

        (1)子类和父类不存在同名的成员方法

        (2)子类和父类中存在同名的成员方法

五、了解super关键字

六、子类构造方法

七、super和this关键字区分

八、继承方式

九、final关键字


一、继承概念

        继承是什么呢?继承的出现时为什么呢?主要解决的问题是什么呢?

        在现实生活中,在一个人离世后,孩子需要继承父亲所留下来的东西,而在Java也是如此,子类继承父类所留下来的东西,这就是继承。

       那出现的原因和主要解决的问题呢?很简单,对于每一个类,我们都需要写成员变量成员方法,那么如果它们的成员变量和成员方法都一样,我们真的要一个一个去写吗?这是一个很重要的问题,对于这个问题,在Java里面提供一种解决方法,那就是写一个派生类,里面写出它们的共有的方法和成员变量,而其他方法只需要继承这个这个类就行,这样就实现共性的抽取,实现代码的复用,这样就可以大大提高写代码的效率。我举个例,比如老师和学生都是人类,而人类都有名字,年龄,都会吃饭,那么我们就将者共性的内容进行抽取,然后采用继承的思想来达到共用。

        而上面这个图也是老师和学生类继承人类这个派生类。

二、为什么要继承

        对于为什么要继承,我在第一点说明白了,而这里就是一个小总结, 继承出现最重要的原因就是为了提高程序员编写代码的效率,通过创建一个共性——派生类,其他类通过继承这个派生类使用里面的共性,从而达到提高编写代码效率的效果。

三、继承语法(关键字extends)

        对于继承的语法,我们需要使用到关键字extends。

        语法格式是:

        修饰符 class 子类 extends 父类{

                //...

        }

        举个例子,以上面的老师学生和人类为例子。

        

public class Person {
    String name;//共有的属性那么
    int age;//共有的属性age
    public void eat(){//共有的方法eat()
        System.out.println(this.name+"正在吃饭");
    }
}

public class Student extends Person{
    int sno;
    String sclass;
}

public class Teacher extends Person{
    int sno;
    String sclass;
}

        对于Student和Teacher来说,name和age这俩个变量是继承父类的,可以使用,而如何使用呢?看下面代码:

        

public class test {
    public static void main(String[] args) {
        Student stu=new Student();
        stu.name="zhangsan1";
        stu.eat();

        Teacher th=new Teacher();
        th.name="lisi";
        th.eat();
    }
}

        运行结果如下:

        这样看的话会更加明白,使用方法也是和之前一样。

四、父类成员访问

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

        (1)子类和父类不存在同名的成员变量

        

public class Date011 {
    int year1=2000;
    int month1=12;
    int day1=01;
}

public class Date012 extends Date011{
    int year=2020;
    int month=01;
    int day=30;
}

public static void main(String[] args) {
        Date012 date012=new Date012();
        System.out.println(date012.day);
        System.out.println(date012.year1);
        System.out.println(date012.month1);
        System.out.println(date012.day1);

    }

        打印结果如下:

·         

        在父类和子类都不同名的情况下,可以直接引用父类的成员变量。

        (2)子类和父类中存在同名的成员变量

        

public class Date011 {
    int year=2000;
    int month=12;
    int day=01;
}

public class Date012 extends Date011{
    int year=2020;
    int month=01;
    int day=30;
}

public static void main(String[] args) {
        Date012 date012=new Date012();
        System.out.println(date012.day);
}

        打印结果如下:

        在父类和子类的成员变量名一样是,优先使用子类。

        总结:(1)如果访问的成员变量子类中的话,优先访问自己的成员变量。

                   (2)如果访问的成员变量子类中没有的话,先访问父类继承下来的,如果父类中也没                              有定义,那就会编译报错。

                   (3)如果访问的成员变量与父类中成员变量同名,则优先访问自己的。

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

        (1)子类和父类不存在同名的成员方法

        

public class Date011 {
    public void FuNvJie(){
        System.out.println("三月八号");
    }
}
public class Date012 extends Date011{
    public void FuNvJie1() {
        System.out.println("每年的三月八号");
    }
}
public static void main(String[] args) {
    Date012 date012=new Date012();
    date012.FuNvJie1();
    date012.FuNvJie();
}

        打印结果如下:

         

         如果成员方法名字在当前类有的话,优先使用当前类,如果当前类没有父类有的话,那么就使用父类的成员方法,如果都没有,则会报错。

        (2)子类和父类中存在同名的成员方法

public class Date011 {
    public void FuNvJie(){
        System.out.println("三月八号");
    }
}
public class Date012 extends Date011{
    public void FuNvJie() {
        System.out.println("每年的三月八号");
    }
}
public static void main(String[] args) {
    Date012 date012=new Date012();
    date012.FuNvJie();
}

        打印结果如下:

         如果子类和父类出现成员方法都同名的时候,那么会实现方法重写,就会优先使用子类

五、了解super关键字

        对于super关键字是什么呢?我们前面讲到过this关键字的使用,this.属性名的方法指代的是当前对象的属性名,this()的方法是指代当前对象的构造对象,总的来说,this关键字就是用来指代当前对象,而super关键字则是访问父类的成员,提供super方法就是为了能够在子类更好的调用父类成员。那么具体该如何操作呢?观察以下代码:

        

public class Animal {
    String name;
    int age;
    public Animal(String name,int age){
        this.name=name;
        this.age=age;
        System.out.println(name+"已经"+age+"岁了");
    }
}

public class Cat extends Animal{
    public Cat(){
        super("咪咪",2);//调用父类构造方法
        super.age=10;//调用父类成员
    }
}

public class Dog extends Animal{
    public Dog(){
        super("旺财",10);//调用父类构造方法
    }
}

public static void main(String[] args) {
    Dog dog=new Dog();
    Cat cat=new Cat();
}

        打印结果如下:

        

        我们发现,可以在子类中调用父类中的构造方法,只需要使用super关键字就能做到,但是只能在子类方法中才能做到。

六、子类构造方法

        在子类构造方法中,是先执行基类的,然后再执行子类的方法,以下面代码为例。

        

public class Animal {
    String name;
    int age;
    int a=10;
    int b=20;
    public Animal(){//父类方法
        System.out.println("Animal");
    }
}

public class Dog extends Animal{
    public Dog(){//子类方法
        //super()如果没有调用super关键字,那么会默认调用super关键字。
        System.out.println("Dog");
    }
}

public class Test {
    public static void main(String[] args) {
        Dog dog=new Dog();//调用的时候,先执行父类,后执行子类。
    }
}

        打印结果如下:

        在子类构造方法中,并没有写任何关于基类构造的代码,但在佛营造子类对象的时候,先执行基类的构造方法,然后执行子类的构造方法。因为:子类对象中成员是由俩部分组成的,父类继承下来的以及子类增加的部分。而在构造子类对象的时候,先要调用父类的构造方法,然后再调用子类自己的构造方法,从而将自己的成员初始化完整。

七、super和this关键字区分

        super和this关键字我们到现在都有着一定的认识,那么它们都有什么共同点呢?

        相同点:

        (1)都是Java关键字;

        (2)只能再类的非静态方法中使用,用来访问非静态成员方法和字段

        (3)再构造方法中调用时,必须要放在语法中的第一条语句,并且不能同时存在。

        不同点:

        (1)this是指代当前对象的引用,super是用来指代子类对象中从父类继承下来部分成员的引用,简单来说,this引用当前类,super引用父类。

        (2)在非静态成员中,this(...)用于调用本类的构造方法,super(...)用于调用父类的构造方法,俩种不能同时在构造方法中出现。

          (3)构造方法中一定回存在super(...)的调用,用户没有写编译器也会增加,而this(...)用户不写则没有

八、继承方式

        继承方式一共有三种,第一种是单继承,第二种是多层继承,第三种是不同类继承同一个类,单继承我们能理解,那多层继承是什么呢?主要就是父子关系上面还有一个爷爷这种叫做多层继承,如果以图来说的话就是:

        在Java种不支持多继承,还有一点注意的就是,对于继承之间的层次太复杂,一般我们不希望超出三层的继承关系,如果继承层次太多,就需要考虑对代码进行重构了。

九、final关键字

        对于final修饰变量或者字段,表示常量(即不能修改),如果修改就会编译出错。

        

public static void main(String[] args) {
        final int a=0;
        a=1;//报错
    }

        打印结果会直接报错,而对于final修饰类的话,那就是不能够被继承。

        

final public class Animal {
    String name;
    int age;
    int a=10;
    int b=20;
    public Animal(){
        System.out.println("Animal");
    }
}

public class Dog extends Animal{//因为Animal被final修饰,所以不能够被继承
    public Dog(){
        System.out.println("Dog");
    }
}

        因为Animal被final修饰了,不能够被继承,不然就会报错。

        这点是我们需要注意的地方。

        

      

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

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

相关文章

Transformer学习理解

1.前言 本文介绍当下人工智能领域的基石与核心结构模型——Transformer,为什么说它是基石,因为以ChatGPT为代表的聊 天机器人以及各种有望通向AGI(通用人工智能)的道路上均在采用的Transformer。 Transformer也是当下NLP任…

基于PCL实现多边形框选点云并进行裁剪(附C++源码)

文章目录 一.算法效果二.算法原理PNPoly算法直线相交性判断三.代码实现一.算法效果 通过在PCL可视化界面上绘制2D封闭多边形来提取位于该封闭多边形内部或者外部的 的点,算法效果如下: 图1多边形裁剪点云效果图 二.算法原理 PNPoly算法 2D多边形框选裁剪点云,实际上可以简…

SSRF学习,刷题

[HNCTF 2022 WEEK2]ez_ssrf 给了一个Apache2的界面,翻译一下 就是一个默认的界面,目录扫描 可以看到flag.php,肯定是不能直接访问得到的,还有index.php,访问这个 可以看到三个参数data,host,port 还有fsockopen() 函数是 PHP 中用于打开一个…

代码随想录训练营Day 64|卡码网98. 所有可达路径(深搜)

1.所有可达路径 98. 所有可达路径 | 代码随想录 代码&#xff1a; &#xff08;深搜&#xff09;邻接矩阵表示 #include <iostream> #include <vector> using namespace std; vector<int> path; vector<vector<int>> result; void dfs(const ve…

LeetCode 算法:两两交换链表中的节点 c++

原题链接&#x1f517;&#xff1a;两两交换链表中的节点 难度&#xff1a;中等⭐️⭐️ 题目 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交…

QT中利用动画弄一个侧边栏窗口,以及贴条效果

1、效果 2、关键代码 void Widget::on_sliderBtn_clicked() {m_sliderWidget->show();QPropertyAnimation* animation = new QPropertyAnimation(m

政策更新记录:敏感信息访问权限与API使用变更

我们将更新“健康数据共享”政策,简化“健康数据共享”申请流程,并与“健康类应用”政策保持一致。此外,我们将于今年晚些时候在 Play 管理中心推出一项新的声明,取代当前使用表单进行申请的方式。 公布日期:2024-04-03 Health Connect 政策要求及常见问题解答 初步认识对…

[AIGC] 使用Google的Guava库中的Lists工具类:常见用法详解

在Java程序设计中&#xff0c;集合是我们最常用的数据结构之一。为了方便我们操作集合&#xff0c;Google的Guava库提供了一个名为Lists的工具类&#xff0c;它封装了许多用于操作List对象的实用方法。在本文中&#xff0c;我们将详细介绍其常见的用法&#xff0c;以帮助您更好…

volatile关键字(juc编程)

volatile关键字 3.1 看程序说结果 分析如下程序&#xff0c;说出在控制台的输出结果。 Thread的子类 public class VolatileThread extends Thread {// 定义成员变量private boolean flag false ;public boolean isFlag() { return flag;}Overridepublic void run() {// 线…

钡铼BL101网关助力智慧城市路灯远程智能管控

在迈向智慧城市的征途中&#xff0c;基础设施的智能化改造是关键一环&#xff0c;而路灯作为城市脉络的照明灯塔&#xff0c;其智能化升级对于节能减排、提升城市管理效率具有重要意义。钡铼BL101网关&#xff0c;作为Modbus转MQTT的专业桥梁&#xff0c;正以其卓越的性能和广泛…

数据仓库与数据库的区别

在数据管理和分析的过程中&#xff0c;我们常常会听到“数据库”和“数据仓库”这两个术语。 虽然它们看起来相似&#xff0c;但实际上它们在设计目的、结构和使用场景上都有显著的区别。 数据库是什么&#xff1f; 数据库&#xff08;Database&#xff09;是一个用于存储和管…

[创业之路-120] :全程图解:软件研发人员如何从企业的顶层看软件产品研发?

目录 一、企业全局 二、供应链 三、团队管理 四、研发流程IPD 五、软件开发流程 六、项目管理 七、研发管理者的自我修炼 一、企业全局 二、供应链 三、团队管理 四、研发流程IPD 五、软件开发流程 六、项目管理 七、研发管理者的自我修炼

时空预测 | 基于深度学习的碳排放时空预测模型

时空预测 模型描述 数据收集和准备&#xff1a;收集与碳排放相关的数据&#xff0c;包括历史碳排放数据、气象数据、人口密度数据等。确保数据的质量和完整性&#xff0c;并进行必要的数据清洗和预处理。 特征工程&#xff1a;根据问题的需求和领域知识&#xff0c;对数据进行…

【C++】基础知识--inline(内联)关键字以及与宏的区别

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

Nginx Rewrite技术

一&#xff1a;理解地址重写 与 地址转发的含义。二&#xff1a;理解 Rewrite指令 使用三&#xff1a;理解if指令四&#xff1a;理解防盗链及nginx配置 简介&#xff1a;Rewrite是Nginx服务器提供的一个重要的功能&#xff0c;它可以实现URL重定向功能。 一&#xff1a;理解地…

医学图像预处理之z分数归一化

在医学图像处理中&#xff0c;Z分数标准化&#xff08;Z-score normalization&#xff09;是一种常用的数据标准化方法&#xff0c;其目的是将数据集中的每个图像像素值转换为具有均值为0和标准差为1的标准化值。这种标准化方法有助于改善图像的质量&#xff0c;便于后续图像处…

RS485中继器的作用你还不知道?

RS485是一种串行通信协议&#xff0c;支持设备间长距离通信。RS485中继器则像“传声筒”&#xff0c;能放大衰减信号&#xff0c;延长通信距离&#xff0c;隔离噪声&#xff0c;扩展分支。在实际场景中&#xff0c;如工厂内&#xff0c;通过中继器可确保控制室与远距离机器间通…

嵌入式Linux 中常见外设屏接口分析

今天将梳理下嵌入式外设屏幕接口相关的介绍,对于一个嵌入式驱动开发工程师,对屏幕都可能接触到一些相关的的调试,这里首先把基础相关的知识梳理。 1. 引言 在嵌入式开发过程中,使用到的液晶屏有非常多的种类,根据不同技术和特性分类,会接触到TN液晶屏,TN液晶屏 VA液晶屏…

Java基础16(集合框架 List ArrayList容器类 ArrayList底层源码解析及扩容机制)

目录 一、什么是集合&#xff1f; 二、集合接口 三、List集合 四、ArrayList容器类 1. 常用方法 1.1 增加 1.2 查找 int size() E get(int index) int indexOf(Object c) boolean contains(Object c) boolean isEmpty() List SubList(int fromindex,int …

H3C防火墙抓包(图形化)

一.报文捕获 &#xff0c;然后通过wireshark查看报文 二.报文示踪 &#xff0c; 输入源目等信息&#xff0c; 查看报文的详情