【面试】面向对象编程的三大概念(实例辅助记忆)

【面试】面向对象编程的三大概念(实例辅助记忆)

在这里插入图片描述

虑面向对象编程的三大特性,它们是:

  1. 封装(Encapsulation): 将对象的状态和行为封装在一起,对外部隐藏对象的内部实现细节。这样可以防止外部直接访问对象的内部数据,通过对象的方法来控制和操作数据。
  1. 继承(Inheritance): 允许一个类(子类)继承另一个类(父类)的属性和方法。这样可以通过在子类中重用父类的代码,减少代码的重复性,并实现代码的扩展和维护。
  1. 多态(Polymorphism): 允许使用同一操作符或方法调用来操作不同的数据类型,提高代码的灵活性。多态包括编译时多态(方法重载)和运行时多态(方法重写)。

封装

封装是面向对象编程中的一个概念,它指的是将一个对象的状态(数据)和行为(方法)捆绑在一起,形成一个独立的、封闭的单元。这样,对象的内部实现细节对外部是隐藏的,只有通过对象提供的公共接口(方法)才能访问和操作对象的状态。

封装有助于保护对象的内部状态,防止外部直接访问和修改,从而提高了代码的安全性和可维护性。同时,封装还提供了一个清晰的接口,使得对象的使用者无需了解对象的具体实现细节,只需通过公共接口进行操作。

下面是一个简单的Java示例,展示了封装的概念:

public class Person {
    // 封装的状态(私有属性)
    private String name;
    private int age;

    // 构造方法
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 封装的行为(公共方法)
    public String getName() {
        return name;
    }

    public void setName(String name) {
        // 在设置姓名时可以加入一些验证逻辑
        if (name != null && !name.isEmpty()) {
            this.name = name;
        } else {
            System.out.println("姓名不能为空");
        }
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        // 在设置年龄时可以加入一些验证逻辑
        if (age >= 0 && age <= 150) {
            this.age = age;
        } else {
            System.out.println("年龄无效");
        }
    }
}

在这个例子中,Person 类封装了两个私有属性 nameage,并提供了公共的访问和修改方法 getName()setName()getAge()setAge()。外部代码不能直接访问 nameage,而是通过这些公共方法来操作对象的状态。这样,Person 类就实现了封装。

继承

继承是面向对象编程的三大特性之一,它允许一个类(子类/派生类)继承另一个类(父类/基类)的属性和方法。子类可以重用父类的代码,同时可以根据需要添加新的属性和方法,实现代码的重用和扩展。

下面是一个简单的Java示例,演示了继承的基本概念:

// 父类 Animal
class Animal {
    // 父类属性
    protected String name;

    // 父类构造方法
    public Animal(String name) {
        this.name = name;
    }

    // 父类方法
    public void eat() {
        System.out.println(name + " is eating.");
    }
}

// 子类 Dog 继承自 Animal
class Dog extends Animal {
    // 子类新增属性
    private String breed;

    // 子类构造方法,通过 super 调用父类的构造方法
    public Dog(String name, String breed) {
        super(name);
        this.breed = breed;
    }

    // 子类重写父类方法
    @Override
    public void eat() {
        System.out.println(name + " the " + breed + " is eating.");
    }

    // 子类新增方法
    public void bark() {
        System.out.println(name + " is barking.");
    }
}

public class TestInheritance {
    public static void main(String[] args) {
        // 创建子类对象
        Dog myDog = new Dog("Buddy", "Golden Retriever");

        // 调用继承自父类的方法
        myDog.eat(); // 输出:Buddy the Golden Retriever is eating.

        // 调用子类新增的方法
        myDog.bark(); // 输出:Buddy is barking.
    }
}

在这个例子中,Animal 是父类,Dog 是子类。子类通过 extends 关键字继承了父类的属性和方法。子类还可以新增属性和方法。在TestInheritance 类中,创建了一个 Dog 对象,通过该对象可以调用继承自父类的 eat 方法,以及子类新增的 bark 方法。

继承提供了代码的重用性和扩展性,使得我们可以更好地组织和管理代码。但需要注意,过度的继承可能导致代码的复杂性和耦合性增加,因此需要谨慎使用。

多态

多态是面向对象编程的三大特性之一,它允许不同类的对象对相同的消息做出不同的响应。多态提高了代码的灵活性和可扩展性。

在Java中,多态通过方法的重写(Override)和接口(Interface)的实现来实现。下面是一个简单的例子,通过继承和方法重写演示多态:

// 基类 Animal
class Animal {
    public void makeSound() {
        System.out.println("Animal makes a sound");
    }
}

// 派生类 Dog
class Dog extends Animal {
    // 重写基类的 makeSound 方法
    @Override
    public void makeSound() {
        System.out.println("Dog barks");
    }
}

