[JAVA]继承

目录

1.继承的概念

2.继承的语法

3.父类成员访问 

3.1子类中访问父类成员变量

3.2子类中访问父类成员方法

4.super关键字 

5.子类构造方法

6.继承方式

7.final关键字和类的关系


面向对象思想中提出了继承的概念,专门用来进行共性抽取,实现代码复用。就像是数学中,提取每一个数的公因数一般,把相同的代码提取出来,单独的成为一个类,但同时又可以被别的类使用其中的属性或方法。

1.继承的概念

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

 Cat和Dog类,既有从父类Animal继承的语句,也含有本身的语句。

 

class Animal{//父类
    String name;
    int age;
    public void eat(){
        System.out.println(this.name + " is eating.");
    }
}

class Cat extends Animal{ //Animal的子类
    public void miaow(){
        System.out.println("miaomiaomiao~");
    }
}

class Dog extends Animal{  //Animal的子类
    public void bark(){
        System.out.println("wangwangwang~");
    }
}

2.继承的语法

修饰符 class 子类 extends 父类{……}

class Animal{//父类
    String name;
    int age;
    public void eat(){
        System.out.println(this.name + " is eating.");
    }
}

class Cat extends Animal{//子类
    public void miaow(){
        System.out.println("miaomiaomiao~");
    }
}

public class Test {
    public static void main(String[] args) {
        Cat cat = new Cat();
        System.out.println(cat.age);
        System.out.println(cat.name);
    }
}

我们可以看到,我们在main方法中,只实例化了cat对象,但是cat本身并没有定义任何成员变量,却发现可以调用成员变量age和name。而我们又使用了继承,由此可知对象cat当中的成员变量肯定来自于其父类Animal,同样的我们也可以同样的访问父类的方法。

通过上面的举例,我们值得注意的是:

  • 子类本身要有属于自身的语句,如果和父类相同则没必要创建一个新的类。
  • 子类会将父类的成员变量和方法继承到子类当中

3.父类成员访问 

3.1子类中访问父类成员变量

我们可以在子类中使用方法来访问父类的成员,使用this会先在子类中寻找成员,如果找不到则会进入父类寻找,所以在子类中this也可以访问父类成员

class Animal{//父类
    String name;
    int age;
    public void eat(){
        System.out.println(this.name + " is eating.");
    }
}

class Cat extends Animal{  //Animal子类
    public void setName(String name){
        this.name = name;
    }
    public void miaow(){
        System.out.println("miaomiaomiao~");
    }
}

还有另一种情况,就是子类中成员名和父类的相同。

class Animal{//父类
    String name;    //注意1
    int age;
    public void eat(){
        System.out.println(this.name + " is eating.");
    }
}

class Cat extends Animal{  //Animal子类
    String name;    //注意2
    public void setName(String name){
        this.name = name;
    }
    public void miaow(){
        System.out.println("miaomiaomiao~");
    }
}

此处,子类和父类的成员名都相同,那下面的setName方法中访问的是子类的成员还是父类的成员呢??

答案是:子类的。就像是C语言中局部变量和全局变量一样,如果变量名相同,给其赋值局部变量会优先与全局变量(类似就近原则?)在这里也是同样的道理

“成员名相同,访问父类成员变量的方法我们下面会有所提及”

于是,我们总结以下几点:

  • 如果访问的成员变量子类中有,优先访问自己的成员变量。
  • 如果访问的成员变量子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错。
  • 如果访问的成员变量与父类中成员变量同名,则优先访问自己的。 

3.2子类中访问父类成员方法

如果成员方法名不相同的情况:

和访问父类成员变量类似的,先在子类中寻找要访问的成员方法,如果有即可以访问。如果子类没有,下一步是进入到父类寻找要访问的成员方法。父类中访问不到相应的成员方法,则编译器会报错。子类的优先级是大于父类的

 成员方法名相同的情况:

class Base{
    public void methodA(){
        System.out.println("Base中的方法");
    }
    public void methodB(){
        System.out.println("Base中的方法");
    }
}

class A extends Base{
    public void methodA(int a){
        System.out.println("A中的参数为int的methodA方法");
    }
    public void methodB(){
        System.out.println("A中的methodB方法");
    }
}
public class Test {
    public static void main(String[] args) {

        A a = new A();
        a.methodA();//没有参数,访问的是父类中的methodA方法
        a.methodA(5);//有参数,访问的是子类中的methodA方法
        a.methodB();//访问的是子类的方法,不可能访问到父类的方法
                    //因为先在子类中访问再到父类
    }
}

 

 总结:

  • 通过子类对象访问父类与子类中不同名方法时,优先在子类中找,找到则访问,否则在父类中找,找到则访问,否则编译报错。
  • 通过派生类对象访问父类与子类同名方法时,如果父类和子类同名方法的参数列表不同(重载),根据调用方法适传递的参数选择合适的方法访问,如果没有则报错;

