06-java面向对象(中)封装与继承

6.1 封装

6.1.1 封装概述

1、为什么需要封装?
  • 适当的封装可以让代码更容易理解与维护,也加强了代码的安全性。

  • 通俗的讲,把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装性的设计思想。

  • 随着我们系统越来越复杂,类会越来越多,那么类之间的访问边界必须把握好,面向对象的开发原则要遵循“高内聚、低耦合”:

    • 高内聚:相关的功能和数据尽可能地组织在同一个类中,各个类内部数据操作细节自己完成,以确保其独立性。

    • 低耦合:各个类之间的依赖关系应尽可能低。也就是说,一个类的变化应尽量减少对其他类的影响。有助于提高软件的可扩展性、可复用性和灵活性。

2、如何实现封装呢?

实现封装就是指控制类或成员的可见性范围?

这就需要依赖访问控制修饰符,也称为权限修饰符来控制。

权限修饰符:private,缺省,protected,public

修饰符本类本包其他包子类其他包非子类
private×××
缺省××
protected×
public

外部类:public和缺省

成员变量、成员方法、构造器、成员内部类:private,缺省,protected,public

6.1.2 成员变量/属性私有化

在面向对象编程中,将成员变量(也称为属性)私有化是一种常见的做法。这样做的目的是保护数据,防止外部直接访问和修改,以确保数据的完整性和安全性。同时,通过提供公共的getter和setter方法来访问和修改这些私有变量,可以更好地控制对这些变量的访问和修改。

1、成员变量封装的目的
  • 隐藏类的实现细节

  • 让使用者只能通过事先预定的方法来访问数据,从而可以在该方法里面加入控制逻辑,限制对成员变量的不合理访问。还可以进行数据检查,从而有利于保证对象信息的完整性。

2、实现步骤
private 数据类型 变量名 ;

代码如下:

public class Person {
    private String name;
    private int age;
    private boolean marry;
}
  1. 提供 getXxx方法 / setXxx 方法,可以访问成员变量,代码如下:

6.1.3 IDEA自动生成get/set方法模板

    IDEA自动生成get/set方法模板
  • 大部分键盘模式按Alt + Insert键。

  • 部分键盘模式需要按Alt + Insert + Fn键。

6.2 继承

6.2.1 继承的概述

继承有延续(下一代延续上一代的基因、财富)、扩展(下一代和上一代又有所不同)的意思。

Java中的继承

如图所示:

多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类中无需再定义这些属性和行为,只需要和抽取出来的类构成某种关系。如图所示:

其中,多个类可以称为子类,也叫派生类;多个类抽取出来的这个类称为父类超类(superclass)或者基类

继承描述的是事物之间的所属关系,这种关系是:is-a 的关系。例如,图中猫属于动物,狗也属于动物。可见,父类更通用或更一般,子类更具体。我们通过继承,可以使多种事物之间形成一种关系体系。

继承的好处
  • 提高代码的复用性

  • 提高代码的扩展性

  • 表示类与类之间的is-a关系

6.2.2 继承的语法格式

通过 extends 关键字,可以声明一个子类继承另外一个父类,定义格式如下:

【修饰符】 class 父类 {
    ...
}
​
【修饰符】 class 子类 extends 父类 {
    ...
}

6.2.3 继承的特点

1.子类会继承父类所有的实例变量和实例方法

从类的定义来看,类是一类具有相同特性的事物的抽象描述。父类是所有子类共同特征的抽象描述。而实例变量和实例方法就是事物的特征,那么父类中声明的实例变量和实例方法代表子类事物也有这个特征。

  • 当子类对象被创建时,在堆中给对象申请内存时,就要看子类和父类都声明了什么实例变量,这些实例变量都要分配内存。

  • 当子类对象调用方法时,编译器会先在子类模板中看该类是否有这个方法,如果没找到,会看它的父类甚至父类的父类是否声明了这个方法,遵循从下往上找的顺序,找到了就停止,一直到根父类都没有找到,就会报编译错误。

所以继承意味着子类的对象除了看子类的类模板还要看父类的类模板。

2.Java只支持单继承,不支持多重继承
public class A{}
class B extends A{}
​
//一个类只能有一个父类,不可以有多个直接父类。
class C extends B{}     //ok
class C extends A,B...  //error
3.Java支持多层继承(继承体系)
class A{}
class B extends A{}
class C extends B{}

顶层父类是Object类。所有的类默认继承Object,作为父类。