// 派生类 Cat
class Cat extends Animal {
    // 重写基类的 makeSound 方法
    @Override
    public void makeSound() {
        System.out.println("Cat meows");
    }
}

public class TestPolymorphism {
    public static void main(String[] args) {
        // 使用基类的引用指向派生类的对象
        Animal myDog = new Dog();
        Animal myCat = new Cat();

        // 调用 makeSound 方法,实际调用的是派生类中的重写方法
        myDog.makeSound(); // 输出:Dog barks
        myCat.makeSound(); // 输出:Cat meows
    }
}

在这个例子中,Animal 是基类,DogCat 是派生类。基类中有一个 makeSound 方法,而派生类分别重写了这个方法。在 TestPolymorphism 类的 main 方法中,使用基类的引用分别指向 DogCat 对象。尽管引用类型是 Animal,但在运行时,实际调用的是派生类中的重写方法,产生了多态的效果。

这样,通过多态,我们可以使用基类的引用来引用不同派生类的对象,并且在运行时动态地选择调用哪个类的方法。这提高了代码的灵活性,使得我们能够轻松地扩展和修改代码。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Nginx 简介和入门 - part1

虽然作为1个后端程序员&#xff0c; 终究避不开这东西 安装Nginx 本人的测试服务器是debian &#xff0c; 安装过程跟ubuntu基本一样 sudo apt-get install nginx问题是 nginx 安装后 执行文件在/usr/sbin 而不是/usr/bin 所以正常下普通用户是无法使用的。 必须切换到root…

事件循环的理解

1.单线程 Js是一个单线程的语言,代码只能一行一行去执行,遇到同步的代码就直接执行了,如果遇到异步的代码怎么办&#xff1f; 不可能等到异步的代码执行完&#xff0c;在去执行后面同步的代码。 2.主线程 遇到同步的代码,就在主线程里面直接执行了。 3.任务队列 遇到异步的…

数位dp详解,记忆化搜索,递推,OJ精讲

文章目录 前言引例-不降数前置知识差分转换枚举技巧前缀状态 状态分析状态设计状态转移初始状态记忆化搜索 引例代码实现状态初始化数位初始化记忆化搜索 非递归如何实现&#xff1f;状态设计状态转移算法原理算法实现初始化递推求解 OJ精讲Good Numbers不要62不含连续1的非负整…

redis 从0到1完整学习 (十四):RedisObject 之 ZSet 类型

文章目录 1. 引言2. redis 源码下载3. redisObject 管理 ZSet 类型的数据结构4. 参考 1. 引言 前情提要&#xff1a; 《redis 从0到1完整学习 &#xff08;一&#xff09;&#xff1a;安装&初识 redis》 《redis 从0到1完整学习 &#xff08;二&#xff09;&#xff1a;re…

【基础】【Python网络爬虫】【1.认识爬虫】什么是爬虫,爬虫分类,爬虫可以做什么

Python网络爬虫基础 认识爬虫1.什么是爬虫2.爬虫可以做什么3.为什么用 Ptyhon 爬虫4.爬虫的分类通用爬虫聚焦爬虫功能爬虫增量式爬虫分布式爬虫 5.爬虫的矛与盾&#xff08;重点&#xff09;6.盗亦有道的君子协议robots7.爬虫合法性探究 认识爬虫 1.什么是爬虫 网络爬虫&…

LAYABOX:2024新年寄语

2024新年寄语 过去的一年&#xff0c;尽管许多行业面临严峻挑战和发展压力&#xff0c;小游戏领域却逆势上扬&#xff0c;年产值首次突破400亿元大关&#xff0c;众多优质小游戏企业收获颇丰。 对此&#xff0c;祝福大家&#xff0c;2024一定更好&#xff01; 过去的一年&#…

基于低代码的指尖遐想_2

广义低代码解决了企业或个人的哪些问题&#xff0c;其快速发展的背后说明了什么&#xff1f; 基于一个简要的企业信息化系统来分析阐述&#xff08;天下大事合久必分&#xff0c;分久必合&#xff09;&#xff1a; 2010年前后&#xff0c;一个合格的程序员&#xff0c;可以做需…

YOLOv8改进 | 2023主干篇 | FasterNeT跑起来的主干网络( 提高FPS和检测效率)

一、本文介绍 本文给大家带来的改进机制是FasterNet网络&#xff0c;将其用来替换我们的特征提取网络&#xff0c;其旨在提高计算速度而不牺牲准确性&#xff0c;特别是在视觉任务中。它通过一种称为部分卷积&#xff08;PConv&#xff09;的新技术来减少冗余计算和内存访问。…

系统学习Python——装饰器:函数装饰器-[对方法进行装饰:使用嵌套函数装饰方法]

