Java——继承——Extends

news2024/11/20 15:35:54

继承

  • 为什么要继承呢?
  • 继承的语法
  • 继承的概念
  • 子类中访问父类性质
  • Java的单继承
  • super和this
  • 子类构造方法
  • protected中super的使用
  • final关键字

今天我们来说说面向对象的又一特征:继承!

为什么要继承呢?

class Dog{
    public String name;
    public int age;
    public void eat(){
        System.out.println(this.name+"正在干饭");
    }
    public void wangwang(){
        System.out.println(this.name+"正在狗叫");
    }
}

class Bird{
    public String name;
    public int age;
    public void eat(){
        System.out.println(this.name+"正在干饭");
    }
    public void fly(){
        System.out.println(this.name+"正在辉");
    }
}

兄弟们应该可以理解,我在这里面创建了两个与动物相关的类,不难发现,无论是狗还是鸟,都有名字年龄属性,都有eat这个方法。此时我们的代码中就会因为有着无效重复而显得有点冗余。因此我们试图把这两个类中的共性抽取出来,给它放到一个新类中:

class Animal{
    public String name;
    public int age;
    
    public void eat(){
        System.out.println(this.name+"正在干饭");
    }
}
class Dog{

    public void wangwang(){
        System.out.println(this.name+"正在狗叫");
    }
}

class Bird{

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

兄弟们可能看不到具体的效果:
在这里插入图片描述在这里插入图片描述
因为目前我们只是把共性抽取了出来,并没有做出进一步的操作,所以我们艾阿猫阿狗类中就只剩下了自己特有的性质了,那怎么办呢?

继承的语法

我标题中的Extends 并不是继承的英文,而是我们在表示继承关系中用到的关键字!

class Bird extends Animal{
class Dog extends Animal{

加上这两行,就算是磕过头敬过茶认了干爹了!
虽然看上去简洁,但是我们还是需要对继承的语法进行一定的讲解 :
A extends B可以读作:子类继承了父类,也可以理解成:A is B——狗是动物,这句话天王老子来了都没毛病吧……
A叫做子类,也可以叫做派生类;B是父类,也可以叫做基类、超类。
在这里插入图片描述
看到没兄弟们,本来我们的子类中是没有姓名年龄属性的,但是我们继承了Anima这个父类之后,就会自动继承父类中的属性和方法,这里当然也是继承了eat方法啦,就不给兄弟们演示了。

继承的概念

我们现在已经是可以上使用继承了,那么兄弟们能不能试着描述一下继承呢?
其实我们完全可以用自己的话来组织一下:继承其实就是对子类中一些共性的抽取,那么在子类中只保留了它独特的性质,从而达到了代码复用的效果!

子类中访问父类性质

        Dog dog=new Dog();
        dog.name="cyt";
        System.out.println(dog.name);

在这里插入图片描述
我们由简入难,现在我们的子类中没有和父类同名的属性方法,一句话:我们使用子类对象的引用想要点出来一些性质的时候,优先在子类中寻找,在子类中确定了没有这个性质就去父类中康康有没有继承过来,如果连父类中都不存在,那么就会编译错误。
对于不重名的只要牢记这个性质就足矣。
那么对于那些重名的呢?

class Animal{
    public String name="animal";
    public int age;

    public void eat(){
        System.out.println(this.name+"animal的正在干饭");
    }

}
class Dog extends Animal{

