【Java SE语法篇】8.面向对象三大特征——封装、继承和多态

在这里插入图片描述

📚博客主页:爱敲代码的小杨.

✨专栏:《Java SE语法》

❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️

文章目录

  • 1. 封装
    • 1.1 封装的概念
    • 1.2 为什么封装
    • 1.3 封装的实现步骤
  • 2. 继承
    • 2.1 继承的概念
    • 2.2 继承的格式
    • 2.3 为什么继承
    • 2.4 继承类型
    • 2.5 继承特性
    • 2.6 super 与 this 关键字
    • 2.7 final 关键字
  • 3. 多态
    • 3.1 多态的概念
    • 3.2 多态的优点
    • 3.3 多态存在的三个必要条件
    • 3.4 instanceof 关键字

面向对象三大特性:封装、继承和多态。

1. 封装

1.1 封装的概念

在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。
封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
要访问该类的代码和数据,必须通过严格的接口控制。
封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。
适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。

1.2 为什么封装

封装的目的是保护数据的安全和完整性,同时隐藏数据的实现细节,提高代码的可维护性和可扩展性,具体有以下几个方面的好处:

  • 良好的封装能够减少耦合。
  • 类内部的结构可以自由修改。
  • 可以对成员变量进行更精确的控制。
  • 隐藏信息,实现细节。

1.3 封装的实现步骤

  1. 修改属性的可见性来限制属性的访问(用private来修饰),如:

    public class Test {private String name;private int age;
    }
    

    这段代码中,将name age 属性设置为私有的,只有在本类中被访问,其他类访问不了,就实现对信息的隐藏。

  2. 对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问,例如:

    public class Test {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
    }
    

    采用 this 关键字是为了解决实例变量和局部变量之间发生的同名的冲突。

2. 继承

2.1 继承的概念

继承是 java 面向对象编程技术的一块基石,因为它允许创建分等级层次的类。

继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

生活中的继承

image-20231124152011118

兔子和羊属于食草动物,狮子和老虎属于食肉动物。

食草动物和食肉动物又是属于动物。

所有的继承需要符合的关系:is-a,父类更通用,子类更具体

虽然食草动物和食肉动物都是属于动物,但是两者的属性和行为上有差别,所以子类会具有父类的一般特性也会具有自身的特性

2.2 继承的格式

Java 中通过关键字 extends 来声明一个类是从另一个类继承而来的,一般格式如下:

class 父类 {}
class 子类 extends 父类 {}

2.3 为什么继承

接下来我们通过实例的说明这个需求。

开发动物类,其中动物分别为狗和猫,要求如下:

  • 狗:属性(姓名,颜色),方法(吃,叫)
  • 猫:属性(姓名,颜色),方法(吃,叫)
class Dog{private String name;private String color;public void eat() {System.out.println(this.name + "正在吃...");}public void cry() {System.out.println(this.name + "正在叫...");}
}
class Cat {private String name;private String color;public void eat() {System.out.println(this.name + "正在吃...");}public void cry() {System.out.println(this.name + "正在叫...");}
}

从这两段代码可以看出来,代码存在重复了,导致后果就是代码量大且臃肿,而且维护性不高(维护性主要是后期需要修改的时候,就需要修改很多的代码,容易出错),所以要从根本上解决这两段代码的问题,就需要继承,将两段代码中相同的部分提取出来组成 一个父类:

class Animal {private String name;private String color;public Animal(String name, String color) {this.name = name;this.color = color;}public void eat() {System.out.println(this.name + "正在吃...");}public void cry() {System.out.println(this.name + "正在叫...");}
}

这个Animal类就可以作为一个父类,然后狗类和猫类继承这个类之后,就具有父类当中的属性和方法,子类就不会存在重复的代码,维护性也提高,代码也更加简洁,提高代码的复用性(复用性主要是可以多次使用,不用再多次写同样的代码) 继承之后的代码:

  • 狗类
class Dog extends Animal{public Dog(String name , String color) {super(name, color);}
}
  • 猫类
class Cat extends Animal {public Cat(String name , String color) {super(name, color);}
}

