Java中面向对象三大特征(封装、继承、多态)

目录

一、封装

1.1 封装的意义

1.2 如何进行封装

二、继承

2.1 继承的意义

2.2 如何继承

2.3 继承的优点

2.4 继承的缺点

三、多态

3.1 多态的定义

3.2 多态的使用要求


一、封装

所谓封装就是将对象的属性隐藏起来,不让外界直接访问,而是通过指定的方法来访问对象的属性,就叫封装。Java 中封装是面向对象三大特征之一,它的作用就是让程序的安全性得以提高。

1.1 封装的意义

我们通过下面的示例来说明这个问题。

我们创建一个 Human 类,在这个类中定义两个属性,一个姓名,一个年龄。

class Human {String name;private int age;public void setAge(int newAge) {age = newAge;}public int getAge() {return age;}
}
public class HumanTest {public static void main(String[] args) {Human human = new Human();human.name = "张三";//human.age = -18;human.setAge(18);System.out.println(human.name + " " + human.getAge());}
}

通过上面的示例演示,如果我们不把 age 属性隐藏起来,那么在外部(HumanTest类中的 main 方法中)就可以直接对这个属性进行赋值。这就会产生不确定的因素,如给年龄一个负数或都一个很大的数。这些情况都是不对的。为了避免这种情况的发生,我们需要把这个属性进行隐藏,从而提高程序的健康性。

1.2 如何进行封装

在 Java 中需要使用 private 关键字来修饰要被隐藏的属性。然后提供这个属性对应的两个公共方法:一个用于对这个属性进行赋值,另一个用于对这个属性进行获取值。

class Human {String name;private int age;public void setAge(int newAge) {age = newAge;}public int getAge() {return age;}
}

例如上面代码中的 setAge(int newAge) 和 getAge() 这两个方法都是封装方法。一般来说,给属性赋值的方法取名为 setXXX,而获取属性值的方法取名为 getXXX。其中XXX 表示属性的名称,该名称的首字母大写。

注意:为了安全性,在写实体类中,只要有属性存在都需要进行封装。

二、继承

继承是面向对象程序设计的第二个特征,为了提高代码的复用率,继承应运而生。

2.1 继承的意义

我们通过如下的案例来说明这个问题。

class Woman {public String name;public int age;public void show() {System.out.println(name + " " + age);}
}class Man {public String name;public int age;public void show() {System.out.println(name + " " + age);}
}public class PersonDemo {public static void main(String[] args) {Man man = new Man();man.name="张三";man.age=18;man.show();Woman woman = new Woman();woman.name = "李四";woman.age=19;woman.show();}
}

从上面的代码中可以发现,现个类中除了类名不同以外,其余的代码都是相同的。这样的话代码复用率就不高。为了让代码的复用率更高。我们可以把两个 类中相同的代码提取出来形成一个单独的类,然后让这两个类去继承它即可。

2.2 如何继承

首先我们需要定义一个父类,在这个父类中定义公共的属性或方法。例如上面的示例中我们可以定义一个父类如:Person,然后在这个父类中定义公共的属性和方法。

class Person {public String name;public int age;public void show() {System.out.println(name + " " + age);}
}class Woman extends Person {}class Man extends Person {}public class PersonDemo {public static void main(String[] args) {Man man = new Man();man.name="张三";man.age=18;man.show();Woman woman = new Woman();woman.name = "李四";woman.age=19;woman.show();}
}

子类需要使用 extends 关键字来继承父类。通过这样的操作后,Person类中父类或者叫基类,而Man和 Woman 叫子类或者派生类。

2.3 继承的优点

  1. 提高了代码的复用率

  2. 它是多态前提条件

2.4 继承的缺点

  1. 父类中私有的属性和方法,子类是无法使用的

  2. 在java中只支持单继承,不支持多继承,但是可以支持多重继承

  3. 继承后子父类的关系就接合得非常的紧密,不利于程序的扩展,从而减少了程序的灵活性。