    public String name="dog的";
    public void wangwang(){
        System.out.println(this.name+"正在狗叫");
    }
    public void eat(){
        System.out.println(this.name+"dog的正在干饭");
    }
}

在这里插入图片描述
我们从结果中可以很清楚地看到,无论是属性还是方法,我们使用的统统都是在子类中跟父类重名的那个,所以连编译器都在告诉我们:做人要自私一点,要多为自己想想,那你为什么还放不下早就不在的那个人呢?
在这边阿涛学艺不精,不是很会我老师搞得那一套,他是直接三两下搞到了底层,然后在蓝色的框框里面给我们看编译的具体过程,我给兄弟们描述一下吧:在编译的时候,显示出来的我们使用的仍然还是父类的属性和方法,因此我们说的现在的情况可以用运行时绑定来解释。

Java的单继承

我猜测啊,看到这篇博客的也会有不少的C++选手,对于他们来说,一个子类可以继承多个父类,是多继承的,但是我们Java选手多专一啊,我们誓死不做三姓家奴,我们就用单继承!
也就是说我们一个子类只可以有一个父类,只可以extends一个父类;但是千万不要以为所有家庭都是独生子女,我们一个父类可以有多个子类,就比如刚才的阿猫阿狗不都是继承了一个Animal父类嘛?

super和this

兄弟们还记不记得我们的this 老铁,this表示的是当前对象的引用,我们是不是常在类中的方法中使用this来区分重名的变量?其实this也就是告诉你我们要使用的这个性质啊,就是属于我们所在的这个类的对象的!
那么如果是就按照我们刚才所说说的,子类的优先级永远比父类高,那如果我们硬着头皮就是想要访问父类的性质,那又该如何?
我们可以暂时把super理解为当前对象父类的引用:

class Dog extends Animal{

