【Java】的面向对象笔记(中)

news2024/11/23 12:16:33

继承性基础

哲学三问

什么是继承性

银行卡有很多种,有借记卡、信用卡、亲情卡、工资卡等等,他们各有不同,但都具有相同的银行卡特征,即余额、卡号等共有的属性,如果每定义一个类都需要写一次,那就太麻烦了。有没有什么办法抽取出相同特征呢?

利用继承性,我们可以在银行卡类中定义共同特征,然后将单独的特征再定义。

在Java 中,继承的关键字用的是“extends”,即子类不是父类的子集,而是对父类的“扩展”

为什么需要继承性(优点)

  1. 减少代码冗余,提高代码复用性

  2. 便于功能拓展

    如果现在所有的银行卡都需要添加实名登记功能,那么我们就可以在父类中直接写,通过继承,其他子类自然可以获得这个功能,不必每个都写一遍。

  3. 为多态性提供了基础

怎么使用

extends关键字

class A extends B{}

  • A: 子类、派生类、subclass

  • B: 父类、超类、基类、superclass

例如现在要让Student类继承Person类

public class Student extends Person{}

调用时可以直接当作自己的来用

Student stu = new Student("Math");
stu.setName("yuan");
stu.setAge(18);
System.out.println("student " + stu.getName() + " is " + stu.getAge() + " years old, and his/her major is " + stu.getMajor() + ".");

此时此刻我想起一句歌词。哦~~爸爸妈妈给我的不少不多~~~~

一旦子类A继承父类B以后,子类A中就获取了父类B中声明的所有的属性和方法。不过,如果是父类中的private私有属性和方法呢?

私有属性、方法继承

一般地,我们可以浅显地理解为:继承了。但是不能直接使用,必须通过共有方法来操作。私有方法也是,必须通过共有方法来进行调用。

继承规则

但是这只是表象,如果你深入理解,会发现完全不是这样,并且这个理解在逻辑上有漏洞:既然继承了这个属性和方法,就应该能够在自己的类中进行调用,你父类的私有属性和方法自己都可以调用,为什么我子类的私有方法就不行,天生低人一等?现在这个情况即使使用封装性来解释也是差强人意。

来看官方的解释:

Private Members in a Superclass

A subclass does not inherit the private members of its parent class. However, if the superclass has public or protected methods for accessing its private fields, these can also be used by the subclass.

A nested class has access to all the private members of its enclosing class—both fields and methods. Therefore, a public or protected nested class inherited by a subclass has indirect access to all of the private members of the superclass.

翻译一下:(第二句话涉及内部类,如果没接触过可以先忽略)

父类中的私有成员

子类不会继承父类的private私有成员。然而,如果父类有publicprotected 方法能够访问它的私有属性,那这些属性就可以被子类使用。

内部类可以访问其外部类的所有私有成员,包括属性和方法。因此,由子类继承的publicprotected 的内部类可以间接访问父类的所有私有成员。

也就是说,子类会继承publicprotected 的成员。

分析内存后,会发现,当一个子类被实例化的时候,默认会先调用父类的构造方法对父类进行初始化,即在内存中创建一个父类对象,然后再父类对象的外部放上子类独有的属性,两者合起来成为一个子类的对象。

说人话就是:

实际上并没有被继承,但是,子类在创建时会附带着创建父类对象,因此父类对象中的private属性虽然对我来说不可见,但是我拥有你的公共方法,通过公共方法可以来对你进行操作。

为什么要这样做呢?

这样的设计的意义就是我们可以用这个方法将我们的成员保护得更好,让子类的设计者也只能通过父类指定的方法修改父类的私有成员,这样将能把类保护得更好,这对一个完整的继承体系是尤为可贵的。

关于继承性的规定

  1. 一个类可以被多个子类继承。
  2. Java中类的单继承性:一个类只能有一个父类
  3. 子父类是相对的概念。
  4. 子类直接继承的父类,称为:直接父类。间接继承的父类称为:间接父类
  5. 子类继承父类以后,就获取了直接父类以及所有间接父类中声明的属性和方法

