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;//共有的属性agepublic 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.mzph.cn/diannao/31102.shtml

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

相关文章

React+TS 从零开始教程(1)

源码链接:https://pan.quark.cn/s/c6fbc31dcb02 创建项目 直接通过以下命令,我们来创建一个reactts的项目。 npx create-react-app myapp --template typescript这样就创建好了,然后我们导入vscode. npx是npm里面的一个库,可以让你自动使用…

2-11 基于matlab的BP-Adaboost的强分类器分类预测

基于matlab的BP-Adaboost的强分类器分类预测,Adaboost是一种迭代分类算法,其在同一训练集采用不同方法训练不同分类器(弱分类器),并根据弱分类器的误差分配不同权重,然后将这些弱分类器组合成一个更强的最终…

云专线组网方案的特性和实施要素

云专线组网方案是指企业通过专用的网络连接,将其内部网络与云服务商的数据中心直接相连,从而实现高速、安全、稳定的云资源访问。云专线通常提供比公共互联网更优的网络性能,包括更低的延迟、更高的带宽和更强的安全性。以下是云专线组网方案…

物联网设备安装相关知识整理

拓扑图 对于ADAM-4150先接设备的整体的供电。 ADAM-4150就涉及到几个电子元器件的连接,一个是485-232的转换器,一个是将RS-232转换为USB的转接口,因为现在的计算机很多都去掉了RS-232接口而使用USB接口。 4150右侧有个拨码,分别两…

UniApp 开发微信小程序教程(一):准备工作和环境搭建,项目结构和配置

文章目录 一、准备工作和环境搭建1. 安装 HBuilderX步骤: 2. 注册微信开发者账号步骤: 3. 创建 UniApp 项目步骤: 二、项目结构和配置1. UniApp 项目结构2. 配置微信小程序修改 manifest.json修改 pages.json 3. 添加首页文件index.vue 示例&…

排序之快速排序

快速排序之所以叫快速排序,肯定要配得上它的名字。我们就来看看它是如何这么快的。 快速排序的原理 快速排序是霍尔创建的,是通过以第一个或者最后一个数值作为比较值key,形成一个它的左边比它都小,右边比它都大的情况&#xff0…

家用电器信息管理系统

摘 要 随着互联网的快速发展,传统家电行业受到冲击,逐渐向智能家居市场转型。因此,智能家居无疑是一个有着巨大市场需求和新兴发展空间的新兴产业,也是人们追求安全、便捷、舒适的生活方式的必然趋势。互联网推动了我国传统家居产…

从复用性角度阐述中台建设

目录 复用性中台定义深思中台建设产品线形态何时演变中台能力落地中台 业务中台架构总结 技术学习永不止步,最近也是看了很多关于架构设计相关的专栏,慢慢总结出来一部分知识,代入自己的思考与理解,以及结合并反思自己之前公司的架…

鸿蒙开发通信与连接:【@ohos.nfc.tag (标准NFC-Tag)】

标准NFC-Tag 本模块主要用于操作及管理NFC Tag。 说明: 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 import tag from ohos.nfc.tag;tag.getNfcATag getNfcATag(tagInfo: TagInfo): Nf…

Codeforces Global Round 26 E. Shuffle(树形dp)

题目 思路来源 乱搞ac 题解 注意到提出一个点之后, 后面第二次提出的点、第三次提出的点, 如果后续成为叶子,一定不相邻,所以等价于求原树的最大独立集 但是第一次提出的叶子可以和第二次提出的叶子相邻 这个看最后一个样例…

Java按照GBK拼音顺序对汉字排序

最近遇到一个需求,需要对一个列表数据的特定字段,比如姓名,初看应该不难,但是有什么比较快速便捷的方法,因为是Java的项目,所以想到比较火的工具框架Hutool,在Hutool官网 找到一个比较器类Pinyi…

python离线安装第三方库、及其依赖库(单个安装,非批量移植)

文章目录 1.外网下载第三方库、依赖库2.内网安装第三方库3.补充附录内网中离线安装python第三方库,这时候只能去外网手动下载第三方库,再传回内网进行安装。 问题是python第三方库往往有其前置依赖包,你很难清楚某个第三方库依赖的是哪些依赖包,更难受的是依赖包可能还有其…

五十一、openlayers官网示例Layer Min/Max Resolution解析——设置图层最大分辨率,超过最大值换另一个图层显示

使用minResolution、maxResolution分辨率来设置图层显示最大分辨率。 <template><div class"box"><h1>Layer Min/Max Resolution</h1><div id"map" class"map"></div></div> </template><…

Java 8 Stream API介绍

Java 8引入了Stream API&#xff0c;这是对集合框架的一种增强&#xff0c;它允许你以一种声明式的方式处理数据集合。Stream API的核心在于将数据的操作分为两个主要阶段&#xff1a;中间操作和终端操作。中间操作返回的是一个新的Stream&#xff0c;可以链式调用多个中间操作…

基于Windows API DialogBox的对话框

在C中&#xff0c;DialogBox函数是Windows API的一部分&#xff0c;它用于在Win32应用程序中创建并显示一个模态对话框。DialogBox函数是USER32.DLL中的一个导出函数&#xff0c;因此你需要在你的C Win32应用程序中链接到这个库。 #include "framework.h" #include …

网信办公布第六批深度合成服务算法备案清单,深兰科技大模型入选

6月12日&#xff0c;国家互联网信息办公室发布了第六批深度合成服务算法备案信息&#xff0c;深兰科技硅基知识智能对话多模态大模型算法通过相关审核&#xff0c;成功入选该批次《境内深度合成服务算法备案清单》。同时入选的还有腾讯混元大模型多模态算法、支付宝图像生成算法…

【MySQL】(基础篇十五) —— 增删改数据

增删改数据 本文介绍如何利用SQL的INSERT语句将数据插入表中。以及如何利用UPDATE和DELETE语句进一步操纵表数据。 数据插入 INSERT是用来插入&#xff08;或添加&#xff09;行到数据库表的。插入可以用几种方式使用 插入完整的行&#xff1b;插入行的一部分&#xff1b;插…

jquery动态效果插件之ScrollMagic

ScrollMagic 是一个强大的 JavaScript 库,可以帮助开发者在页面滚动时触发各种动画效果。它支持复杂的滚动交互,非常适合制作富交互的网页。 这里他使用了ScrollMagic的几种滚动效果: 视差滚动效果:页面上的一些元素在滚动时会产生视差滚动效果,即元素以不同的速度移动,营造出…

C++初学者指南第一步---10.内存(基础)

C初学者指南第一步—10.内存&#xff08;基础&#xff09; 文章目录 C初学者指南第一步---10.内存&#xff08;基础&#xff09;1.内存模型1.1 纸上谈兵&#xff1a;C的抽象内存模型1.2 实践&#xff1a;内存的实际处理 2. 自动存储3.动态存储&#xff1a;std::vector3.1 动态内…

Redis缓存的一些概念性问题

目录 缓存模型和思路 缓存更新策略 数据库和缓存不一致 缓存与数据库双写一致 缓存穿透 缓存雪崩 缓存击穿 速度快,好用&#xff0c;内存的读写性能远高于磁盘,缓存可以大大降低用户访问并发量带来的服务器读写压力 缓存模型和思路 标准的操作方式就是查询数据库之前先…