【我与Java的成长记】之封装,继承详解(一)(能看懂文字就能明白系列)

news2024/11/17 9:52:26

在这里插入图片描述

系列文章目录

能看懂文字就能明白系列
C语言笔记传送门
Java笔记传送门
🌟 个人主页:古德猫宁-

🌈 信念如阳光,照亮前行的每一步


文章目录

  • 系列文章目录
    • 🌈 *信念如阳光,照亮前行的每一步*
  • 前言
  • 一、封装(Encapsulation)
    • 封装的概念
    • 封装举例
    • 访问限定符
  • 二、继承(Inheritance)
    • 继承的概念
    • 继承的语法
    • 父类成员的访问
      • 1、子类中访问父类的成员变量
      • 2、子类中访问父类的成员方法


前言

面向对象的开发范式其实是对现实世界的理解和抽象的方法,那么具体如何将现实世界抽象成代码呢?这就需要运用面向对象的三大基本特征,分别是封装,继承,多态。

本节目标:

  1. 封装
  2. 继承

本节重点:都是重点


一、封装(Encapsulation)

封装的概念

所谓封装,就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的类或者对象隐藏信息
比如:对于电脑这样一个复杂的设备,提供给用户的就只是:开关机,通过键盘输入,显示器USB插孔等,让用户和计算机进行交互,完成日常事物。但实际上:电脑真正工作的确却是CPU,显卡,内存等一些硬件元件。
对于计算机使用者而言,不用关心内部核心部件,比如主板上线路是如何布局的,CPU内存是如何设计的等,用户只需知道,怎么开机,怎么通过键盘和鼠标与计算机进行交互即可。因此计算机厂商在出厂时,在外部套上壳子,将内部实现细节隐藏起来,仅仅对外提供开关机,鼠标以及键盘插孔等,让用户可以与计算机进行交换即可。

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互

封装举例

举个简单的例子:

class Rectangle {
    private int length;//被private修饰的成员变量只能在类中访问,不能被其他类访问
    private int width;
    public Rectangle(int length,int width){//构造方法
        this.length = length;
        this.width = width;
    }
    public int area(){//获得矩形面积
        return this.length*this.width;
    }
}
public class test1{
    public static void main(String[] args) {
        Rectangle rectangle = new Rectangle(3,9);
        System.out.println(rectangle.area());
    }
}

在这里插入图片描述

在上面的代码中有两个类,Rectangle类中的width和length被private修饰,所以只能在Rectangle类中访问,不能被其他类访问,这时我们可以借助 area方法计算并返回值,然后在test1类中调用area方法获得值并输出,如果要在test1访问Rectangle类中的length编译器则会报错。

访问限定符

Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者成员变量能否直接在类外使用。Java提供了四种访问限定符。
在这里插入图片描述
在这里插入图片描述
注意:

  • default权限指:什么都不写时的默认权限。
  • 访问权限除了可以限定类中的成员的可见性,也可以控制类的可见性。
  • 一般情况下成员变量设置为private,成员方法设置为public。

二、继承(Inheritance)

继承的概念

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

比如:猫和狗,它们是动物
那我们用java可以这样设计:

//dog
public class Dog {
    String name;
    int age;
    public void bark(){
        System.out.println(name+"正在汪汪叫");
    }
    public void eat(){
        System.out.println(name+"正在吃饭");
    }
}

//Cat
public class Cat {
    String name;
    int age;
    public void maiomiao(){
        System.out.println(name+"正在喵喵叫");
    }
    public void eat(){
        System.out.println(name+"正在吃饭");
    }
}

观察上面的两段代码,我们发现猫和狗类中存在大量重复,如图所示:
在这里插入图片描述
这时候我们就可以将这些共性抽取出来,实现代码复用,即继承。

继承的语法

在Java中如果要表示类之间的继承关系,需要借助extends关键字,具体如下:

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

注意:

  1. 子类会将父类中的成员变量或者成员方法继承到子类中。
  2. 子类继承父类之后,必须要新添加自己特有的成员,体现出与父类的不同,否则就没必要继承了。

那我们就可以尝试对上面的猫类和狗类的代码进行优化了
比如:我们可以创建一个动物类,专门来放猫和狗的共性

public class Animal {
    int age;
    String name;
    public void eat(){
        System.out.println(name+"正在吃饭");
    }
}

class Dog extends Animal{
    public void bark(){
        System.out.println(name+"正在汪汪叫");
    }
}
class Cat extends Animal{
    public void maiomiao(){
        System.out.println(name+"正在喵喵叫");
    }
}
public class test1{
    public static void main1(String[] args) {
        Dog dog = new Dog();//实例化对象
        System.out.println(dog.age);// dog类中并没有定义任何成员变量,
        System.out.println(dog.name);// name和age属性肯定是从父类Animal中继承下来的
        dog.eat();// dog访问的eat()方法也是从Animal中继承下来的
    }
}