多层继承image-20230115150903755

所有类的父类Object

  1. 如果我们没有显式的声明一个类的父类的话,则此类继承于java.lang.Object

  2. 所有的java类(除java.lang.Object类之外)都直接或间接的继承于java.lang.Object

  3. 意味着,所有的java类具有java.lang.Object类声明的功能。

Object

练习

  1. 根据下图实现类。在CylinderTest类中创建Cylinder类的对象,设置圆柱的底面半径和高,并输出圆柱的体积。
image-20230115170913977
public class Cylinder extends Circle {
    private double length;

    public Cylinder() {
        length = 1.0;
    }

    public double getLength() {
        return length;
    }

    public void setLength(double length) {
        this.length = length;
    }

    public double findVolume() {
        return findArea() * length;
    }   
}
public class Circle {
    private double radius;

    public Circle() {
        radius = 1.0;
    }

    public double getRadius() {
        return radius;
    }

    public void setRadius(double radius) {
        this.radius = radius;
    }

    public double findArea(){
        return Math.PI * Math.sqrt(radius);
    }   
}

这是测试方法

public static void main(String[] args) {
       Cylinder cylinder = new Cylinder();
       cylinder.setRadius(2.0);
       cylinder.setLength(3.0);
       double volume = cylinder.findVolume();
       System.out.println("底面半径为" + cylinder.getRadius() + ",高为" +
       cylinder.getLength() + "的圆柱,它的体积为:" + cylinder.findVolume());
    }

方法的重写

方法的重写(override / overwrite)

什么是重写

子类继承父类以后,可以对父类中同名同参数的方法,进行覆盖操作

为什么要重写

有时父类的方法并不适合子类,需要重写修改方法体。

怎么重写

方法的声明

权限修饰符 返回值类型 方法名(形参列表) throws 异常的类型 {
//方法体
}

约定俗成:子类中的叫重写的方法,父类中的叫被重写的方法

  • 子类重写的方法的方法名和形参列表与父类被重写的方法的方法名和形参列表相同

重写方法的权限

子类重写的方法的权限修饰符大于等于父类被重写的方法的权限修饰符

  • 特殊地:子类不能重写父类中声明为private权限的方法

返回值

  • 父类被重写的方法的返回值类型是void,则子类重写的方法的返回值类型只能是void

  • 父类被重写的方法的返回值类型是A类型,则子类重写的方法的返回值类型可以是A类或A类的子类

  • 父类被重写的方法的返回值类型是基本数据类型(比如:double),则子类重写的方法的返回值类型必须是相同的基本数据类型(必须也是double)

异常抛出

子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型(具体放到异常处理时候讲)

例外:静态方法

子类和父类中的同名同参数的方法要么都声明为非static的(这时候是重写),要么都声明为static的(不是重写)。

练习

public class Circle {
    private double radius;

    public Circle() {
        radius = 1.0;
    }
    public double getRadius() {
        return radius;
    }
    public void setRadius(double radius) {
        this.radius = radius;
    }
    public double findArea(){
        return Math.PI * getRadius() * getRadius();
    }
}

定义一个Cylinder类,重写findArea()计算圆柱表面积

答案:

public class Cylinder extends Circle {
    private double length;

    public Cylinder() {
        length = 1.0;
    }

    public double getLength() {
        return length;
    }

    public void setLength(double length) {
        this.length = length;
    }
    //计算体积
    public double findVolume() {
        // return findArea() * length;
        return Math.PI * getRadius() * getRadius() * getLength();
    }

    @Override
    public double findArea() {
        return Math.PI * this.getRadius() * this.getRadius() * 2 
        + Math.PI * this.getRadius() * 2 * this.getLength();
    }
}

protected修饰符

还记得我们学修饰符时省略了protected吗?现在是时候去验证一下了。

