说明

曾经在学习java面向对象时,你是否会为面向对象的封装-继承-抽象-多态-组合等各种概念搞得稀里糊涂,乃至反复阅读,背诵其相关概念,结果一段时间过后又还给了时间。。。

这种经历简直令人发指,让人无法忍受,难道就没有哪个地方能把它一次说清楚,老百姓看了以后纷纷醍醐灌顶,不再重蹈覆辙???答案就在本文,请各位耐心观看,也可无脑收藏,用时瞟一眼再次醍醐灌顶即可。

先引用一句祖师爷《java编程思想》的教诲:

有一条通用准则:使用继承表达行为的差异,使用组合表达状态的变化。

当你不知道该用继承还是组合的时候可以参考这句话。

封装

封装是指将对象的属性和行为(即数据和方法)结合在一个独立的单元中,并隐藏对象的内部细节,只对外提供公共的访问方式。封装有助于保护对象内部的数据不被外部随意访问和修改,同时提高了代码的安全性和可维护性。

  1. public class Person {
  2. // 私有属性,封装了人的姓名和年龄
  3. private String name;
  4. private int age;
  5. // 公共的构造方法,用于创建Person对象并初始化属性
  6. public Person(String name, int age) {
  7. this.name = name;
  8. this.age = age;
  9. }
  10. // 公共的getter方法,用于获取私有属性的值
  11. public String getName() {
  12. return name;
  13. }
  14. // 公共的setter方法,用于设置私有属性的值
  15. public void setAge(int age) {
  16. this.age = age;
  17. }
  18. // 公有的方法,描述人的行为
  19. public void introduce() {
  20. System.out.println("My name is " + name + " and I am " + age + " years old.");
  21. }
  22. }
  23. public class Main {
  24. public static void main(String[] args) {
  25. Person person = new Person("Alice", 25);
  26. person.introduce(); // 输出:My name is Alice and I am 25 years old.
  27. // person.name = "Bob"; // 错误!不能直接访问私有属性
  28. // System.out.println(person.name); // 错误!不能直接访问私有属性
  29. person.setAge(26);
  30. person.introduce(); // 输出:My name is Alice and I am 26 years old.
  31. }
  32. }

抽象

抽象是指只展示对象的必要信息,而隐藏不必要的细节。在Java中,抽象类是一种不能被实例化的类,它通常包含抽象方法(没有实现的方法),这些抽象方法由子类来具体实现。抽象类和抽象方法主要用于定义接口和实现多态。

  1. // 抽象类:动物
  2. abstract class Animal {
  3. // 抽象方法,没有具体实现
  4. abstract void makeSound();
  5. }
  6. class Dog extends Animal {
  7. // 实现父类的抽象方法
  8. @Override
  9. void makeSound() {
  10. System.out.println("The dog barks");
  11. }
  12. }
  13. // 子类:猫,实现动物的抽象方法
  14. class Cat extends Animal {
  15. // 实现父类的抽象方法
  16. @Override
  17. void makeSound() {
  18. System.out.println("The cat meows");
  19. }
  20. }
  21. public class AbstractClassTest {
  22. public static void main(String[] args) {
  23. Animal myDog = new Dog(); // 多态:Animal引用指向Dog对象
  24. myDog.makeSound();
  25. Animal myCat = new Cat(); // 多态:Animal引用指向Cat对象
  26. myCat.makeSound();
  27. }
  28. }

继承

继承是指一个类(子类)可以继承另一个类(父类)的属性和方法,并可以添加或覆盖父类的属性和方法。继承允许我们创建分等级层次的类,减少了代码冗余,提高了代码的可重用性。

继承使得代码可以重用,同时能体现类与类之间的is-a关系

  1. // 父类:动物
  2. class Animal {
  3. void makeSound() {
  4. System.out.println("The animal makes a sound");
  5. }
  6. }
  7. // 子类:狗,继承自动物
  8. class Dog extends Animal {
  9. // 覆盖父类的方法
  10. @Override
  11. void makeSound() {
  12. System.out.println("The dog barks");
  13. }
  14. void wagTail() {
  15. System.out.println("The dog wags its tail");
  16. }
  17. }
  18. public class Main {
  19. public static void main(String[] args) {
  20. Dog dog = new Dog();
  21. dog.makeSound(); // 输出:The dog barks
  22. dog.wagTail(); // 输出:The dog wags its tail
  23. }
  24. }

组合