在这里插入图片描述
在这里插入图片描述
上述图示中,Dog和Cat都继承了Animal类,其中:Animal类称为父类/基类或者超类,Dog和Cat可以称为Animal的子类/派生类,继承之后,子类可以复用父类中成员,子类在实现时只需关心自己新增的成员即可。

从继承概念中可以看出继承最大的作用就是:实现代码复用,还有就是来实现多态(后面讲到)

父类成员的访问

在继承体系中,子类将父类中的方法和字段继承下来了,那在子类中能否直接访问父类继承下来的成员呢?

1、子类中访问父类的成员变量

一、子类和父类不存在同名成员变量
成员变量访问遵循“就近原则”,自己有的话优先访问自己的,如果没有则向父类中找。
例如:

class Base{
    int a;
    int b;
}
public class Derived extends Base{
    int c;
    public void method(){
        a = 10;//自己没a,所以访问从父类中继承下来的a
        b = 20;//同上
        c = 30;//自己有c,所以访问子类自己的c
    }
}

二、子类和父类成员存在同名成员变量

class Base{
    int a;
    char b;
}
public class Derived extends Base{
    int a;// 与父类中成员a同名,且类型相同
    char b = 10; // 与父类中成员b同名,但类型不同
    int c;
    void method(){
        a = 100;//按照”就近原则“,所以访问子类自己的
        b = 200;//按照”就近原则“,所以访问子类自己的
        c = 300;
    }
}

总结:

  1. 如果访问的成员变量子类中有,优先访问自己的成员变量。
  2. 如果访问的成员变量子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错。
  3. 如果访问的成员变量与父类中成员变量同名,则优先访问自己的
  4. 成员变量访问遵循就近原则,自己有优先访问自己的,如果没有则向父类中找。

2、子类中访问父类的成员方法

一、成员方法名字不同(与上面的规则相同)

class Base{
    public void methodFu(){
        System.out.println("调用父类的成员方法");
    }
}
public class Derived extends Base{

    public void methodzi(){
        System.out.println("调用子类的成员方法");
    }
    public void method(){
        methodFu();//访问父类继承的methodFu()
        methodzi();//访问子类自己的methodzi()
        //methodwu();编译失败,在整个继承体系中没有发现方法methodwu()
    }
}

二、成员方法名字相同(规则略有不同)

class Base{
    public void methodA(){
        System.out.println("调用父类的成员方法A");
    }
    public void methodB(){
        System.out.println("调用父类的成员方法B");
    }
}
public class Derived extends Base{

    public void methodA(){
        System.out.println("调用子类的成员方法A");
    }
    public void methodB(){
        System.out.println("调用子类的成员方法B");
    }
    public void methodC(){
        methodA();//直接访问,则永远访问到的都是子类中的方法,父类的无法访问到。
        methodB();
    }
    public static void main(String[] args) {
        Derived derived = new Derived();
        derived.methodC();
    }

}

运行结果:
在这里插入图片描述
不同之处:
在这里插入图片描述
总结:

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

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

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

相关文章

美国NDC药品码注册详细介绍(OTC药品FDA注册)

美国药品验证号(NDC)注册介绍 希望我发布的文章能帮助到刷到的有缘人 国家药品验证号(NDC)是中国中药及OTC非处方药通过FDA认证的快捷申请形式。主要针对美国国家药典已有的药,无需做新药论证,只需提供必…

Mysql :Failed to obtain JDBC Connection

驱动版本需要跟新&#xff0c;同时驱动对应的pom依赖需要更新成mysql驱动对应版本&#xff0c;这里使用8.0.26版本。 <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql-connector}<…

C++八股学习心得.8

1.const知道吗&#xff1f;解释其作用 const 修饰类的成员变量&#xff0c;表示成员常量&#xff0c;不能被修改。 const修饰函数承诺在本函数内部不会修改类内的数据成员&#xff0c;不会调用其它非 const 成员函数。 如果 const 构成函数重载&#xff0c;const 对象只能调…

你好,2024!再见,2023!

大家好&#xff0c;我是南城余&#xff01; 今天是2023年最后一天&#xff0c;看到各位大佬都在分享今年的总结&#xff0c;我也来做个年度总结&#xff0c;是第一次做年度总结&#xff0c;希望以后可以每年都做一个好好的回顾。 说来可笑&#xff0c;标题&#xff0c;2023怎么…

高光谱分类论文解读分享之基于生成对抗性少数过采样的高光谱图像分类

IEEE TGRS 2022&#xff1a;基于生成对抗性少数过采样的高光谱图像分类 题目 Generative Adversarial Minority Oversampling for Spectral–Spatial Hyperspectral Image Classification 作者 Swalpa Kumar Roy , Student Member, IEEE, Juan M. Haut , Senior Member, IE…

DC-DC升压/降压 隔离电源解决方案PCB和原理图

DC-DC隔离电源模块是一种基于变换原理而设计的模块,可以将一种电压转变为另一种电压,同时实现电气信号的隔离和滤波作用。其工作原理基于电感和电容的原理,一般由输入电路、输出电路、开关电路和控制电路四部分组成。 DC-DC电源模块的众多优点是大家众所周知的&#xff0c;DC-…

