说明

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

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

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

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

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

封装

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

public class Person {
// 私有属性,封装了人的姓名和年龄
private String name;
private int age; // 公共的构造方法,用于创建Person对象并初始化属性
public Person(String name, int age) {
this.name = name;
this.age = age;
} // 公共的getter方法,用于获取私有属性的值
public String getName() {
return name;
} // 公共的setter方法,用于设置私有属性的值
public void setAge(int age) {
this.age = age;
} // 公有的方法,描述人的行为
public void introduce() {
System.out.println("My name is " + name + " and I am " + age + " years old.");
}
} public class Main {
public static void main(String[] args) {
Person person = new Person("Alice", 25);
person.introduce(); // 输出:My name is Alice and I am 25 years old.
// person.name = "Bob"; // 错误!不能直接访问私有属性
// System.out.println(person.name); // 错误!不能直接访问私有属性
person.setAge(26);
person.introduce(); // 输出:My name is Alice and I am 26 years old.
}
}

抽象

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

// 抽象类:动物
abstract class Animal {
// 抽象方法,没有具体实现
abstract void makeSound();
} class Dog extends Animal {
// 实现父类的抽象方法
@Override
void makeSound() {
System.out.println("The dog barks");
}
} // 子类:猫,实现动物的抽象方法
class Cat extends Animal {
// 实现父类的抽象方法
@Override
void makeSound() {
System.out.println("The cat meows");
}
} public class AbstractClassTest {
public static void main(String[] args) {
Animal myDog = new Dog(); // 多态:Animal引用指向Dog对象
myDog.makeSound();
Animal myCat = new Cat(); // 多态:Animal引用指向Cat对象
myCat.makeSound();
}
}

继承

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

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

// 父类:动物
class Animal {
void makeSound() {
System.out.println("The animal makes a sound");
}
} // 子类:狗,继承自动物
class Dog extends Animal {
// 覆盖父类的方法
@Override
void makeSound() {
System.out.println("The dog barks");
} void wagTail() {
System.out.println("The dog wags its tail");
}
} public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.makeSound(); // 输出:The dog barks
dog.wagTail(); // 输出:The dog wags its tail
}
}

组合

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

  1. 例子1
// 组件类:轮子
class Wheel {
void rotate() {
System.out.println("The wheel is rotating");
}
} // 组合类:汽车,包含轮子对象
class Car {
private Wheel wheel; public Car() {
this.wheel = new Wheel();
} void move() {
System.out.println("The car is moving");
wheel.rotate(); // 调用轮子对象的方法
}
} public class Main {
public static void main(String[] args) {
Car car = new Car();
car.move(); // 调用汽车对象的方法,汽车对象内部会调用轮子对象的方法
}
}
  1. 更经典的例子,可以体现继承和组合结合的范例
// polymorphism/Transmogrify.java
// Dynamically changing the behavior of an object
// via composition (the "State" design pattern)
class Actor {
public void act() {}
} class HappyActor extends Actor {
@Override
public void act() {
System.out.println("HappyActor");
}
} class SadActor extends Actor {
@Override
public void act() {
System.out.println("SadActor");
}
} class Stage {
private Actor actor = new HappyActor(); public void change() {
actor = new SadActor();
} public void performPlay() {
actor.act();
}
} public class Transmogrify {
public static void main(String[] args) {
Stage stage = new Stage();
stage.performPlay();
stage.change();
stage.performPlay();
}
}

输出:

HappyActor
SadActor

多态

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

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

// 动物类,定义了一个makeSound方法
class Animal {
void makeSound() {
System.out.println("The animal makes a sound");
}
} // 狗类,继承自动物类并重写了makeSound方法
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("The dog barks");
}
} // 测试类
public class TestPolymorphism {
public static void main(String[] args) {
// 向上转型,父类引用指向子类对象
Animal animal = new Dog(); // 调用makeSound方法,实际执行的是Dog类的makeSound方法
animal.makeSound(); // 输出:The dog barks // 如果我们有一个Animal类型的数组,我们也可以将不同类型的Animal对象加入其中
Animal[] animals = new Animal[2];
animals[0] = new Dog();
animals[1] = new Animal(); // 遍历数组并调用makeSound方法,每个对象会根据其实际类型调用相应的方法
for (Animal a : animals) {
a.makeSound();
}
// 输出:
// The dog barks
// The animal makes a sound
}
}

觉得有用的点赞:)

嘿嘿嘿

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. [转帖]学习如何编写 Shell 脚本(基础篇)

    https://juejin.cn/post/6930013333454061575 前言 如果仅仅会 Linux 一些命令,其实已经可以让你在平时的工作中游刃有余了.但如果你还会编写 Shell 脚 ...

  2. [转帖]Kafka可靠性之HW与Leader Epoch

    <深入理解Kafka:核心设计与实现原理>是基于2.0.0版本的书 在这本书中,终于看懂了笔者之前提过的几个问题 准备知识 1.leader里存着4个数据:leader_LEO.leade ...

  3. [转帖]Nacos的版本支持情况

    https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E 由于 Spring ...

  4. sringboot 调试端口启用的写法

    注意 需要在 -jar 的后面加 加在前面貌似没用 $JAVA_HOME/bin/java -Dloader.path=$CAF_MODULE_PATHS -jar -Dspring.profiles ...

  5. Jumper Server 堡垒机搭建过程

    Jumper Server 堡垒机搭建过程 背景说明 公司组织考核, 要对一套系统进行安全设置.有一个项目是使用堡垒机进行登录 堡垒机有多种用途,可以实现日志审计和安全设置等. 买商业设备的话太困难了 ...

  6. Springboot数据库连接池的学习与了解

    背景 昨天学习总结了tomcat的http连接池和线程池相关的知识,总结的不是很完整, 自己知道的也比较少,总结的时候就在想tomcat针对client 端有连接池,并且通过NIO的机制, 以较少的t ...

  7. KD-Tree 小记🐤

    KD-Tree,是用来维护一个空间(其实一般是平面)中的信息的数据结构. 以下就 2D-Tree 进行讨论.(盲猜并不会考 3D 及以上) 思想:将一个大矩形以一种方式划分成若干个小矩形,然后询问时只 ...

  8. elementUI(datepicker)限制日日期的选择

    指定起始日期,后选的将会受到先选的限制 参考地址 https://www.jianshu.com/p/c59c8ef6c500 实现方法不难,利用了 change 事件,动态改变 picker-opt ...

  9. 7.2 Windows驱动开发:内核注册并监控对象回调

    在笔者上一篇文章<内核枚举进程与线程ObCall回调>简单介绍了如何枚举系统中已经存在的进程与线程回调,本章LyShark将通过对象回调实现对进程线程的句柄监控,在内核中提供了ObRegi ...

  10. MySQL8.0清空binlog

    环境 centos7.9 mysql  Ver 8.0.32 登录MySQL,查看binlog日志 #查看binlog日志开启状态,log_bin值为ON表示开启状态 mysql> show v ...