说明

曾经在学习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. [转帖]Oracle进程中的 LOCAL=NO 和 LOCAL=YES

    https://www.cnblogs.com/wjoyxt/p/3780860.html 我们在服务器上用sqlplus 连接数据库,在查看进程,会多出一条记录: oracle 16007 1600 ...

  2. [转帖]KingbaseES 服务器运行参数分类

    https://www.cnblogs.com/kingbase/p/16969149.html Kingbase 服务器运行参数分类 说明: KingbaseES 数据库中,服务器运行参数分为多种类 ...

  3. gcore的学习

    gcore的学习-解决jmap无法生成dump文件的一种方法 背景 周末在跆拳道馆看孩子练跆拳道. 开着笔记本翻到了 扣钉日记 公众号里面的讲解 想着自己也遇到过无法保存dump文件的情况. 所以想学 ...

  4. SingleNode HDFS 搭建过程

    背景 1. 纯粹测试 2. 未考虑安全和授权以及数据处理. 3. 单节点最简单的部署, 验证功能连接的可能性 资料获取以及环境变量的设置 获取最新的安装文件 https://downloads.apa ...

  5. CS231N Assignment1 softmax 笔记

    -为Softmax分类器实现完全矢量化的损失函数 -实现解析梯度完全矢量化的表达式 使用数值梯度检查实现结果 使用验证集调整学习率和正则化强度 使用SGD优化损失函数 可视化最终学习的权重 softm ...

  6. vue render函数的简单使用(1)

    1.render函数的介绍 在vue中我们经常使用HTML模板语法来组建页面. 除此之外,使用还可以使用render函数来创建页面. 因为vue是虚拟DOM,拿到template模板时也要转译成VNo ...

  7. 学到了,原来 gzip 是种`连续分块`的压缩算法

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 我想要表述的是:假设有 10 mb的数据使用 gzip 算 ...

  8. 基于50W携程出行攻略构建事件图谱(含码源):交通工具子图谱、订酒店吃饭事件图谱等

    基于50W携程出行攻略构建事件图谱(含码源):交通工具子图谱.订酒店吃饭事件图谱等 项目构成 本项目由两个部分的组成,具体包括语料的获取以及基于语料的事件挖掘两个部分,具体项目目录包括: news_s ...

  9. 19.6 Boost Asio 文本压缩传输

    Base64是一种二进制到文本的编码方案,用于将二进制数据转换为ASCII字符串格式.它通过将二进制数据流转换为一系列64个字符来工作,这些字符都可以安全地传输到设计用于处理文本数据的系统中. 如下代 ...

  10. C/C++ 使用CRC检测内存映像完整性

    前面的那一篇文章中所使用的技术只能有效抵抗解密者直接修改硬盘文件,当我们使用动态补丁的时候,那么内存中同样不存在校验效果,也就无法抵御对方动态修改机器码了,为了防止解密者直接对内存打补丁,我们需要在硬 ...