4.一个父类可以同时拥有多个子类
class A{}
class B extends A{}
class D extends A{}
class E extends A{}

6.2.4 IDEA中如何查看继承关系

查看继承关系快捷键

例如:选择A类名,按Ctrl + H就会显示A类的继承树。

6.2.5 权限修饰符限制

权限修饰符:private,缺省,protected,public

修饰符本类本包其他包子类其他包非子类
private×××
缺省√(本包子类非子类都可见)××
protected√(本包子类非子类都可见)√(其他包仅限于子类中可见)×
public

外部类:public和缺省

成员变量、成员方法等:private,缺省,protected,public

1、外部类要跨包使用必须是public,否则仅限于本包使用

(1)外部类的权限修饰符如果缺省,本包使用没问题

(2)外部类的权限修饰符如果缺省,跨包使用有问题

2、成员的权限修饰符

(1)本包下使用:成员的权限修饰符可以是public、protected、缺省

(2)跨包下使用:要求严格

(3)跨包使用时,如果类的权限修饰符缺省,成员权限修饰符>类的权限修饰符也没有意义

3、父类成员变量私有化(private)

子类虽会继承父类私有(private)的成员变量,但子类不能对继承的私有成员变量直接进行访问,可通过继承的get/set方法进行访问。如图所示:

6.2.6 方法重写(Override)

我们说父类的所有方法子类都会继承,但是当某个方法被继承到子类之后,子类觉得父类原来的实现不适合于子类,该怎么办呢?我们可以进行方法重写 (Override)

1、方法重写

比如新的手机增加来电显示头像的功能,代码如下:

package com.haogu.inherited.method;
​
public class Phone {
    public void sendMessage(){
        System.out.println("发短信");
    }
    public void call(){
        System.out.println("打电话");
    }
    public void showNum(){
        System.out.println("来电显示号码");
    }
}
​
package com.haogu.inherited.method;
​
//smartphone:智能手机
public class Smartphone extends Phone{
    //重写父类的来电显示功能的方法
    public void showNum(){
        //来电显示姓名和图片功能
        System.out.println("显示来电姓名");
        System.out.println("显示头像");
    }
}
package com.haogu.inherited.method;
​
public class TestOverride {
    public static void main(String[] args) {
        // 创建子类对象
        Smartphone sp = new Smartphone();
​
        // 调用父类继承而来的方法
        sp.call();
​
        // 调用子类重写的方法
        sp.showNum();
    }
}
2、在子类中如何调用父类被重写的方法
package com.haogu.inherited.method;
​
//smartphone:智能手机
public class Smartphone extends Phone{
    //重写父类的来电显示功能的方法
    public void showNum(){
        //来电显示姓名和图片功能
        System.out.println("显示来电姓名");
        System.out.println("显示头像");
​
        //保留父类来电显示号码的功能
        super.showNum();//此处必须加super.,否则就是无限递归,那么就会栈内存溢出
    }
}
3、IDEA重写方法快捷键:Ctrl + O
package com.haogu.inherited.method;
​
//smartphone:智能手机
public class Smartphone extends Phone{
    //重写父类的来电显示功能的方法
    public void showNum(){
        //来电显示姓名和图片功能
        System.out.println("显示来电姓名");
        System.out.println("显示头像");
​
        //保留父类来电显示号码的功能
        super.showNum();//此处必须加super.,否则就是无限递归,那么就会栈内存溢出
    }
​
    @Override
    public void call() {
        super.call();
        System.out.println("视频通话");
    }
}

@Override:写在方法上面,用来检测是不是满足重写方法的要求。这个注解就算不写,只要满足要求,也是正确的方法覆盖重写。建议保留,这样编译器可以帮助我们检查格式,另外也可以让阅读源代码的程序员清晰的知道这是一个重写的方法。

4、重写方法的要求

1.必须保证父子类之间重写方法的名称相同。

2.必须保证父子类之间重写方法的参数列表也完全相同。

2.子类方法的返回值类型必须【小于等于】父类方法的返回值类型(小于其实就是是它的子类,例如:Student < Person)。

注意:如果返回值类型是基本数据类型和void,那么必须是相同

3.子类方法的权限必须【大于等于】父类方法的权限修饰符。

注意:public > protected > 缺省 > private

父类私有方法不能重写

跨包的父类缺省的方法也不能重写

5、方法的重载和方法的重写

方法的重载:方法名相同,形参列表不同。不看返回值类型。

方法的重写:见上面。

(1)同一个类中

