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

news2024/12/23 14:16:45

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

在这里插入图片描述

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

  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,但在运行时,实际调用的是派生类中的重写方法,产生了多态的效果。

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第二部分组件化编程:vue学习(53-60)

文章目录 53.对组件的理解54 非单文件组件55 组件的几个注意事项56 组件的嵌套57 vuecomponent构造函数58 vue实例与组件实例59 一个重要的内置关系60 单文件组件 53.对组件的理解 左侧2个页面&#xff0c;如果要复用js和css的话&#xff0c;引用的路线十分混乱。使用js模块化&…

熔断、隔离、重试、降级、超时、限流,高可用架构流量治理核心策略全掌握

可用性的定义 在探讨高可用架构之前&#xff0c;让我们以 O2 系统为例&#xff0c;解释一下何谓可用性。O2 是腾讯内部的一个广告投放系统&#xff0c;专注于提升投放效率、分析广告效果&#xff0c;拥有自动化广告投放、AIGC 自动化素材生产等多种功能。 其整体架构概览如下&…

abaqus复合材料 19个实例

实例操作: 1.复合材料层结构的三种常用建模方法、静力分析中强度准则和损伤判据的引入、数据输入与输出 2.层合结构的热-力耦合分析 3.基于虚裂纹闭合技术(VCCT)的分层扩展模拟 4.基于cohesive单元的分层/界面损伤扩展模拟 5.基于XFEM方法的裂纹扩展模拟 6.复合材料加筋板…

在Go语言中实现HTTP请求的缓存

大家好&#xff0c;我是你们可爱的编程小助手&#xff0c;今天我们要一起探讨如何使用Go语言实现HTTP请求的缓存。听起来是不是很酷&#xff1f;让我们开始吧&#xff01; 首先&#xff0c;我们要明白什么是缓存。简单来说&#xff0c;缓存就是将数据存储在内存中&#xff0c;…

中国供应链,出海大时代

尽量优化、打通跨境电商每一个参与方的物流、商流、信息流、资金流是电商供应链出海的解题之法。这个过程中数智化便是打通这些节点的钥匙。 作者|斗斗 编辑|皮爷 出品|产业家 “速卖通加持&#xff0c;阿里国际零售商业收入同比上涨73%”“拼多多发布Q3财报同比增长94%…

STM32MP157/linux驱动学习记录

1. uboot烧录 2.linux安装nfs服务 sudo apt-get install nfs-kernel-server rpcbind安装nfs服务 在用户根目录下创建一个名为“linux”的文件夹&#xff0c;以后所有的东西都放到这个“linux”文件夹里面&#xff0c;在“linux”文件夹里面新建一个名为“nfs”的文件夹&#…

文件属性信息

文件的属性信息 Linux是一个基于文件的操作系统&#xff0c;因此作为文件本身也就有很多属性&#xff0c;如果想要查看某一个文件的属性有两种方式&#xff1a;命令和函数。虽然有两种方式但是它们对应的名字是相同的&#xff0c;叫做stat。另外使用file命令也可以查看文件的一…

从fuzz视角看CTF堆题--qwb2023_chatting

前言 这个题目是一个c的堆题&#xff0c;而我自己对于c的一些内存分配不太了解&#xff0c;同时也不太会c的逆向&#xff0c;硬看是没有办法了&#xff0c;所以就想能不能通过fuzz的角度去进行利用 fuzz 大概思路 函数选择 可以看到有add delete switch read listuser mes…

大创项目推荐 深度学习动物识别 - 卷积神经网络 机器视觉 图像识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…

小红书如何高效引流?

近年来&#xff0c;公域流量价格不断上涨&#xff0c;私域流量的优势逐渐凸显。企业正花费大量资源和成本来获取新流量&#xff0c;但与其如此&#xff0c;不如将精力放在留存和复购上&#xff0c;从而实现业绩的新增长。其中关键在于如何有效地将公域流量转化为私域流量。 然而…

html5实现好看的个人博客模板源码

文章目录 1.设计来源1.1 主界面1.2 认识我界面1.3 我的文章界面1.4 我的模板界面1.5 文章内容界面 2.结构和源码2.1 目录结构2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/135368653 html5实现好看…

ExecutorCompletionService详解

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 微信公众号&#xff1a;Java随想录 文章目录 摘要ExecutorCompletionService适用场景ExecutorCompletionService使用ExecutorCompletionService原理解析注意事项总结 摘要 ExecutorCompletionService 是Jav…

LeetCode做题总结 15. 三数之和(未完)

不会做&#xff0c;参考了代码随想录和力扣官方题解&#xff0c;对此题进行整理。 代码思路 思想&#xff1a;利用双指针法&#xff0c;对数组从小到大排序。先固定一个数&#xff0c;找到其他两个。 &#xff08;1&#xff09;首先对数组从小到大排序。 &#xff08;2&…

【网络技术】【Kali Linux】Wireshark嗅探(四)域名系统(DNS)

一、实验目的 本次实验使用wireshark流量分析工具进行网络嗅探&#xff0c;旨在了解域名系统&#xff08;DNS&#xff09;的工作原理。 二、域名系统概述 简单来说&#xff0c;域名系统&#xff08;Domain Name System, DNS&#xff09;将域名&#xff08;可以理解为“网址”…

为什么要用扫码出入库?

一、什么是扫码出入库管理系统 传统的仓库管理模式存在很多问题&#xff0c;如&#xff1a;货物积压、过期、丢失等。这些问题不仅影响了企业的正常运营&#xff0c;还给企业带来了经济损失。为了解决这些问题&#xff0c;扫码出入库管理系统应运而生。该系统采用先进的二维码…

Apache的配置与应用

目录 1、Apache简介 2、Apache连接保持 3、Apache的访问控制 3.1、客户机地址限制 3.2、用户授权限制 &#xff08;1&#xff09;创建用户认证数据文件 &#xff08;2&#xff09;添加用户授权配置 &#xff08;3&#xff09;验证用户访问授权 4、Apache日志分割 4…

Vivado JESD204B与AD9162建立通信实战总结

一、FPGA与AD9162的JESD204B接口 FPGA作为JESD204B接口的发送端&#xff0c;AD9162作为JESD204B接口的接收端。FPGA和AD9162的device clk、SYSREF由同源时钟芯片产生。其中&#xff0c;FPGA和AD9162的divice clk时钟不同&#xff0c;并且FPGA的decive clk等同于JESD204B IP的co…

【UnityShader入门精要学习笔记】(3)章节答疑

本系列为作者学习UnityShader入门精要而作的笔记&#xff0c;内容将包括&#xff1a; 书本中句子照抄 个人批注项目源码一堆新手会犯的错误潜在的太监断更&#xff0c;有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 文章目录 复习&#xff08;阶段性总结…

数据分析案例-外国电影票房数据可视化分析(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

k8s 1.23.5版本安装ingress1.6.4

1、背景 网上找了好几个ingress 文件&#xff0c;可能是版本没对&#xff0c;ingress都没有安装成功&#xff0c;最后查了相关资料&#xff0c;手动安装了。 下面是版本的匹配列表 github中ingress 地址&#xff1a;https://github.com/kubernetes/ingress-nginx 1.23.5版本支…