说明

曾经在学习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. [转帖]HTTP状态码、请求方法、响应头信息

    https://www.cnblogs.com/pachongshangdexuebi/p/5279608.html HTTP状态码 当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求. ...

  2. [转帖]linux 系统级性能分析工具 perf 的介绍与使用

    目录 1. 背景知识 1.1 tracepoints 1.2 硬件特性之cache 2. 主要关注点 3. perf的使用 3.0 perf引入的overhead 3.1 perf list 3.2 ...

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

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

  4. TypeScript数组类型定义

    第一种方式:可以在元素类型后面接上 [],表示由此类型元素组成的一个数组: var arr: number[] = [1, 2, 3]; //数字类型的数组 var arr2: string[] = ...

  5. .NET 6 使用 System.Drawing.Common 出现 The type initializer for ‘Gdip’ threw an exception 异常的解决办法

    出现问题的原因 在Linux环境部署.NET Core程序时,如果要到System.Drawing.Common引用会出现该问题,目前大量的第三方组件使用该Windows专用库,尤其是涉及图片处理.W ...

  6. 人工智能创新挑战赛:助力精准气象和海洋预测Baseline[3]:TCNN+RNN模型、SA-ConvLSTM模型

    "AI Earth"人工智能创新挑战赛:助力精准气象和海洋预测Baseline[3]:TCNN+RNN模型.SA-ConvLSTM模型 1.气象海洋预测-模型建立之TCNN+RNN ...

  7. python处理Excel实现自动化办公教学(含实战)【一】

    相关文章: python处理Excel实现自动化办公教学(含实战)[一] python处理Excel实现自动化办公教学(含实战)[二] python处理Excel实现自动化办公教学(数据筛选.公式操作 ...

  8. Redis安装及使用详解篇

    一.什么是Redis? Redis(Remote Dictionary Server ),即远程字典服务. Redis是是现在最受欢迎的NoSQL数据库之一,是一种支持key-value等多种数据结构 ...

  9. 同时配置github和gitee秘钥

    1.设置用户名和邮箱 git config --global --list 查看全局配置信息 git config --global --list 删除配置:必须删除该设置 git config -- ...

  10. js转化文章发布于几天几小时几分钟前

    alert(dateFormat('2020-07-08 11:32:44')); function dateFormat(d1) { var dateEnd = new Date();//获取当前时 ...