Java之继承1

news2024/11/13 23:23:56

1. 继承

1.1 为什么要继承

在Java中我们定义猫类和狗类,如下

在这里插入图片描述

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

在这里插入图片描述

public class Dog {
    public String name;
    public int age;
    public String color;

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

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

    public void bark(){
        System.out.println(name + "在汪汪叫");
    }
}

在这里插入图片描述
根据图片我们可以发现猫类和狗类有大量重复的代码,我框住的就是重复的地方。
在Java中,于是就提出了继承这个概念,用来抽取共性。

1.2 继承的概念

在Java中,继承是面向对象编程的重要特性之一,它允许一个类(子类)继承另一个类(超类)的属性和方法。通过继承,子类可以重用超类的代码,从而提高代码的可重用性和可维护性,即实现共性的抽取,代码复用

上述代码中,猫和狗都是动物,我们可以定义一个动物类将共性抽取,再让猫类和狗类都继承这个动物类实现代码复用

在这里插入图片描述

1.3 如何继承

继承需要用到 extends关键字

修饰符 class 子类 extends 父类 {
   // ...  
}

将上述代码用继承实现

public class Animal {
    public String name;
    public int age;
    public String color;

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

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

public class Cat extends Animal {

    public void bark(){
        System.out.println(name + "在喵喵叫");
    }
}

public class Dog extends Animal{

    public void bark(){
        System.out.println(name + "在汪汪叫");
    }
}

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

1.4 父类成员的访问

那么子类怎么访问父类的成员变量和方法呢?

1.4.1 子类怎么访问父类的成员变量

子类访问父类的成员变量也分为两种情况,分别为不同名的成员变量如何访问、同名的成员变量如何访问。

1.4.1.1 子类和父类的成员变量不同名
public class Test1 {
    public int a = 1;
    public int b = 2;
}

public class Test2 extends Test1{
    public int c = 3;

    public void test(){
        System.out.println(a);//从父类中继承下来的a
        System.out.println(b);//从父类中继承下来的b
        System.out.println(c);//自己类的c
    }
}

public class Main {
    public static void main(String[] args) {
        Test2 test2 = new Test2();
        test2.test();
    }
}

//运行结果
1
2
3
1.4.1.2 子类和父类的成员变量同名
public class Test1 {
    public int a = 1;
    public int b = 2;
}

public class Test2 extends Test1{
    public int b = 5;
    public int c = 3;

    public void test(){
        System.out.println(a);//从父类继承下来的a
        System.out.println(b);//是访问父类继承下来的b还是自己类的b呢
        System.out.println(c);//自己类的c
    }
}

public class Main {
    public static void main(String[] args) {
        Test2 test2 = new Test2();
        test2.test();
    }
}

//执行结果
1
5
3

根据执行结果来看,访问的是自己类的b

如果我们将Test2的代码改动,如下

public class Test2 extends Test1{
    public int b = 5;
    public int c = 3;

    public void test(){
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println(d);
    }
}

在这里插入图片描述
访问父类和子类都没有的成员变量编译器会报错。

结论

  1. 如果访问的成员变量子类中有时,就访问子类自己的成员变量。
  2. 如果访问的成员变量子类中没有时,就访问父类中的成员变量,如果父类中也不存在该成员变量,编译器报错。
  3. 如果访问的成员变量子类中和父类中同名时,优先访问子类的

优先访问子类自己的,如果没有再去访问父类的。

1.4.2 子类怎么访问父类的成员方法

同上,分为不同名的成员方法如何访问、同名的成员方法如何访问。

1.4.2.1 子类和父类的成员方法不同名
public class Test1 {
    public void f1(){
        System.out.println("Test1的方法f1");
    }
}

public class Test2 extends Test1{
    public void f2(){
        System.out.println("Test2方法中的f2");
    }

    public void test(){
        f1();//访问父类中的该方法
        f2();//访问子类中该方法
    }
}

public class Main {
    public static void main(String[] args) {
        Test2 test2 = new Test2();
        test2.test();
    }
}

//运行结果
Test1的方法f1
Test2方法中的f2

1.4.2.2 子类和父类的成员方法同名
public class Test1 {
    public void f1(){
        System.out.println("Test1的方法f1");
    }