4.super关键字 

Java提供了super关键字,该关键字主要作用:在子类方法中访问父类的成员。

class Base{
    public void methodA(){
        System.out.println("Base中的方法");
    }
    public void methodB(){
        System.out.println("Base中的方法");
    }
}

class A extends Base{
    public void methodA(int a){
        System.out.println("A中的参数为int的methodA方法");
    }
    public void methodB(){
        System.out.println("A中的methodB方法");
        super.methodB();//注意此处:用super关键字访问到了父类的成员方法
    }
}
public class Test {
    public static void main(String[] args) {

        A a = new A();
        a.methodA();//没有参数,访问的是父类中的methodA方法
        a.methodA(5);//有参数,访问的是子类中的methodA方法
        a.methodB();//访问的是子类的方法,不可能访问到父类的方法
                    //因为先在子类中访问再到父类
    }
}

 注意事项:

  • 只能在非静态方法中使用
  • 在子类方法中,访问父类的成员变量和方法

5.子类构造方法

 因为父类和子类是继承关系,即子类会继承父类的成员变量除此还有自身额外的成员变量,在构建子类的构造方法的时候要先调用父类的构造方法。

class Base{
    
    public Base(){
        System.out.println("调用了父类的构造方法");
    }
}

class A extends Base{

    public A(){
        super();//调用父类的构造方法  用户没有写的时候会默认自动添加
        System.out.println("调用了子类的构造方法");
    }
    
}

public class Test {
    public static void main(String[] args) {
        A a = new A();
    }
}

 注意:

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

6.继承方式

 java中的继承方式分为3种:

第一种:单继承

即一个类被另一个类继承

class A{
    ……
}

class B extends A{
    ……
}

第二种:多层继承

即有一个类A,类B继承了A,类C继承了B

class A{
    ……
}

class B extends A{
    ……
}

class C extends B{
    ……
}

第三种:不同类继承同一个类

即有一个类A,类B继承A,类C继承A

class A{
    ……
}

class B extends A{
    ……
}

class C extends A{
    ……
}

7.final关键字和类的关系

当final修饰一个类的时候,这个被修饰的类不能被继承

 编译器会报错

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

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

相关文章

2023年顶级编程语言趋势

对于开发人员和软件工程师来说,选择更优秀的编程语言使编写可以在任何地方运行的软件变得更加容易,工作效率更高。从 Java 的缓慢衰落到 MATLAB 的惊人流行,对当今最流行的编程语言的分析,可以帮助你了解最新趋势并响应最新趋势。…

总结:K8S运维常用命令

一、部署./kubectl apply -f biz-healing-pod.yaml 二、查看部署的资源1、podkubectl get pod -A:获取所有pod没有IP?用-o wide参数看详细信息:./kubectl get pod -n deepflow -o wide2、service查看hubble-manager命名空间下有哪些service/d…

Excel函数公式大全—函数真经

EXCEL系列文章目录 Excel系列文章是本人亲身经历职场之后萌发的想法,为什么Excel覆盖如此之广,几乎每个公司、学校、家庭都在使用,但是它深藏的宝藏功能却很少被人使用,PQ、BI这些功能同样适用于数据分析;并且在一些需…

ViewService——一种保证客户端与服务端同步的方法

简介在分布式系统中,最常见的场景就是主备架构。但是如果主机不幸宕机,如何正确的通知客户端当前后端服务器的状况成为一个值得研究的问题。本文描述了一种简单的模型用于解决此问题。背景以一个分布式的Key-Value数据库为背景。数据库对外提供3个接口Ge…

有哪些计算机网络和通讯领域的SCI期刊推荐? - 易智编译EaseEditing

IEEE/ACM Transactions on Networking: 这是由IEEE和ACM联合出版的计算机网络领域的顶级期刊,涵盖了网络协议、体系结构、性能评估、网络管理、安全等多个方面。 Computer Networks: 这是一本综合性的计算机网络期刊,包括分布式系统、网络协议、移动计…

Spring注册Bean的方式

文章目录一、xml方式注册Bean二、ConfigurationBean注册Bean三、ComponentScan注册Bean1. 使用XML文件配置包扫描2. 使用注解配置包扫描3. ComponentScans源码4. ComponentScan源码5. ComponentScan value includeFilters6. ComponentScan value excludeFilters7. Componen…

rabbitMQ介绍及使用方法

目录 一、MQ概述 二、RabbitMQ简介 三、RabbitMQ的五种工作模式 1、简单模式 2、work queues工作队列模式 3、Pub/Sub 订阅模式 4、Routing 路由模式 5、Topics 通配符模式 一、MQ概述 MQ全称Message Queue (消息队列),是在消息的传输过程中保存消息的容器…

电商项目后端框架SpringBoot、MybatisPlus

后端框架基础 1.代码自动生成工具 mybatis-plus &#xff08;1&#xff09;首先需要添加依赖文件 <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.2</version></dependency><de…