组合是将多个对象组合到一起,形成一个新的对象。组合体现的是has-a关系,即一个类中包含另一个类的对象。组合是一种强耦合关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样。

  1. 例子1
  1. // 组件类:轮子
  2. class Wheel {
  3. void rotate() {
  4. System.out.println("The wheel is rotating");
  5. }
  6. }
  7. // 组合类:汽车,包含轮子对象
  8. class Car {
  9. private Wheel wheel;
  10. public Car() {
  11. this.wheel = new Wheel();
  12. }
  13. void move() {
  14. System.out.println("The car is moving");
  15. wheel.rotate(); // 调用轮子对象的方法
  16. }
  17. }
  18. public class Main {
  19. public static void main(String[] args) {
  20. Car car = new Car();
  21. car.move(); // 调用汽车对象的方法,汽车对象内部会调用轮子对象的方法
  22. }
  23. }
  1. 更经典的例子,可以体现继承和组合结合的范例
  1. // polymorphism/Transmogrify.java
  2. // Dynamically changing the behavior of an object
  3. // via composition (the "State" design pattern)
  4. class Actor {
  5. public void act() {}
  6. }
  7. class HappyActor extends Actor {
  8. @Override
  9. public void act() {
  10. System.out.println("HappyActor");
  11. }
  12. }
  13. class SadActor extends Actor {
  14. @Override
  15. public void act() {
  16. System.out.println("SadActor");
  17. }
  18. }
  19. class Stage {
  20. private Actor actor = new HappyActor();
  21. public void change() {
  22. actor = new SadActor();
  23. }
  24. public void performPlay() {
  25. actor.act();
  26. }
  27. }
  28. public class Transmogrify {
  29. public static void main(String[] args) {
  30. Stage stage = new Stage();
  31. stage.performPlay();
  32. stage.change();
  33. stage.performPlay();
  34. }
  35. }

输出:

  1. HappyActor
  2. SadActor

多态

多态(Polymorphism)是面向对象编程的四大基本特性之一,其他三个是封装(Encapsulation)、继承(Inheritance)和抽象(Abstraction)。多态字面上理解就是“多种形态”,在Java中,多态指的是允许一个接口或父类引用指向其子类对象,并且在运行时能够自动调用实际指向对象的子类方法。

简单来说,多态就是同一个方法调用可以有不同的实现方式,具体实现取决于运行时对象的实际类型。Java通过方法重写(Override)和向上转型(Upcasting)来实现多态。

  1. // 动物类,定义了一个makeSound方法
  2. class Animal {
  3. void makeSound() {
  4. System.out.println("The animal makes a sound");
  5. }
  6. }
  7. // 狗类,继承自动物类并重写了makeSound方法
  8. class Dog extends Animal {
  9. @Override
  10. void makeSound() {
  11. System.out.println("The dog barks");
  12. }
  13. }
  14. // 测试类
  15. public class TestPolymorphism {
  16. public static void main(String[] args) {
  17. // 向上转型,父类引用指向子类对象
  18. Animal animal = new Dog();
  19. // 调用makeSound方法,实际执行的是Dog类的makeSound方法
  20. animal.makeSound(); // 输出:The dog barks
  21. // 如果我们有一个Animal类型的数组,我们也可以将不同类型的Animal对象加入其中
  22. Animal[] animals = new Animal[2];
  23. animals[0] = new Dog();
  24. animals[1] = new Animal();
  25. // 遍历数组并调用makeSound方法,每个对象会根据其实际类型调用相应的方法
  26. for (Animal a : animals) {
  27. a.makeSound();
  28. }
  29. // 输出:
  30. // The dog barks
  31. // The animal makes a sound
  32. }
  33. }

觉得有用的点赞:)

嘿嘿嘿