package com.haogu.inherited.method;
​
public class TestOverload {
    public int max(int a, int b){
        return a > b ? a : b;
    }
    public double max(double a, double b){
        return a > b ? a : b;
    }
    public int max(int a, int b,int c){
        return max(max(a,b),c);
    }
}

(2)父子类中

package com.haogu.inherited.method;
​
public class TestOverloadOverride {
    public static void main(String[] args) {
        Son s = new Son();
        s.method(1);//只有一个形式的method方法
​
        Daughter d = new Daughter();
        d.method(1);
        d.method(1,2);//有两个形式的method方法
    }
}
​
class Father{
    public void method(int i){
        System.out.println("Father.method");
    }
}
class Son extends Father{
    public void method(int i){//重写
        System.out.println("Son.method");
    }
}
class Daughter extends Father{
    public void method(int i,int j){//重载
        System.out.println("Daughter.method");
    }
}

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

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

相关文章

SQL数据库管理开发工具:DataGrip 2024(win/mac)激活版

JetBrains DataGrip是一款专业的SQL数据库管理开发工具。DataGrip允许您以不同的方式发展模式以及执行信息查询&#xff0c;并提供服务本地文化历史问题记录&#xff0c;可以提高跟踪您的所有学生活动并保护如果您不选择丢失您的工作。DataGrip允许您通过建立相应的操作按名称就…

mPEG-NCO,mPEG-isocyanate常被用于修饰蛋白质、肽或其他具有这些基团的材料组

【试剂详情】 英文名称 mPEG-NCO&#xff0c;mPEG-isocyanate 中文名称 聚乙二醇单甲醚异氰酸酯&#xff0c; 甲氧基-聚乙二醇-异氰酸酯 外观性状 由分子量决定&#xff0c;粘性液体或固体粉末 分子量 400&#xff0c;1k&#xff0c;2k&#xff0c;3.4k&#xff0c;5k&a…

vscode格式化找不到使用...格式化文档

问题记录&#xff1a; 修改一年前的一个项目的时候&#xff0c;忽然发现vscode没有办法对项目进行合理的格式化&#xff0c;但凡保存&#xff0c;因为格式化问题几百个错刷屏。 问题排查&#xff1a; 开始以为是setting.json文件被我修改乱了&#xff0c;复制过来最开始保存的…

HackMyVM-Pwned

目录 信息收集 arp nmap nikto whatweb WEB web信息收集 dirsearch wfuzz FTP ssh连接 提权 get user 系统信息收集 横向渗透 信息收集 arp ┌─[rootparrot]─[~/HackMyVM] └──╼ #arp-scan -l Interface: enp0s3, type: EN10MB, MAC: 08:00:27:16:3d:f8, …

草柴返利APP如何查询领取天猫超市优惠券拿天猫超市购物返利?

草柴返利APP是一款购物省钱工具。通过草柴APP可查询到淘宝、天猫、京东隐藏的大额优惠券及购物返利。今天分享&#xff0c;如何使用草柴返利APP查询领取天猫超市商品的优惠券拿天猫超市购物返利。购物前先领券&#xff0c;确认收货后再拿返利&#xff1b; 草柴返利APP如何查询领…

带你读论文第十期:上海人工智能实验室、ICCVW最佳论文奖,钟怡然博士分享...

Datawhale论文 来源&#xff1a;WhalePaper&#xff0c;负责人&#xff1a;芙蕖 WhalePaper简介 由Datawhale团队成员发起&#xff0c;对目前学术论文中比较成熟的 Topic 和开源方案进行分享&#xff0c;通过一起阅读、分享论文学习的方式帮助大家更好地“高效全面自律”学习&…

读天才与算法:人脑与AI的数学思维笔记01_洛夫莱斯测试

1. 创造力 1.1. 创造力是一种原动力&#xff0c;它驱使人们产生新的、令人惊讶的、有价值的想法&#xff0c;并积极地将这些想法付诸实践 1.2. 创造出在表面上看似新的东西相对容易 1.3. 在遇到偶然间的创造性行为时&#xff0c;都会表现得异…

多维时序 | Matlab实现TCN-LSTM时间卷积长短期记忆神经网络多变量时间序列预测

多维时序 | Matlab实现TCN-LSTM时间卷积长短期记忆神经网络多变量时间序列预测 目录 多维时序 | Matlab实现TCN-LSTM时间卷积长短期记忆神经网络多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.【Matlab实现TCN-LSTM时间卷积长短期记忆神经网络多变量…