Hyperledger Fabric 权限策略和访问控制

访问控制是区块链网络十分重要的功能&#xff0c;负责控制某个身份在某个场景下是否允许采取某个操作&#xff08;如读写某个资源&#xff09;。 常见的访问控制模型包括强制访问控制&#xff08;Mandatory Access Control&#xff09;、自主访问控制&#xff08;Discretionar…

学生用台灯多少瓦比较合适?适合学生用的护眼台灯推荐

近年来&#xff0c;随着电子产品的普及和使用时间的增长&#xff0c;人们对眼部健康的关注度也越来越高为了解决这一问题&#xff0c;护眼台灯便是在这样的背景下诞生的。护眼台灯是一种集成了先进技术的台灯&#xff0c;旨在减轻眼部疲劳和保护视力。学生是使用台灯的一大群体…

抖店新手如何申请开店?

我是电商珠珠 抖店大家都知道&#xff0c;热度高门槛低&#xff0c;所以有很多人都想去入驻。但是对于开店流程&#xff0c;还不太了解。 今天&#xff0c;我就来给大家详细的讲一下。 一、入驻前准备 在入驻之前&#xff0c;需要准备好一张营业执照&#xff0c;新手的话个…

JavaWeb——后端AOP面向特定方法编程

七、AOP 1. 概述 AOP&#xff08;Aspect Oriented Programming&#xff09;&#xff1a;面向切面编程、面向方法编程&#xff0c;其实就是面向特定方法编程 场景&#xff1a; 案例部分功能运行较慢&#xff0c;定位执行耗时较长的业务方法&#xff0c;此时需要统计每个业务…

linux安装node.js

先去官网下载对应的版本 官网&#xff1a;https://nodejs.org/en/download 选择对应的版本&#xff0c;点这个&#xff0c;直接去虚拟机上面安装 # apt的系统 apt install -y wget # yum的系统 yum install -y wget下载包 wget https://nodejs.org/dist/v20.10.0/node-v20.…

后端程序员开发win小工具(未完待续)

github&#xff1a;https://gitee.com/forgot940629/win-tool-demo 本地启动&#xff0c;查看http://127.0.0.1:8080/form 场景 在日常工作中可能需要后端开发者开发一些辅助工具。这些辅助工具通常希望能想其他软件一样在桌面系统运行&#xff0c;并且有一些桌面应用的基本…

股票开户须知!北京股票开户佣金最低是多少?找那家证券公司开户手续费低?

股票交易是一种投资活动&#xff0c;需要一些基本的须知来帮助投资者进行决策和进行交易。以下是一些股票交易的基本须知&#xff1a; 了解股票市场&#xff1a;了解股票市场的基本原理、运作机制和相关法规是非常重要的。投资者应学习股票交易的基本概念和术语&#xff0c;了解…

BERT 模型是什么

科学突破很少发生在真空中。相反&#xff0c;它们往往是建立在积累的人类知识之上的阶梯的倒数第二步。要了解 ChatGPT 和 Google Bart 等大型语言模型 &#xff08;LLM&#xff09; 的成功&#xff0c;我们需要回到过去并谈论 BERT。 BERT 由 Google 研究人员于 2018 年开发&…

【算法练习】leetcode算法题合集之二叉树篇

递归遍历基础篇 前序遍历&#xff0c;中序遍历&#xff0c;后序遍历是根据处理根节点的位置来命名的。 树的处理大多用到了递归&#xff0c;递归需要知道终止条件。 前序遍历&#xff08;中左右&#xff09; 144.二叉树的前序遍历 中左右&#xff0c;先处理根节点&#xff0c;…

简单易懂的PyTorch激活函数大全详解

目录 torch.nn子模块Non-linear Activations nn.ELU 主要特点与注意事项 使用方法与技巧 示例代码 图示 nn.Hardshrink Hardshrink函数定义 参数 形状 示例代码 图示 nn.Hardsigmoid Hardsigmoid函数定义 参数 形状 示例代码 图示 nn.Hardtanh HardTanh函数…

湖南大学-数据库系统-2018期末考试解析

【写在前面】 这是2018年的卷子&#xff0c;复习备考的时候做了并与同学校对了答案。答案仅供参考。这张难度不大&#xff0c;同样的&#xff0c;跟前几张差不了太多。但是从这一年开始&#xff0c;选择题变成了15道&#xff0c;越来越贴切近几年的考试了。 一、单选题&#xf…

基于SpringBoot摄影跟拍预定管理系统(系统+数据库+文档)

&#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目 希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;摘 要 首先,一开始便是清楚的论…

揭秘证券公司网站部署的SSL证书品牌

近日&#xff0c;有多家证券公司因网络安全问题被点名&#xff0c;由此&#xff0c;建立完善的网络安全管理制度、采用适当的安全策略和工具&#xff0c;以营造安全的网络环境&#xff0c;更好的保护用户隐私和业务安全就显得尤为重要。SSL证书作为保护传输数据安全的重要工具&…