分类目录&#xff1a;《系统学习Python》总目录 如果想要函数装饰器在简单函数和类级别的方法上都能工作&#xff0c;最直接的解决办法在于使用前面文章介绍的状态保持方案之一&#xff1a;把自己的函数装饰器编写为嵌套的def&#xff0c;这样你就不会陷入单一的self实例参数既…

听GPT 讲Rust源代码--library/portable-simd

File: rust/library/portable-simd/crates/core_simd/examples/spectral_norm.rs spectral_norm.rs是一个示例程序&#xff0c;它展示了如何使用Portable SIMD库中的SIMD&#xff08;Single Instruction Multiple Data&#xff09;功能来实现频谱规范化算法。该示例程序是Rust源…

仿网易云音乐网站PHP源码,可运营的原创音乐分享平台源码,在线音乐库系统

源码介绍 使用PHP和MYSQL开发的原创音乐分享平台源码&#xff0c;仿网易云音乐网站。用户可以在网站上注册并上传自己的音乐作品&#xff0c;系统内置广告系统&#xff0c;为网站创造收入来源。 安装教程 1.导入sql.sql 2.修改 includes\config.php 数据库信息和网址都改成…

3、事务与持久化

目录 1、事务 2、持久化 1. RDB 2.AOF 3.Redis的主从架构 4、哨兵 5、Redis的集群 1、事务 Redis事务&#xff1a;一次失误操作&#xff0c;该成功的成功&#xff0c;该失败的失败。 先开启事务&#xff0c;执行一些列的命令&#xff0c;但是命令不会立即执行&#xf…

第9章 继承和派生习题(详解)

一、选择题 1&#xff0e;下列表示引用的方法中&#xff0c; &#xff08;&#xff09; 是正确的。已知&#xff1a;int m10&#xff1a; A&#xff0e;int &xm&#xff1b; B&#xff0e;int &y10&#xff1b; C&#xff0e;int &z&#xff1b; D&#xff0e;fl…

双指针——移动零

题目 示例 算法原理 我们使用两个指针&#xff0c;cur扫描数组&#xff0c;如果nums[cur]为非0&#xff0c;dest&#xff0c;然后让nums[cur]与nums[dest]交换&#xff0c;从而实区间[0,dest]为非0,[dest1,cur]为0&#xff0c;[cur,numsSize-1]为未扫描 题目链接&#xff1a;28…

1.1 理解大数据(2)

小肥柴的Hadoop之旅 1.1 理解大数据&#xff08;2&#xff09; 目录1.1 理解大数据1.1.3 大数据概述1.1.4 更多思考 参考文献和资料 目录 1.1 理解大数据 1.1.3 大数据概述 step_0 大数据定义 【《大数据算法设计分析》】&#xff1a; 通常来讲大数据&#xff08;Big Data&am…

pyqt5用qtdesign设计页面时,去掉页面的空白界面、边框和标题栏

前言 Windows默认的标题栏有时候自己觉得不太美观&#xff0c;就想自己设计一个&#xff0c;然后把默认的去掉&#xff0c;并且把长方形的边框和多余的空表界面去掉&#xff0c;就是下图中圈出来的区域&#xff1a; 去掉之后的效果如图&#xff1a; 这样我们就可以自定义窗…

Spring Boot 3 集成 Jasypt详解

随着信息安全的日益受到重视&#xff0c;加密敏感数据在应用程序中变得越来越重要。Jasypt&#xff08;Java Simplified Encryption&#xff09;作为一个简化Java应用程序中数据加密的工具&#xff0c;为开发者提供了一种便捷而灵活的加密解决方案。本文将深入解析Jasypt的工作…

57.网游逆向分析与插件开发-游戏增加自动化助手接口-接管游戏的自动药水设定功能

内容来源于&#xff1a;易道云信息技术研究院VIP课 码云地址&#xff08;master分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;51307d6bf69f2f3c645c70d09f841f5e32da79b9 代码下载地址&#xff0c;在 SRO_EX 目录下&…

MySQL 8.0 InnoDB Tablespaces之Undo Tablespaces(UNDO表空间)

文章目录 MySQL 8.0 InnoDB Tablespaces之Undo Tablespaces&#xff08;UNDO表空间&#xff09;Undo Tablespaces&#xff08;UNDO表空间&#xff09;默认UNDO表空间添加 Undo 表空间查看Undo 相关的信息查看Undo 相关参数变量查看Undo 状态信息通过information_schema.innodb_…

Java ArrayList在遍历时删除元素

文章目录 1. Arrays.asList()获取到的ArrayList只能遍历&#xff0c;不能增加或删除元素2. java.util.ArrayList.SubList有实现add()、remove()方法3. 遍历集合时对元素重新赋值、对元素中的属性赋值、删除元素、新增元素3.1 普通for循环3.2 增强for循环3.3 forEach循环3.4 str…