2.4 继承类型

Java 中不支持多继承,但支持多重继承。

Java 继承 _Java 教程_后端语言_教程_教程_JSON在线解析及格式化验证 - JSON.cn

2.5 继承特性

  • 子类拥有父类非 private 的属性、方法。
  • 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
  • 子类可以用自己的方式实现父类的方法。
  • Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 A 类继承 B 类,B 类继承 C 类,所以按照关系就是 C 类是 B 类的父类,B 类是 A 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。
  • 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。

2.6 super 与 this 关键字

super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类

this关键字:指向自己的引用。

class Animal {void eat() {System.out.println("animal : eat");}
}class Dog extends Animal {void eat() {System.out.println("dog : eat");}void eatTest() {this.eat();   // this 调用自己的方法super.eat();  // super 调用父类方法}
}public class Test {public static void main(String[] args) {Animal a = new Animal();a.eat();Dog d = new Dog();d.eatTest();}
}
// 运行结果
//animal : eat
//dog : eat
//animal : eat

2.7 final 关键字

final关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写;

  • 声明类
final class 类名 {// 类体
}
  • 声明方法
访问限定符 final 返回值类型 方法名(){// 方法体
}

注意:实例变量也可以被定义为final,被定义为final 的变量不能被修改。被声明为final 的类的方法自动声明为final,但是实例变量并不是final

3. 多态

3.1 多态的概念

多态是同一个行为具有多个不同表现形式或形态的能力。

多态就是同一个接口,使用不同的实例而执行不同操作,如图所示:

image-20231124190601241

多态性是对象多种表现形式的体现。

同一个事件发生在不同的对象上会产生不同的结果。

3.2 多态的优点

  • 消除类型之间的耦合关系
  • 可替换性
  • 可扩充性
  • 接口性
  • 灵活性
  • 简化性

3.3 多态存在的三个必要条件

  1. 继承

  2. 重写

    重写:子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不能改变。即外壳不变,核心重写

    重写的好处:在于子类可以根据需要,定义特定于自己的行为。也就是说子类能够根据需要实现父类的方法。

    class Animal {public void eat() {System.out.println("正在吃...");}
    }class Dog extends Animal {public void eat() {System.out.println("狗正在吃狗粮...");}
    }class Bird extends Animal {public void eat() {System.out.println("鸟正在吃鸟粮...");}
    }public class Test1 {public static void fun(Animal animal) {animal.eat();}public static void main(String[] args) {Dog dog = new Dog();fun(dog);Bird bird = new Bird();fun(bird);}
    }
    // 运行结果
    狗正在吃狗粮...
    鸟正在吃鸟粮...
    

    重写(覆盖)的规则:

    • 方法名相同
    • 参数列表相同【顺序、个数、类型】
    • 返回值相同
  3. 父类引用指向子类对象

比如:

Animal dog = new Dog();

当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。

多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理

以下是多态的例子:

abstract class Animal {  abstract void eat();  
}  class Cat extends Animal {  public void eat() {  System.out.println("吃鱼");  }  public void work() {  System.out.println("抓老鼠");  }  
}  class Dog extends Animal {  public void eat() {  System.out.println("吃骨头");  }  public void work() {  System.out.println("看家");  }  
}
// 测试类
public class Test {public static void show(Animal a)  {a.eat();  // 类型判断if (a instanceof Cat)  {  // 猫做的事情 Cat c = (Cat)a;  c.work();  } else if (a instanceof Dog) { // 狗做的事情 Dog c = (Dog)a;  c.work();  }  }  public static void main(String[] args) {show(new Cat());  // 以 Cat 对象调用 show 方法show(new Dog());  // 以 Dog 对象调用 show 方法Animal a = new Cat();  // 向上转型: 子类对象 -> 父类对象 a.eat();               // 调用的是 Cat 的 eatCat c = (Cat)a;        // 向下转型: 父类对象 -> 子类对象c.work();        // 调用的是 Cat 的 work}     
}// 运行结果
吃鱼
抓老鼠
吃骨头
看家
吃鱼
抓老鼠

3.4 instanceof 关键字

Java中可以使用instanceof 关键字判断对象是否是某个类的实例,语法格式如下:

对象 instanceof

在上述格式中,如果对象是指定类的实例对象,则返回true,否则返回false

class Animal {public String name;public int age;public Animal(String name, int age) {this.name = name;this.age = age;}public void eat() {System.out.println(this.name + "正在吃...");}
}class Dog extends Animal {public String color;public Dog(String name, int age,String color) {super(name,age);this.color = color;}public void eat() {System.out.println(this.name + "正在吃狗粮...");}public void barks() {System.out.println(this.name + "正在旺旺叫...");}
}class Bird extends Animal {public Bird(String name, int age) {super(name, age);}public void eat() {System.out.println(this.name + "正在吃鸟粮...");}public void fly() {System.out.println(this.name + "正在飞...");}
}public class Test1 {public static void main(String[] args) {Animal animal1 = new Dog("旺财",10,"黄色");if (animal1 instanceof Bird){ // 判断 dog对象是否是Bird类的实例 如果是则实例化对象,否则打印hellBird bird2 = (Bird)animal1;bird2.fly();}else {System.out.println("hell");}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PingCAP 受邀参加 FICC 2023,获 Open100 世纪全球开源贡献奖

2023 年 12 月,2023 国际测试委员会智能计算与芯片联邦大会(FICC 2023)在海南三亚举办,中外院士和数十位领域专家莅临出席。 大会现场 ,开放源代码促进会创始人 Bruce Perens 颁发了 Open100 世纪全球开源贡献奖&…

C#,入门教程(17)——条件语句(if-else)的基础知识

上一篇: C#,入门教程(16)——可变数据类型(var)的基础知识与使用禁忌https://blog.csdn.net/beijinghorn/article/details/124032216 程序的核心是逻辑。 逻辑的核心是布尔条件表达式。 逻辑的主要体现形式之一是 if-else 语句…

鸿蒙开发已解决-arkts编译报错-arkts-limited-stdlib错误

文章目录 项目场景:问题描述原因分析:解决方案:适配指导案例此Bug解决方案总结项目场景: arkts编译报错-arkts-limited-stdlib错误。 我用Deveco studio4.0 beta2开发应用,报arkts-limited-stdlib错误 报错内容为: ERROR: ArKTS:ERROR File: D:/prRevivw/3792lapplica…

在线的货币兑换平台源码下载

在线的货币兑换平台,可帮助全球各地的个人和企业将货币从一种货币兑换为另一种货币。该货币兑换平台是 Codecanyon 中最先进的脚本。 源码下载:https://download.csdn.net/download/m0_66047725/88728084

【期末不挂科-C++考前速过系列P6】大二C++实验作业-模板(4道代码题)【解析,注释】

前言 大家好吖,欢迎来到 YY 滴C考前速过系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的《…

Center审计策略表安装和策略添加(事务)——(Linux/Windows版本)

本博客主要讲述Center的审计策略表安装和策略添加 使用事务添加 1、开启事务 my->StartTransaction(); 2、编写sql语句 //清除原来数据,防止数据污染my->Query("DROP TABLE IF EXISTS t_strategy");string sql "CREATE TABLE t_strategy (…

stm32学习笔记:DMA

每个DMA通道硬件触发源是不一样的,要使用某个外设的硬件触发源,就必须使用它连接的那个通道 12个独立可配置的通道:DMA1(7个通道),DMA2(5个通道) 每个通道都支持软件触发和特定的硬件触发 C8T6 DMA资源:DMA1 &#xff…

Sqoop与其他数据采集工具的比较分析

比较Sqoop与其他数据采集工具是一个重要的话题,因为不同的工具在不同的情况下可能更适合。在本博客文章中,将深入比较Sqoop与其他数据采集工具,提供详细的示例代码和全面的内容,以帮助大家更好地了解它们之间的差异和优劣势。 Sq…

定时器问题(vue的问题)

我在a页面写一个定时,让他每秒钟打印一个1,然后跳转到b页面,此时可以看到,定时器依然在执行。这样是非常消耗性能的。如下图所示: 解决方法1 首先我在data函数里面进行定义定时器名称: data() {return {t…

Python中使用execfile实现R中的source功能,避免重复加载包导入函数

R中避免重复 在R中要加载多个包,进行全局的配置,定义全局变量,我们可以下一个config.R文件,在分析的代码开头source一下这个config.R文件即可避免每次都要加载包的冗余代码 using是之前定义的一个函数,作用是一次性加…

基于MAP算法的Turbo译码 -- 公式推导

到此为止,讲完了turbo译码器的子译码器基于MAP算法的译码过程。但在实际使用中,很少直接使用MAP算法进行译码。而是使用改进的LOG-MAP和MAX-LOG-MAP算法进行译码,因此译码的整体流程,包括外信息的计算以及先验信息的获取等。都在后…

canvas设置圆锥形渐变

查看专栏目录 canvas示例教程100专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重…

慢 SQL 的优化思路

分析慢 SQL 如何定位慢 SQL 呢? 可以通过 slow log 来查看慢SQL,默认的情况下,MySQL 数据库是不开启慢查询日志(slow query log)。所以我们需要手动把它打开。 查看下慢查询日志配置,我们可以使用 show …

飞鱼CRM接入第三方系统 飞鱼API对接详细教程

场景描述 在白码低代码开发平台中,是支持外部crm系统的线索通过接口流入到白码系统里面,换而言之,只要外部的系统有线索api接口,白码系统可以接收线索并在白码系统上进行后续操作。本文以飞鱼crm系统为例,讲解如何接收…

二分图最大匹配——匈牙利算法详解

文章目录 零、前言一、红娘牵线二、二分图最大匹配2.1概念2.2交替路2.3增广路2.4匈牙利算法2.4.1算法原理2.4.2算法示例2.4.3代码实现 3.OJ练习3.1模板3.2棋盘覆盖3.3車的放置 零、前言 关于二分图的基本知识见:二分图及染色法判定 一、红娘牵线 一位红娘近日遇到一…

螺旋数字矩阵 - 华为OD统一考试

OD统一考试(C卷) 分值: 100分 题解: Java / Python / C++ 题目描述 疫情期间,小明隔离在家,百无聊赖,在纸上写数字玩。他发明了一种写法: 给出数字个数n和行数m (0 < n <= 999,0 < m <= 999),从左上角的1开始,按照顺时针螺旋向内写方式,依次写出2,3……

网络安全工具:通过监控分析日志数据保护企业网络

由于混合工作模式的兴起以及业务运营向云环境的迁移&#xff0c;企业网络变得更加分散和复杂&#xff0c;仅安装外围安全解决方案只会创建一个基本的防御层&#xff0c;系统、服务器和其他网络实体会生成记录所有网络活动的日志。集中式日志管理系统可以帮助管理员自动监控网络…

使用numpy处理图片——灰阶影像

大纲 载入图像灰阶处理lightnessaverageluminosity 灰阶&#xff08;Gray scale&#xff09;影像是每个像素只有一个采样颜色的图像。 载入图像 import numpy as np import PIL.Image as Imageimg Image.open(lena.png) data np.array(img)灰阶处理 我们有三种方法来生成这…

《ARM Linux内核源码剖析》读书笔记——0号进程(init_task)的创建时机

最近在读《ARM Linux内核源码剖析》&#xff0c;一直没有看到0号进程&#xff08;init_task进程)在哪里创建的。直到看到下面这篇文章才发现书中漏掉了set_task_stack_end_magic(&init_task)这行代码。 下面这篇文章提到&#xff1a;start_kernel()上来就会运行 set_task_…

迅腾文化用网络集成化生态系统助力品牌之路的坚实后盾

商业竞争激烈&#xff0c;品牌不仅是企业的标志和形象&#xff0c;更是其核心价值和竞争力的体现。然而&#xff0c;企业在品牌推广过程中面临着诸多如缺乏有效的渠道管理、品牌形象模糊以及竞争激烈的市场环境等。这些阻碍着企业的品牌发展和市场占有率的提升。本文将通过企业…