java面向对象之封装-继承-抽象-多态-组合五种概念及用法一网打尽的更多相关文章

  1. java面向对象(封装-继承-多态)

    框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...

  2. objective-c自学总结(三)---面向对象的封装,继承与多态

    面向对象的三大特性 封装 继承 多态 1.封装: 隐藏属性,方法或实现细节的过程称为封装 信息隐藏,隐藏对象的实现细节,不允许用户看到 将东西包装在一 然后以新的完整形式呈现出来 例如,两种或多种化学 ...

  3. python 面向对象及封装继承和多态

    ######装饰器######装饰器的概念 - 装饰器的实现是函数里面嵌套函数;- 装饰器的本质是一个函数, 它可以让其他函数在不需要做任何代码改动的前提下增加额外的功能;- 装饰器需要传递一个函数, ...

  4. Python3 与 C# 面向对象之~继承与多态 Python3 与 C# 面向对象之~封装 Python3 与 NetCore 基础语法对比(Function专栏) [C#]C#时间日期操作 [C#]C#中字符串的操作 [ASP.NET]NTKO插件使用常见问题 我对C#的认知。

    Python3 与 C# 面向对象之-继承与多态   文章汇总:https://www.cnblogs.com/dotnetcrazy/p/9160514.html 目录: 2.继承 ¶ 2.1.单继 ...

  5. Python面向对象中的继承、多态和封装

    Python面向对象中的继承.多态和封装 一.面向对象的三大特性 封装:把很多数据封装到⼀个对象中,把固定功能的代码封装到⼀个代码块, 函数,对象, 打包成模块. 这都属于封装思想. 继承:⼦类可以⾃ ...

  6. Java面向对象(封装性概论)

     Java面向对象(封装性概论) 知识概要:                   (1)面向对象概念 (2)类与对象的关系 (3)封装 (4)构造函数 (5)this关键字 (6)static关键 ...

  7. day33 序列类型,绑定方法,类方法,静态方法,封装继承和多态

    Python之路,Day20 = 序列类型,绑定方法,类方法,静态方法,封装继承和多态 序列是指有序的队列,重点在"有序". 一.Python中序列的分类 Python中的序列主要 ...

  8. C#基础总结之八面向对象知识点总结-继承与多态-接口

    .方法深入讲解(返回值,形参与实参) 方法 public int getName(int i,int j) { int sum = i + j; return sum; } .利用泛型存储对象数据 . ...

  9. Java学习笔记二十五:Java面向对象的三大特性之多态

    Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...

  10. Java面向对象之类、接口、多态

    Java面向对象之类.接口.多态 类 class Person { // 实例属性 int age; String name; // 类属性 static int v = 1; // 构造器 publ ...

随机推荐

  1. [转帖]警惕Oracle数据库性能“隐形杀手”——Direct Path Read

    一. 简介 Oracle 的11g版本正式发布到今天已经10年有余,最新版本也已经到了20c,但是Direct Path Read(直接路径读)导致性能问题的案例仍时有发生,很多12c的用户还是经常遇 ...

  2. [转帖]Shell 判断文件或文件夹是否存在(不存在则创建)

    目录 1. 文件夹不存在创建文件夹 2. 判断文件夹是否存在 3. 判断文件是否存在 4. 常用的文件比较符 1. 文件夹不存在创建文件夹 if [ ! -d "/data/" ] ...

  3. 一次典型的Memroy Leak的跟踪学习过程

    背景 周四时某项目在QQ群里说自己的系统出现了CPU占用较高的情况. TOP 查看发现大部分占用CPU的都是 JAVA核心进城后附近的进程. 所以初步怀疑 是出现了FullGC的问题. 然后群里反馈了 ...

  4. Redis-rdb-tools与rdr工具学习与使用

    Redis-rdb-tools与rdr工具学习与使用 简要说明 rdb工具是python写的一套工具,可以分析dump文件,获取key等信息. rdb其实有一套rdb-profiler工具, 能够导出 ...

  5. ESXi6.5 登录后出现错误 必须 退出的解决办法

  6. AI-WEB-1.0靶机

    AI-WEB-1.0靶机 情报收集 扫描靶机,打开网站提示 Not even Google search my contents! dirb http://192.168.218.139 扫描网站 进 ...

  7. 【三】分布式训练---单机多卡与多机多卡组网(飞桨paddle2.0+)更加推荐spawn方式!

    1. 单机多卡启动并行训练 飞桨2.0增加paddle.distributed.spawn函数来启动单机多卡训练,同时原有的paddle.distributed.launch的方式依然保留. padd ...

  8. 做知识图谱遇到的环境问题合集【spacy、gensim、keras_contrib等】

    1.python:spacy.gensim库的安装遇到问题及bug处理 见: python:spacy.gensim库的安装遇到问题及bug处理_汀.的博客-CSDN博客1.spacySpaCy最新版 ...

  9. 强烈推荐:数据标注平台doccano----简介、安装、使用、踩坑记录

    1.doccano的安装与初始配置 1.1 doccano的用途 document classification 文本分类 sequence labeling 序列标注,用于命名实体识别 sequen ...

  10. 2.4 CE修改器:代码替换功能

    代码替换功能,需要使用 Cheat Engine 工具的"代码查找"功能,来查找游戏数据存储在内存中的地址.首先找到当前数值的存储地址,并将其添加到下方地址列表中.然后右键单击该地 ...