10分钟学会提示词工程

以下是我制作ppt的截图,更多内容可以下载对应ppt自己学习哈~

zabbix解析以及安装

目录 目录 zabbix 是什么&#xff1f; 监控主要功能 zabbix 监控原理&#xff1a; zabbix运行机制 Zabbix的监控方式 Zabbix监控系统监控对象 Zabbix的优缺点 Zabbix的缺点 zabbix主要特点 zabbix 监控部署在系统中&#xff0c;包含常见的五个程序: 监控的架构 3.maste…

WebApis知识总结以及案例(续3)

综合案例 小兔鲜页面注册 分析业务模块 发送验证码模块 用户点击之后&#xff0c;显示05 秒后重新获取 时间到了&#xff0c;自动改为重新获取 //1.发送短信验证码模块const codedocument.querySelector(.code)let flagtrue//通过一个变量来控制 节流阀 // 1.1 点击事件co…

布局香港之零售中小企篇 | 传承之味,迈向数字化经营的时代

随着内地与香港两地经贸合作日渐紧密&#xff0c;越来越多内地消费品牌将目光投向香港这片充满机遇的热土&#xff0c;纷纷入驻香港市场。「北店南下」蔚然成风&#xff0c;其中不乏已在内地市场深耕多年的传统老字号。数字化经营时代&#xff0c;老字号焕新刻不容缓&#xff0…

Vue3 笔记

vue3笔记 1. Vue3简介1.1. 【性能的提升】1.2.【 源码的升级】1.3. 【拥抱TypeScript】1.4. 【新的特性】 2. 创建Vue3工程2.1. 【基于 vue-cli 创建】2.2. 【基于 vite 创建】(推荐)2.3. 【一个简单的效果】 3. Vue3核心语法3.1. 【OptionsAPI 与 CompositionAPI】Options API…

四川古力未来科技抖音小店:科技魅力绽放,专业品质引领未来

随着互联网的快速发展&#xff0c;电商平台已成为消费者购买商品的重要渠道之一。在众多电商平台中&#xff0c;四川古力未来科技抖音小店以其独特的科技魅力和专业品质&#xff0c;吸引了众多消费者的目光。今天&#xff0c;我们就来一起探讨这家小店背后的故事&#xff0c;看…

代码随想录阅读笔记-回溯【分割回文串】

题目 给定一个字符串 s&#xff0c;将 s 分割成一些子串&#xff0c;使每个子串都是回文串。 返回 s 所有可能的分割方案。 示例: 输入: "aab" 输出: [ ["aa","b"], ["a","a","b"] ] 思路 本题这涉及到两个关…

专题:数据资产化技术

点击上方蓝字关注我们 2024年1月&#xff0c;数据资产入表工作启动&#xff0c;这是以数据为关键要素的数字经济发展过程中迈出的一大步。在官方认可数据资产可以入表后&#xff0c;接下来的问题是&#xff0c;数据资产如何入表&#xff1f;即数据资产化如何实现&#xff1f;由…

WPS二次开发系列:WPS SDk功能就概览

作者持续关注WPS二次开发专题系列&#xff0c;持续为大家带来更多有价值的WPS开发技术细节&#xff0c;如果能够帮助到您&#xff0c;请帮忙来个一键三连&#xff0c;更多问题请联系我&#xff08;QQ:250325397&#xff09; 作者通过深度测试使用了WPS SDK提供的Demo&#xff0…

轻松上手MYSQL:MYSQL初识(上)

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《MYSQL入门》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 轻松上手MYSQL&#xff1a;从零开始构建你的数据库世界 &#x1f680; &#x1f680;欢迎来到My…

pmp认证考试一年有几次,报名复杂吗?

PMP认证怎么报名&#xff1f;PMP培训机构怎么看是否靠谱&#xff1f; PMP认证报名官方有一个流程图&#xff0c;大家可以参考一下这几个步骤&#xff0c;如果你先前没有了解过PMP的话可能看着有点乱&#xff0c;但是如果是在机构培训后考试的就会觉得简单&#xff0c;毕竟这些…

ip数据报

IP数据报格式详解 在 TCP/IP 协议中&#xff0c;使用 IP 协议传输数据的包被称为 IP 数据包&#xff0c;每个数据包都包含 IP 协议规定的内容。IP 协议规定的这些内容被称为 IP 数据报文&#xff08;IP Datagram&#xff09;或者 IP 数据报。 IP 数据报文由首部&#xff08;称…