    public String name="dog的";
    public void wangwang(){
        System.out.println(super.name+"正在狗叫");
    }
    public void eat(){
        System.out.println(super.name+"dog的正在干饭");
    }
}
    public static void main(String[] args) {
        Dog dog=new Dog();
        System.out.println(dog.name);
        dog.eat();
        dog.wangwang();

在这里插入图片描述
我们现在使用dog访问子类中的方法就会使用到他父类中的性质了。
那为什么我们说现在我们只能说把super理解为当前对象父类对象的引用呢?因为我们从始至终都是没有实例化一个父类对象的,连对象都没有那又何谈对象的引用呢?所以其实super就只是一个关键字,它可以提醒你现在我们即将使用的就是我们父类中的一些性质了!
那么我们之前在讲解this的时候说过的一些话,现在我再次告知一下兄弟们:
在静态方法中是无法使用this和super 的,我们想一想就能知道,this和super都是和对象息息相关的,但是静态方法是不依赖对象的,一般来说也不会有人无聊到在静态方法里面再实例化一个对象,所以在静态方法里面你连对象的影子都是看不到的,那么和谈对象的引用呢?
那么在这里我在给兄弟说一说我自己学习的时候遇到的困惑还有我自己的心得:
![在这里插入图片描述](https://img-blog.csdnimg.cn/3b2a497799394ea1b10feee42d058647.png
不是说我们的this和super是当前对象和当前对象父类对象的引用嘛?在class外面不可以使用我还可以理解,但是此时我们明明是在class内部,为什么还是不可以使用这父子俩呢?
之前我们同样说过,一个对象的实例化分为分配内存还有调用构造方法两步,那么现在这两代码如此突兀地出现在class内部,我们只能理解为这两行代码是属于我们类的,但是事实上我们的super和this都是极其依赖对象的,所以这里会有报错,那为什么在类中的方法(构造方法和普通方法都是)却可以肆无忌惮地使用呢?兄弟们想一想,我们的方法现在是不加static的,也就是说我们的方法此时此刻是不属于类的,而是是属于通过new实例化出来的对象的,那么只要我们想要访问这个方法,势必有一个对象的引用.对象的方法这一步,所以不是没有对象,甚至于对象都是你自己亲手创建出来的,只是你忽略了而已……
我自认为关于这个this和super我讲解的已经算比较好的,比较能够解决我自己百思不得其解的问题了,不知道兄弟们懂了没……

子类构造方法

之前讲到类和对象的时候我们是比较详细地说过了构造方法这个概念,现在我们再来盘一盘。
回忆一下,我们之前说的构造方法的作用是什么:我理解中的构造方法就是可以在实例化的时候直接对我们对象的属性进行初始化:那么请问在我们继承之中是否有什么需要关注的呢?我们直接上代码:
在这里插入图片描述
在这里插入图片描述
首先呢,我给兄弟们说一下报错的原因:我们在构造子类构造方法之前,不需要先帮助我们的父类进行构造,这就叫做孝道,老子还没落座呢你就先夹上菜了?这不行。
在这里插入图片描述
但是我们之前也说过,如果你自己不动手写构造方法的时候,编译器会自动给你一个不带参数的构造方法,那么此时在子类构造方法的第一行,编译器也是会自动帮助你加上这样的字样的:

    public Bird(String name,int age){
        super();
        this.name=name;
        this.age=age;

    }

请注意我这里说的是第一行,使用super帮助父类进行构造的时候必须要把super()放到第一行:
在这里插入图片描述
不然就报错!
所以说有的时候既然我们自己接手了那么就要负责到底。

    public Animal(){
        
    }
    
    public Animal(String name,int age){
        this.name=name;
        this.age=age;
    }

事实上根据我们业务的需求不同,我们可以写出好多好多个构造方法的,这些构造方法函数名一样,参数列表不尽相同,对于返回类型不做要求,那么这些构造方法之前是不是就是构成了我们所说的重载?
在这里插入图片描述
我们只能在子类的构造方法中帮助父类进行构造,可千万不敢滥用我们的super(),super的使用已经有了不少的限制,而我们的super()更是被加上了厚重的枷锁。

protected中super的使用

我们在之前讲解访问权限修饰符的时候落下了一个protected没有进行讲解,现在我们来说一下其中不同包下使用protected修饰的数据如何进行访问:
在这里插入图片描述
在这里插入图片描述
不是说的通过继承就可以在不同的包里面使用protected修饰的数据吗?莫非情报有误?
其实不然,我们看下面的:

class Main extends Test3{
    public Main(){
        super.a=20;
    }

}

在这里插入图片描述
虽然好像没有我i们想象中的那么方便,但是这确实也没有打到我们的脸!

final关键字

我们之前就说过的:final的作用类似于我们C语言中constant的作用,修饰一个变量,表示这个变量的值不可被修改。
那如果我们用final修饰一个类,那么这个类就不可以被继承。
如果我们用final修饰一个方法,那么这个方法就不可以被重写。
总而言之,我们的final就相当于给修饰的对象加上了一层常属性。

好的,那么我们关于继承的知识点我能想到的我能讲明白的也就这么多了,希望我的这篇博客能够多多少少帮助到兄弟们!
还是那句话,百年大道,你我共勉!

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

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

相关文章

QT Qmake 笔记

文章目录概述QT修改样式qmake概述库引用和库路径指定QT创建动态库和使用小例子写动态库用动态库参考资料附录概述 需要先安装osg,然后再编译安装osgQOpenGL的插件。 其中,osgQOpenGL是OSG嵌入到qt中的一种实现方式,换言之,能够支…

【小学信息技术教资面试】《认识鼠标》教案

1.题目:认识鼠标 2.内容: 3.基本要求: (1)掌握鼠标的基本操作 (2)体现学生的主体地位 (3)多种教学方法结合使用 (4)配合板书讲解 《认识鼠标》…

C语言学习之路(高级篇)—— 变量和内存分布(下)

说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 程序的内存分区模型 1) 内存分区 1.1 运行之前 我们要想执行我们编写的c程序,那么第一步需要对这个程序进行编译。 预处理&#xf…

linux进程替换(简介)

一:什么是进程替换? 定义: 进程替换,是指用一个新进程来替换此时正执行的进程。新进程从头开始执行自己的代码。 例子: 我们有一个父进程A,在父进程A中有一个子进程B 一般来说,子进程是执行…

Redis的数据复制

介绍 Redis 的复制 Redis 的复制功能分为同步(sync)和命令传播(command propagate)这两个操作 同步操作用于,将从服务器的数据库状态更新至主服务器当前所处的数据库状态;命令传播操作用于,在…

Java基础1112_包机制_JavaDoc生成文档

目录包机制JavaDoc生成文档方法一方法二包机制 为了更好的组织类,Java提供了包机制,用于区别类名的命名空间; 包语句的语法格式为:package pkg1[. pkg2[. pkg3 …]]; 一般利用公司的域名倒置作为包名;com.b…

二进制搭建k8s集群——部署多master

二进制搭建k8s集群——部署多master二进制搭建k8s集群——部署多master部署master02 节点部署负载均衡在lb01、lb02节点上配置nginx和keepalived两台负载均衡器配置keepalived所有node节点修改配置文件在 master01 节点测试创建pod二进制搭建k8s集群——部署多master 架构说明&…

C~回调函数

还是c的学习啊 一、函数指针 在讲回调函数之前,我们需要了解函数指针。 我们都知道,C语言的灵魂是指针,我们经常使用整型指针,字符串指针,结构体指针等 int *p1; char *p2; STRUCT *p3; //STRUCT为我们定义的结构体…

win10下docker安装

业精于勤荒于嬉,总是与偷懒做斗争。 很多年了,一直不愿做事情,不愿意想事情。 1、安装 Docker Toolbox -- Install on Windows | Docker Documentation http://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/DockerToolbox-…

今年你们赚到钱了吗?

峥嵘的2022年,各位程序员们,你们赚到钱了吗? 今天是2022年12月21日,眼看就快过年了! 今年你们赚到钱了吗?对于我而言,又是一个"窘迫/囧迫"的穷年,有点心慌慌,有…

windows安装Elasticsearch

Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。Elasticsearch是分布式的&#xff…

纷享销客《华东地区新增长专刊》重磅发布

增长,是企业发展永恒的主题。 纷享销客的使命是用创新科技和行业智慧赋能企业增长。在服务超过5000中大型客户的基础上,我们发现,各行各业从营销端到流通端,再到生产端,已然出现了全渠道、全场景、端到端、一体化融合…

【战“疫”案例展】壹点灵心理服务平台——携手抗疫,共克时艰“星光”同行公益项目...

‍网易云信战“疫”案例本项目由网易云信投递并参与“数据猿行业盘点季大型主题策划活动—— #榜样的力量# 《新冠战“疫”——中国数据智能产业最具社会责任感企业》榜单/奖项”评选。‍数据智能产业创新服务媒体——聚焦数智 改变商业自2019年底以来,人们的情绪持…

电脑垃圾站刚清空的文件怎么找回?总结了三种方法

当电脑上删除文件后会临时存放在电脑垃圾站中,如果还需要这些文件,还能有“后悔药”,直接在电脑垃圾站里面找到进行“还原”即可,但是当垃圾站的文件刚被清空了怎么办?如何找回文件呢?下面分享三种方法恢复…

赛狐ERP|假期模式补货建议,解决春节备货难题

马上就到春节假期了,有两个让亚马逊卖家特别头疼的难题: 工厂放假停工 拿不到货 尤其今年不同于往年,各种因素的影响让供应商的放假时间特别早,工厂放假停工以及年后生产排期的不确定性,会导致卖家很长一段时间都无法…

activemq安装windows环境,数据订阅与发布,生产者与消费者

官网下载,选择适合本地jdk编译环境的部署包 安装完成后解压到指定目录,目录不要包含中文,否则可能启动不成功。 解压完成后找到指定路径 双击即可运行 ,见到如下界面启动成功 访问本地管理页面http://127.0.0.1:8161/ 输入账号…

SpringBoot全局异常处理

1、异常处理的种类 我大概把一次请求分成三个阶段,来分别进行全局的异常处理。 在进入Controller之前,譬如请求一个不存在的地址,404错误。在执行RequestMapping时,进入逻辑处理阶段前。譬如传的参数类型错误。以上都正常时&…

升级Win11系统卡在了35%怎么解决?

升级Win11系统卡在了35%怎么解决?Windows11是微软开发的电脑的最新操作系统,不少人都会选择更新到Windows11,但是进行更新安装对很多人来讲并不是一件很简单的事情,不少人都在抱怨安装时常常卡在35%或85%,并且带有一个…

Java.Util复习贴

参加了数次竞赛之后,我发现我的瓶颈所在——语法。于是今天来复习一下常用的Java库函数吧。 比赛中用java8还是10我就不care啦,我直看官方最新文档。地址在 https://docs.oracle.com/javase/10/docs/api/java/util/package-summary.html 首先看到java.…

排序——插入排序、希尔排序

目录 一.插入排序 1.实现 2.时间复杂度 二.希尔排序 2.预排序 (1).单次预排序的实现 (2).相对有序 2.代码 一.插入排序 1.实现 正如其名,是将第n1个数据插入到前面的n的升序(降序)数据中,形成一个n1大小的升序&#xff0…