public class Student extends Person{
	protected String major;
}

在另一个包下创建新的类,试试调用

public class Doctor {
    String work;
    public Doctor() {
        this.age = 1;//这时会报错
    }
}

为什么会报错呢?protected的描述是不同包下子类,原来是没有加继承关键字,加上后就可以了。提醒自己不要忘记哦~~

public class Doctor extends Student {
    String work;

    public Doctor() {
        this.age = 1;
    }

面试题

面试题:区分方法的重载与重写

答案:

方法的重写Overriding和重载Overloading是Java多态性的不同表现。

重载,是一个类中多态性的一种表现,是同一方法在面对不同参数时有不同的方法对应。记住“两同一不同”:相同类,相同方法名,不同形参。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了。

重写,父类与子类之间多态性的一种表现,是子类对父类方法相同方法的覆盖,子类重写的是父类中同名同参数的方法。也就是相同参数时,使用不同的方法来对应。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。

本文参考:

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

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

相关文章

word、excel文档内容更新技术方案

需求背景 惯例先说下背景。 生产、研发业务上往往使用大量word和excel文档来作为资料载体,如操作规程、控制手册、卡片……,这些文档会反复使用到一些设备、工艺等参数数据。参数属性主要是名称、编码、正常范围、报警上下限、单位等,这些参…

SQL---DDL

目录 一、数据库的相关概念 二、MySQL数据库 1. 关系型数据库(RDBMS) 2. 数据数据库 3. MySQL客户端连接的两种方式 方式一:使用MySQL提供的客户端命令行工具 方式二:使用系统自带的命令行工具执行指令 三、SQL SQL的…

Callable接口_JUC的常见类_多线程环境使用ArrayList

目录 1.Callable接口 相关面试题 2.ReentrantLock 相关面试题 3.信号量Semaphore 4.CountDownLatch 5.多线程环境使用ArrayList 热加载 1.Callable接口 Callable是一个接口,把线程封装了一个"返回值",方便程序员借助多线程的方式计算结果. 类似于Runnable,…

五个了解自己天赋优势的分析工具(三)DISC性格测评

DISC性格测评 DISC系统源于1928年,马斯顿在他的著作《正常人的情绪》(The Emotion of Normal People)中公布了他所发现及发展的性格理论。 该书首次尝试将心理学从纯粹的临床应用向外延伸应用到一般人身上。人有四种基本的性向因子,即Dominance -支配&…

Duet 安装教程

Duet 安装教程1. Duet 概述2. Duet 安装教程2.1 PC 端下载安装Duet2.2 iPad 下载安装 Duet3. 将iPad作为Windows电脑副屏的几种方法结束语1. Duet 概述 Duet 是一款能将iPad或iPhone 变成 Mac 或者 PC 的显示屏的软件; 通过线材连接两台不同的设备,Duet…

抖音聊天”上线,字节最后的社交梦?

转眼间时间来到2023年,距离中国接入国际互联网(即中国互联网起点)已过40年。回顾中国的互联网江湖,先有BAT三足鼎立,后有TMD后浪居上。所谓BAT,即互联网时代领头羊百度、阿里巴巴和腾讯,而TMD则…

【Java入门】常量和变量

✅作者简介:CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1🏆 📃个人主页:hacker707的csdn博客 🔥系列专栏:Java入门 💬个人格言:不断的翻越一座又一…

HTTP/HTTPS协议介绍

数据来源 HTTP 01 什么是HTTP 超文本传输协议(HyperTextTransferProtocol缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。 HTP( Hyper Text Transfer Protocol超京本传输协议) 是一个基于请求与响应 无状态的,应用层…

mysql快速生成100W条测试数据(7)虚拟网站、IP地址并存入mysql数据库

这是之前的文章里面包含一些以前的一些操作流程可以进行参考学习 更加详细操作步骤在第一篇文章里面 mysql快速生成100W条测试数据(1):游戏人物数据 mysql快速生成100W条测试数据(2)公司员工信息 mysql快速生成100W条测…

《Unity Shader 入门精要》第2章 渲染流水线

第2章 渲染流水线 2.1 什么是渲染流水线 渲染流水线的工作在于由一个三维场景出发,生成一张二维图像。换句话说,计算机需要从一系列的顶点数据、纹理等信息出发,把这些信息最终转换成一张肉眼可见的图像,而这个过程通常由CPU与G…

静态链接过程分析

前期准备这边使用《程序员的自我修养》中的例子//a.cpp extern int shared;void swap(int* a, int *b);int main(){int a 100;swap(&a, &shared); }//b.cpp int shared 1;void swap(int* a, int* b){*a ^ *b ^ *a ^ *b; }通过gcc -c 命令编译出相对应的.o文件&#x…

五,Spring Bean生命周期

1 Spring Bean的生命周期(概念重点) 对象的生命周期:对象从生到死的过程。 Spring工厂中Bean的生命周期并不像想象的那么简单,Spring对工厂中的Bean的生命周期进行了细致的划分,并允许开发者通过编码或配置的方式定制…

Ubuntu18 sqlyog配置mysql5.7远程连接

mysql 配置远程连接 1. mysql安装和配置 sudo apt-get install mysql-server-5.7 systemctl status mysql service mysql status修改mysql的配置文件: sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf以下为mysqld.cnf文件主要内容,这里的skip-grant-ta…

基于51单片机的pm2.5空气质量监测仪仿真设计

51单片机pm2.5监测仪仿真设计( proteus仿真程序报告讲解视频) 仿真图proteus 7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0032 51单片机pm2.5监测仪仿真设计主要功能:讲解演示视频仿真程序设计…

代码整洁提升方案

验-言 公共方法都要做参数的校验,参数校验不通过明确抛出异常或对应响应码: Java Bean验证已经是一个很古老的技术了, 会避免我们很多问题; 在接口中也明确使用验证注解修饰参数和返回值, 作为一种协议要求调用方按…

win11 arm 系统安装安卓子系统

一般的x86电脑如果安装android子系统,运行安卓子系统,由于要将android arm代码转译为x86代码,所以效率不一定高,但是如果电脑是arm架构的,通过安卓子系统运行android的程序执行效率就会 高不少,本文参考,都…

JVM面试题

Java内存区域 说一下 JVM 的主要组成部分及其作用? JVM包含两个子系统和两个组件,两个子系统为Class loader(类装载)、Execution engine(执行引擎);两个组件为Runtime data area(运行时数据区)、Native Interface(本地接口)。 Class loader…

Es6的Promise

Promise是异步编程的一种解决方案。简单来说Promise就是一个用来存储数据的对象,它有着一套特殊的存取数据的方式。可以解决异步回调函数/回调地狱问题。创建Promise1.创建Promise时需要一个 回调函数 作为参数这个回调函数会在Promise时 自动调用2.调用回调函数时&…

基于matlab的指纹图像处理、脊线增强、脊线分割、脊线细化、细节点检测和细节点验证

需求分析对于指纹的特征提取包含几个步骤,脊线增强、脊线分割、脊线细化、细节点检测和细节点验证,本次大作业需要针对已经增强的指纹图片进行后续几个步骤,通过多种形态学算法进行分割、细化、细化后处理,找到其中的端点和分叉点…

elasticsearch基础2——es配置文件、jvm配置文件详解

文章目录一、配置文件详解1.1 elasticsearch.yml文件1.1. 1 基础参数1.1.1.1 自定义数据/日志目录1.1.1.2 锁定物理内存1.1.1.3 跨域设置1.1.1.4 其他参数1.1.2 集群类1.1.3 分片类1.1.4 IP绑定类1.1.5 端口类1.1.6 交互类1.1.5 Xpcak安全认证1.1.5.1 xpack内置用户1.1.5.2 xpa…