  4. 父类无法访问子类的属性和方法

三、多态

3.1 多态的定义

一个对象在不同条件下表示的不同形态就叫多态,在程序中,多态是父类引用指定子类对象。

// 多态
class Father {String name;public void desc() {System.out.println("----------");System.out.println(name + "小头爸爸");}
}
class Son extends Father {String name;public void desc() {System.out.println("+++++++++++++");System.out.println(name + "大头儿子");}
}public class PolymorphicDemo1 {public static void main(String[] args) {Father father = new Son();father.name = "大头儿子";father.desc();}
}

另一种多态的使用方式是在方法的参数上,一般我们在使用工厂设计模式时会使用多态 。

//
abstract class Animal {abstract void haha();
}
class Cat extends Animal {@Overridevoid haha() {System.out.println("Cat haha()");}
}
class Dog extends Animal {@Overridevoid haha() {System.out.println("Dog haha()");}
}class HelloKit {public static Animal create(Animal animal) {if (animal instanceof Cat) {return new Cat();}else if (animal instanceof Dog) {return new Dog();} else {return null;}}
}
public class HelloKitDemo {public static void main(String[] args) {Cat cat = new Cat();Dog dog = new Dog();Animal animal = HelloKit.create(cat);animal.haha();Animal animal1 = HelloKit.create(dog);animal1.haha();}
}

在参数列表上,使用父类去接收,也是一种多态的使用方式。

3.2 多态的使用要求

1,在多态的情况下,不能使用子类特有的方法

class Person {public int age = 5;public void show() {System.out.println("Person age: " + age);}
}
class Student extends Person {public int age = 10;public String name = "小明";public void show() {System.out.println("Student age: " + age);}public void speak() {System.out.println(name);}
}public class PolymorphicDemo2 {public static void main(String[] args) {Person p = new Student();p.show(); // 可以执行p.speak(); // 报错,因为 speak 方法是子类特有的方法}
}

2,多态在例子中如果属性是非静态的,它的值是看等号左边

// 多态的注意事项
class Person {public int age = 5;public void show() {System.out.println("Person age: " + age);}
}
class Student extends Person {public int age = 10;public String name = "小明";public void show() {System.out.println("Student age: " + age);}public void speak() {System.out.println(name);}
}public class PolymorphicDemo2 {public static void main(String[] args) {Person p = new Student();System.out.println(p.age); // 5 ,是不是 10}
}

原因:我们使用的是多态,也就是说我们输出的 p.age ,而 p 是父为的引用,它获取到的值就是父类中定义的值。

在多态下,编译是看等号的左边,运行时如果是属性则看等号左边。

3,在多态下的非静态方法

// 多态的注意事项
class Person {public int age = 5;public void show() {System.out.println("Person age: " + age);}
}
class Student extends Person {public int age = 10;public String name = "小明";public void show() {System.out.println("Student age: " + age);}
}public class PolymorphicDemo2 {public static void main(String[] args) {Person p = new Student();p.show();}
}

在多态下,编译是看等号的左边,运行时如果方法是非静态的看等号的右边。

4,在多态下的静态成员

// 多态的注意事项
class Person {public static void x() {System.out.println("Person static x");}
}
class Student extends Person {public static void x() {System.out.println("Student static x");}
}
public class PolymorphicDemo2 {public static void main(String[] args) {Person p = new Student();p.x(); // Person static x}
}

在多态下,静态的成员在编译和运行时都看等号的左边。

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

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

相关文章

【Micropython Pitaya Lite教程】key按键与EXTI中断

文章目录 前言一、按键的使用1.1 按键的简介1.2 读取按键的高低电平 二、EXIT外部中断2.1 EXIT外部中断简介2.2 外部中断基础知识2.3 设置外部中断2.4 示例代码 总结 前言 Micropython Pitaya Lite开发板提供了丰富的功能和灵活的扩展性,其中包括了按键&#xff08…

Python 全栈系列241 GFGo Lite迭代

说明 随着整个算网开发逐渐深入,各个组件、微服务的数量、深度在不断增加。由于算网是个人项目,我一直按照MVP(Minimum Viable Product )的原则在推进。由于最初的时候对架构、算法和业务的理解并没有那么深刻,所以MVP的内容还是在不断变化&…

精准医疗中的图像识别技术:从诊断到治疗的新变革

在精准医疗中,图像识别技术的应用正在从诊断到治疗带来一场新的变革。这种技术通过深度学习和计算机视觉算法,能够分析和解释医学图像,如X射线、CT扫描、MRI等,从而帮助医生更准确地诊断疾病,制定更个性化的治疗方案。…

IoTDB 入门教程 基础篇①——时序数据库为什么选IoTDB ?

文章目录 一、前文二、性能排行第一三、完全开源四、数据文件TsFile五、乱序数据高写入六、其他七、参考 一、前文 IoTDB入门教程——导读 关注博主的同学都知道,博主在物联网领域深耕多年。 时序数据库,博主已经用过很多,从最早的InfluxDB&a…

跟我学C++中级篇——const和constexpr的使用

一、从例程介绍 已经不同的篇章里介绍和分析过const及constexpr&#xff0c;特别对于后者&#xff0c;从c11到c14直到c17甚至以后&#xff0c;功能都不断的在完善。那么这么多复杂的应用如何搞清楚呢&#xff1f;下面先从代码看起&#xff1a; #include <iostream>void…

Linux基础之yum和vim

目录 一、软件包管理器yum 1.1 软件包的概念 1.2 软件包的查看 1.3 软件包的安装和删除 二、Linux编辑器之vim 2.1 vim的基本概念 2.2 正常模式&#xff08;命令模式&#xff09; 2.3 底行模式 2.4 输入模式 2.5 替换模式 2.6 视图模式 2.7 总结 一、软件包管理器yu…

MATLAB可视化图形绘制详解

图形常见的修饰命令 ①曲线修饰 曲线修饰包括曲线的顔色、线型和标示符号的设置。曲线修饰的命令格式如下。 plot(x,y,option):option定义了曲线的颜色、线型和标示符号。 MATLAB曲线修饰的各种选项见表 举例&#xff1a; x-2*pi:pi/50:2*pi; y1x.^2;y2cos(2*X);y3y1.*y2…

ctfshow web入门 php反序列化 web254--web259

web 254 只要传入的值与其类中的值相等即为true就有flag usernamexxxxxx&passwordxxxxxx web255 序列化和反序列化就像是把物品放进盒子和从盒子里取出物品的过程一样&#xff0c;只是在计算机编程中&#xff0c;我们是针对数据进行的操作。 这一题就是要把cookie进行序…

【Python项目】基于DJANGO的【基于语音识别的智能垃圾分类系统】

技术简介&#xff1a;使用Python技术、DJANGO框架、MYSQL数据库等实现。 系统简介&#xff1a;用户们可以在系统上面录入自己的个人信息&#xff0c;录入后还可以对信息进行修改&#xff0c;网站可以对用户上传的音频文件进行识别&#xff0c;然后进行垃圾分类。 背景&#xf…

【竞技宝jjb.lol】LOL:TES顺利晋级却暴露问题

北京时间2024年5月5日,英雄联盟2024MSI季中赛正在如火如荼的进行之中,目前入围赛阶段的比赛已经进入尾声,入围赛实力最强的两支战队T1、TES都已经顺利晋级淘汰赛阶段,在昨天的比赛结束之后,A组的FLY、PSG,B组的FNC、GAM将争夺剩下的两个出线名额。 回顾这次入围赛中,T1和TES的比…

课题学习(二十三)---三轴MEMS加速度计芯片ADXL372

声明&#xff1a;本人水平有限&#xff0c;博客可能存在部分错误的地方&#xff0c;请广大读者谅解并向本人反馈错误。 一、基础配置 测量范围-200g-200g&#xff0c;分辨率为12位&#xff0c; V s 、 V D D I / O V_s、V_{DDI/O} Vs​、VDDI/O​范围为1.6V-3.5V 1.1 引脚配…

第20天 多线程

多线程 cpu一次只能处理一条指令&#xff0c;所谓同时是因为人反应不过来 分为多个时间片段&#xff0c;尽可能平均分配给每一个线程 线程的创建 &#xff1a; 第1种方法&#xff1a;继承thread并重写run方法 psvm{ Thread t1 new MyThread1(); Thread t2 new MyThread2()…

u盘格式化后电脑读不出来怎么办?u盘格式化的东西还能恢复吗

随着科技的快速发展&#xff0c;U盘已成为我们日常生活和工作中不可或缺的数据存储工具。然而&#xff0c;有时我们可能会遇到U盘格式化后电脑无法读取的情况&#xff0c;或是误格式化导致重要数据丢失。面对这些问题&#xff0c;我们该如何应对&#xff1f;本文将为您详细解答…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之七 简单进行人脸检测并添加面具特效实现

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之七 简单进行人脸检测并添加面具特效实现 目录

RISC-V异常处理相关内容

异常处理相关内容 异常处理相关内容异常处理准备工作异常处理函数Opensbi系统调用的注册异常处理相关内容 异常处理准备工作 这里需要特殊强调的是异常处理构建的相关内容: 这里会将a4寄存器中的值存储到CSR_MTVEC这个状态寄存器,也就是异常处理程序的的入口;如果遇到异常…

基于 Dockerfile 部署nginx服务(实现HTTPS功能)

目录 前言 1、任务要求 2、建立工作目录并上传nginx安装包 3、创建自签名证书 4、创建 nginx Dockerfile 文件 5、准备并编写 nginx.conf 配置文件 6、准备nginx页面文件 7、工作目录文件结构 8、生成镜像 8、启动容器并开启宿主机端口映射 9、浏览器测试 前言 Ngi…

电子电器架构刷写 --- Bootloader大揭秘

电子电器架构刷写 — Bootloader大揭秘 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自…

c语言刷题——输出图案

1.输出用“*”组成的X形图案 题目&#xff1a;请打印用“*”组成的X形图案 描述&#xff1a; 多组输入&#xff0c;一个整数&#xff08;2~20&#xff09;&#xff0c;表示输出的行数&#xff0c;也表示组成“X”的反斜线和正斜线的长度。 输出描述&#xff1a; 针对每行输…

Ubuntu18.04 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED 解决方法

解决办法&#xff1a; ssh-keygen -R 192.168.11.11 注意根据自己的实际地址 参考博客&#xff1a;【linux】WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED 解决方法_warning: remote host identification has changed!-CSDN博客

大语言模型中的第一性原理:Scaling laws

大语言模型的尺度定律在大语言模型的训练过程中起到了非常重要的作用。即使读者不参与大语言模型的训练过程&#xff0c;但了解大语言模型的尺度定律仍然是很重要的&#xff0c;因为它能帮助我们更好的理解未来大语言模型的发展路径。 1. 什么是尺度定律 尺度定律&#xff08…