【linux】进程信号——信号的产生

进程信号一、信号概念1.1 信号理解二、产生信号2.1 通过键盘产生信号2.2 捕捉信号自定义signal2.3 系统调用接口产生信号2.3.1 向任意进程发送任意信号kill2.3.2 给自己发送任意信号raise2.3.3 给自己发送指定信号abort2.3.4 理解2.4 硬件异常产生信号2.4.1 除0异常2.4.2 野指针…

蓝桥杯刷题冲刺 | 倒计时17天

作者&#xff1a;指针不指南吗 专栏&#xff1a;蓝桥杯倒计时冲刺 &#x1f43e;马上就要蓝桥杯了&#xff0c;最后的这几天尤为重要&#xff0c;不可懈怠哦&#x1f43e; 文章目录1.长草2.分考场1.长草 题目 链接&#xff1a; 长草 - 蓝桥云课 (lanqiao.cn) 题目描述 小明有一…

Feign远程调用

之前在一篇博客中写了利用RestTemplate发起远程调用的代码&#xff0c;但是存在一下问题&#xff1a;代码可读性差&#xff0c;编程体验不统一&#xff1b;如果参数特别多的话&#xff0c;参数复杂URL难以维护。Feign官方地址&#xff1a;https://github.com/OpenFeign/feignFe…

行业观察 | 来了解一下AI加速器

本文参考网上可查询到的资料简要总结AI加速器的概念和应用等信息 1。 未完待续 更新&#xff1a; 2023 / 3 / 22 行业观察 | 来了解一下AI加速器前言加速器处理器处理器是什么&#xff1f;处理器进化史加速器架构指令集 ISA特定领域的指令集 ISA超长指令字&#xff08;VLIW&a…

如何使用子项目管理方案?

在项目进行中经常发生这样的情况&#xff1a;当你开始为一个项目制定时间表时&#xff0c;你会发现任务的数量太多。你需要把它们全部分组到一些摘要任务中。但随后你看到一堆摘要任务&#xff0c;也想把它们再分组。 这样一来&#xff0c;该项目变得很麻烦&#xff0c;甚至项目…

Matlab进阶绘图第10期—带填充纹理的柱状图

带填充纹理的柱状图是通过在原始柱状图的基础上添加不同的纹理得到的&#xff0c;可以很好地解决由于颜色区分不足而导致的对象识别困难问题。 由于Matlab中未提供纹理填充选项&#xff0c;因此需要大家自行设法解决。 本文使用Kesh Ikuma制作的hatchfill2工具&#xff08;Ma…

gin框架使用websocket实现进入容器内部执行命令

文章目录1. 先决条件2. gin框架实现3. 测试用html文件4. 需要完善1. 先决条件 docker开放远程API端口 2. gin框架实现 type GetCommandResultRequire struct {IpAddr string json:"ip_addr" //传入要控制容器的ip地址ContainerUuid string json:"cont…

对堆题的总体思路

浅说一下pwn堆并用一个简单的例子具体说明给刚入坑堆的小朋友说的一些思路说一下堆是什么堆你可以看成一个结构体数组&#xff0c;然后数组里每个元素都会开辟一块内存来存储数据那么这块用来存储数据的内存就是堆。结构体数组在BSS段上&#xff0c;其内容就是堆的地址&#xf…

动态SQL必知必会

动态SQL必知必会1、什么是动态SQL2、为什么使用动态SQL3、动态SQL的标签4、if 标签-单标签判断5、choose标签-多条件分支判断6、set 标签-修改语句7、foreach标签7.1 批量查询7.2 批量删除7.3 批量添加8、模糊分页查询1、什么是动态SQL 动态 SQL 是 MyBatis 的强大特性之一。如…

阿里巴巴2017实习生笔试题(二)——总结

具体题目来自阿里巴巴2017实习生笔试题&#xff0c;本文仅为整理与汇总。 本题应该往C的多态性进行理解&#xff0c;多态中的动态链接在执行时进行&#xff0c;静态链接在编译时进行。其中A、C、D 都是动态链接的优点&#xff0c;B 时静态链接的优点。 减少页面交换可从如下角…

nginx-动静分离-防盗链-location-4

动静分离 为了加快网站的解析速度&#xff0c;可以把动态页面和静态页面有不同的服务器来解析&#xff0c;加快机械速度。降低原来单个服务器的压力。在动静分离的tomcat时候比较明显&#xff0c;因为tomcat解析静态很慢&#xff0c;其实这些原理的话很好理解&#xff0c;简单…

Baumer工业相机堡盟万兆网相机如何使用千兆网网卡环境保持帧率不变(C++)

项目场景 Baumer工业相机堡盟相机是一种高性能、高质量的工业相机&#xff0c;可用于各种应用场景&#xff0c;如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能&#xff0c;可以实时传输高分辨率图像。此外&#xff0c;该相机还具…