    public void f2(){
        System.out.println("Test1的f1方法");
    }
}

public class Test2 extends Test1{
    public void f1(int a){
        System.out.println("Test2的方法f1");
    }
    public void f2(){
        System.out.println("Test2的方法f2");
    }

    public void test(){
        f1();//没有传参,访问父类中的该方法
        f1(1);//传参,访问自己类中的该方法
        f2();//访问子类中的该方法
    }
}

public class Main {
    public static void main(String[] args) {
        Test2 test2 = new Test2();
        test2.test();
    }
}

//执行结果
Test1的方法f1
Test2的方法f1
Test2的方法f2

结论

  1. 如果访问的成员方法不同名时,优先在子类中找,找到则访问,找不到在父类中找;如果父类和子类都没有时,则编译器报错。
  2. 如果访问的成员方法同名时,优先访问自己的;如果父类和子类同名方法的参数列表不同(重载),根据调用
    方法适传递的参数选择合适的方法访问。

在这里插入图片描述

有点给我写懵了,明天再写吧,嘻嘻
未完待续~
在这里插入图片描述
不要走开,明天再来

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

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

相关文章

基于pytorch本地部署微调bert模型(yelp文本分类数据集)

项目介绍 本项目使用hugging face上提供的Bert模型API,基于yelp数据集,在本地部署微调Bert模型,官方的文档链接为https://huggingface.co/docs/transformers/quicktour,但是在官方介绍中出现了太多的API调用接口,无法…

React 中的延迟加载

延迟加载是 Web 开发中的一种有效的性能优化技术,尤其是对于 React 等库和框架。它涉及仅在需要时加载组件或资源,无论是响应用户操作还是当元素即将在屏幕上显示时。这可以减少应用程序的初始加载时间,减少资源消耗,并改善用户体…

ETLCloud:新一代ETL数据抽取工具的定义与革新

数据集成、数据治理已经成为推动企业数字化转型的核心动力,现在的企业比任何时候都需要一个更为强大的新一代数据集成工具来处理、整合并转化多种数据源。 而ETL(数据提取、转换、加载)作为数据管理的关键步骤,已在企业数据架构中…

串口助手的qt实现思路

要求实现如下功能&#xff1a; 获取串口号&#xff1a; foreach (const QSerialPortInfo &serialPortInfo, QSerialPortInfo::availablePorts()) {qDebug() << "Port: " << serialPortInfo.portName(); // e.g. "COM1"qDebug() <<…

【JavaEE】——线程的安全问题和解决方式

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯&#xff0c;你们的点赞收藏是我前进最大的动力&#xff01;&#xff01;希望本文内容能够帮助到你&#xff01; 目录 一&#xff1a;问题引入 二&#xff1a;问题深入 1&#xff1a;举例说明 2&#xff1a;图解双线程计算…

SwiftUI 实现关键帧动画

实现一个扫描二维码的动画效果&#xff0c;然而SwiftUI中没有提供CABasicAnimation 动画方法&#xff0c;该如何实现这种效果&#xff1f;先弄清楚什么关键帧动画&#xff0c;简单的说就是指视图从起点至终点的状态变化&#xff0c;可以是形状、位置、透明度等等 本文提供了一…

(done) 声音信号处理基础知识(3) (一个TODO: modulation 和 timbre 的关联)(强度、响度、音色)

来源&#xff1a;https://www.youtube.com/watch?vJkoysm1fHUw sound power 通常可以被认为是能量传输的速率 声源往所有方向传输的每时间单位能量 用 瓦特(W) 作为单位测量 Sound intensity 声音强度&#xff0c;每单位面积的 sound power W/m^2 人类实际上能听到非常小强…

八. 实战:CUDA-BEVFusion部署分析-coordTrans Precomputation

目录 前言0. 简述1. 案例运行2. coordTrans3. Precomputation总结下载链接参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习下课程第八章—实战&#xff1a;CUDA-BEVFusion部署分…

Python Selenium 自动化爬虫 + Charles Proxy 抓包

一、场景介绍 我们平常会遇到一些需要根据省、市、区查询信息的网站。 1、省市查询 比如这种&#xff0c;因为全国的省市比较多&#xff0c;手动查询工作量还是不小。 2、接口签名 有时候我们用python直接查询后台接口的话&#xff0c;会发现接口是加签名的。 而签名算法我…

keil5 MDK 最新版本官网下载(v5.40为例) ARM单片机环境搭建安装教程(STM32系列为例)

正所谓授之以鱼不如授之以渔。本文将细讲从官网下载keil5MDK来保证keil5为最新版本的实时性 &#xff08;注意新老版本可能出现版本兼容问题&#xff0c;若不放心&#xff0c;跟着老弟我一起下载5.40版本即可&#xff09; 目录 一、下载keil5 MDK 方法①:CSDN下载&#xff0…

计算机毕业设计 基于 Hadoop平台的岗位推荐系统 SpringBoot+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

【深入学习Redis丨第六篇】Redis哨兵模式与操作详解

〇、前言 哨兵是一个分布式系统&#xff0c;你可以在一个架构中运行多个哨兵进程&#xff0c;这些进程使用流言协议来接收关于Master主服务器是否下线的信息&#xff0c;并使用投票协议来决定是否执行自动故障迁移&#xff0c;以及选择哪个Slave作为新的Master。 文章目录 〇、…

Django 5 学习笔记 2024版

1. 官方中文文档 Django 文档 | Django 文档 | Django (djangoproject.com) 2. 第一个应用 博客 总目录 <1>依赖安装: pip install django <2> 创建 工程 myapp django-admin startproject myapp cd myapp <3>创建 应用 app > python manage.py s…

算法-排序算法(冒泡选择插入希尔快速归并堆计算)

1.算法概述 1.1什么是算法 算法是特定问题的求解步骤的描述&#xff0c;是独立存在的一种解决问题的思想和方法。对于算法而言计算机编程语言并不重要&#xff0c;可以用任何计算机编程语言来编写算法。 程序数据结构算法 1.2数据结构和算法的区别和联系 数据结构只是静态…

CentOS 7 YUM源不可用

CentOS 7 操作系统在2024年6月30日后将停止官方维护&#xff0c;并且官方提供的YUM源将不再可用。 修改&#xff1a;nano /etc/yum.repos.d/CentOS-Base.repo # CentOS-Base.repo [base] nameCentOS-$releasever - Base baseurlhttp://mirrors.aliyun.com/centos/$rel…

数据库管理-第243期 云栖有感:AI?AI!(20240922)

数据库管理243期 2024-09-22 数据库管理-第243期 云栖有感&#xff1a;AI&#xff1f;AI&#xff01;&#xff08;20240922&#xff09;1 AI2 干货3 数据库总结 数据库管理-第243期 云栖有感&#xff1a;AI&#xff1f;AI&#xff01;&#xff08;20240922&#xff09; 作者&am…

Apache 中间件漏洞

CVE-2021-41773 环境搭建 docker pull blueteamsteve/cve-2021-41773:no-cgid 访问172.16.1.4:8080 使⽤curl http://172.16.1.4:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd

Linux中的调度算法

nice值的范围有限&#xff0c;即为[-20, 19]&#xff0c;也就是40个数字&#xff0c;优先级为[60, 99]即一共40个优先级 目前谈论的Linux操作系统叫做分时操作系统&#xff0c;调度的时候主要强调公平&#xff0c;还有一种是实时操作系统&#xff0c;比如智能汽车里面必须装有这…

网站设计中安全方面都需要有哪些考虑

网站设计中的安全性是一个多方面的问题&#xff0c;需要从多个角度进行考虑和实施。以下是一些关键的安全考虑因素&#xff1a; 数据加密&#xff1a; 使用SSL&#xff08;安全套接字层&#xff09;证书来建立加密连接&#xff0c;确保数据在传输过程中不被截获。定期更新SSL证…

学习IEC 62055付费系统标准

1.IEC 62055 国际标准 IEC 62055 是目前关于付费系统的唯一国际标准&#xff0c;涵盖了付费系统、CIS 用户信息系统、售电系统、传输介质、数据传输标准、预付费电能表以及接口标准等内容。 IEC 62055-21 标准化架构IEC 62055-31 1 级和 2 级有功预付费电能表IEC 62055-41 STS…