什么是面向对象,它的三个基本特征:封装、继承、多态

2023-05-16

什么是面向对象思想?已经学完了java确不知道如何跟别人解释面向对象是什么意思这很常见。让我们一起来回顾下这个奇思妙想~

文章目录

  • 一、面向对象与面向过程
    • 1、什么是面向过程?
    • 2、什么是面向对象?
  • 二、类与对象的关系
    • 1、基本概念
    • 2、类与对象的区别
  • 三、基本特征:封装、继承、多态
    • 1、封装
    • 2、继承
    • 3、多态


一、面向对象与面向过程

现在越来越多的高级语言流行起来了,如大家耳熟能详的c++,python,java等,这些都是基于面向对象的语言
而最最基础的,学校必学的语言----c语言它是属于面向过程的语言。
好了,现在让我们来讨论下这两类语言的区别

1、什么是面向过程?

面向过程:
就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。

举例来说,大象装进冰箱需要几步?
在这里插入图片描述
按照面向过程思想:
第一步:工作人员去打开冰箱门
第二步:把大象塞进冰箱
第三步:工作人员把冰箱门关上
诶,这里我们就看出来了,面向过程就是把一件事按步骤一步一步来实现
用代码表示

    public void openDoor(){}  //开门
    public void putIn(){}       //装冰箱
    public void closeDoor(){}   //关门

依次调用这些方法就完成了

2、什么是面向对象?

对象,就是对问题中的事物的抽象
面向对象:
就是把现实中的事物都抽象为“对象”。每个对象是唯一的,且都可以拥有它的属性与行为。我们就可以通过调用这些对象的方法、属性去解决问题。

用面向对象思想解决大象装进冰箱

大致的了解到了对象这个概念,可以说是对现实事物的一种抽象映射
在这里插入图片描述
例如在这个事件中:
冰箱作为一个对象;
大象作为一个对象。
冰箱有这些功能:开门、装物体、关门

class fridge{
    public void open(大象){}   //开门
    public void putIn(大象){}  //放进冰箱
    public void close(大象){}  //关门
}
class elephant{
	public void eat(){}   //吃
}

看出来了什么?每个对象是独立的,有属于它自己的功能,只需要专心实现自己的功能就好。所以在建立对象模型阶段,仅仅关注对象有什么的功能,但不考虑如何实现这些功能。

面向对象的好处,就包括有很好的延展性,比如我给大象赋予了一个吃的功能,它通过调用就可以在冰箱里去吃东西。面向对象就是把现实问题抽象为对象,通过调用每个对象的属性或功能去解决问题。

如果我要修改我的需求,把大象换成兔子,我用面向过程是不是得把每个步骤中的大象改为兔子。而用面向对象解决,我甚至可以重新创一个兔子对象,仅仅在调用的时候选择兔子就行了。

二、类与对象的关系

很多人都会创建对象,不就是new嘛,调用对象方法不就是new.方法嘛。结果,有部分人在new类的时候,就下意识的把类当成了对象,那么类到底是不是对象呢?

肯定不是,先给出他们的基本概念

1、基本概念

对象
对象是由数据(描述事物的属性)和作用于数据的操作(体现事物的行为)组成的封装体,描述客观事物的一个实体,是构成系统的基本单元。


类是对一组有相同数据和相同操作的对象的定义,是对象的模板,其包含的方法和数据描述一组对象的共同行为和属性。类是在对象之上的抽象,对象则是类的具体化,是类的实例。类可有其子类,也可有其他类,形成类层次结构。

2、类与对象的区别

1)类是对象的抽象,而对象是类的具体实例。类是抽象的,不占用内存,而对象是具体的,占用存储空间。

2)类是一组具有相同属性和行为的对象的抽象。我们可以将类看做是创建对象蓝图,对象根据这个蓝图去具体实现某个东西。

比如来说,给一张“伞”的蓝图,我们设计出了晴雨伞,剑伞等等,你会发现,这些伞都有相同的行为呀----遮雨
在这里插入图片描述

所以,类的实例化结果就是对象,而对一类对象的抽象就是类,类描述了一组有相同属性和相同方法的对象。

三、基本特征:封装、继承、多态

1、封装

(一)基本概念
封装(encapsulation)即信息隐蔽。它是指在确定系统的某一部分内容时,应考虑到其它部分的信息及联系都在这一部分的内部进行,外部各部分之间的信息联系应尽可能的少。

(二)四种访问控制级别

  • public:对外公开,访问级别最高
  • protected:只对同一个包中的类或者子类公开
  • 默认:只对同一个包中的类公开
  • private:不对外公开,只能在对象内部访问,访问级别最低
    在这里插入图片描述

(三)封装使用
1、把尽可能多的东西藏起来,对外提高简洁的接口
比如有半自动洗衣机和一个全自动洗衣机

半自动洗衣机接口有以下方法
①开机
②关机
③放水
④定时
⑤洗涤
⑥排水
⑦脱水

全自动洗衣机有以下方法
①开机
②关机
③设置洗衣机模式
④开始洗衣服,洗完自动关

对比来看,我们就会发现,自动洗衣机把放水、定时、洗涤、排水、脱水等细节,封装到了③设置洗衣机模式里,这样为使用者提供了更加简单易用的接口,所以自动洗衣机会更加方便。

2、把所有属性藏起来
加入某种属性允许外界访问,那么提供访问该属性的公开方法。假如狗类有一个名字、年龄属性,不允许外界直接访问属性,但允许提供get和set方法来访问

class Dogs{
    private String name;  //名字
    private String age;   //年龄
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}

那么我们把属性设为private私有,把对外界提供设置属性的方法设置为public。

有些人会问,既然是对外公开的,为什么不直接把name,age属性设置为public呢,反而还要通过方法来设置,会不会多此一举?

不会,有以下四个原因:

(一)符合现实外因通过内因起作用的客观规律
假设原来狗就有一个叫“旺财”的名字,是对象本身原主人取的,调用了setName()方法【内因】。好了,领养狗的主人打算给狗换个名字“大黄”,他是使用者,也是调用setName()方法【外因】。

(二)灵活控制属性的读和修改的访问级别
比如我只能让使用者知道这狗狗的名字,但却不允许修改他。那就吧setName()设为private私有,getName()设为public公有。

(三)防止使用者错误修改属性
直接调用类的属性,万一改错了怎么办。所以我们可以在公有方法setName()里面添加限制条件,防止使用者错误修改属性。例如,狗狗的年龄的范围要在0~20期间。

public void setAge(int age) {
    if (age >20 || age < 0){
        throw new IllegalArgumentException("口令不合法");
    }
    else {
        this.age = age;
    }
}

(四)有助于对象封装实现细节
如果上述判断年龄合法的过程我们不想对使用者公开,就把这个过程用private封装成一个“透明”的方法。这个判断年龄合法的过程对使用者是透明的。

与封装具有相同含义的一个概念就是透明。对象封装实现细节,也就意味着对象的实现细节对使用者是透明的。透明在这里理解为“看不见”

public void setAge(int age) {
        isLegal();   //判断是否合法
        this.age = age;
    }

private void isLegal(){
    if (age >20 || age < 0){
        throw new IllegalArgumentException("口令不合法");
    }
    else return;
}

2、继承

继承:让某个类型的对象获得另一个类型的对象的属性和方法。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

(一)语法

class A extends B{}

一共继承了哪些东西呢?这要分两种情况

  • 当A和B在同一包下,A继承了B中public、protected和默认访问级别的成员变量和成员方法
  • 当A和B不在同一包下,A继承了B中public、protected成员变量和成员方法

(二)继承父类成员变量/方法
hanqishi继承了父类Dog

class Dog{
    public String name="小白";
    public void say(){
        System.out.println("汪汪汪");
    }
}
//哈奇士
class haqishi extends Dog {
    public void test(){
        System.out.println(name);
        say();
    }
}

调用haqishi的test()方法,测试如下

小白
汪汪汪

测试结果:子类haqishi继承了父类的成员变量和成员方法

(三)重写父类方法
子类haqishi重写父类Dog的say方法

class Dog{
    public String name="小白";
    public void say(){
        System.out.println("汪汪汪");
    }
}
//哈奇士
class haqishi extends Dog {
    @Override
    public void say() {
        //super.say();    继承父类原有方法
        System.out.println("哈哈哈");
    }
}

调用子类say方法,测试如下:

哈哈哈

(四)重载父类方法
重载方法必须满足以下条件:
1、方法名相同
2、方法的参数类型、个数、顺序至少有一项不同
3、方法的返回类型可以不同
4、方法的修饰符可以不相同

class Dog{
    public String name="小白";
    public void say(){
        System.out.println("汪汪汪");
    }
}
//哈奇士
class haqishi extends Dog {
   //重载 改变参数
    public void say(String name) {
        System.out.println(name+"汪汪汪");
    }
	//重载 改变参数+返回值
    public int say(int age) {
        System.out.println("汪汪汪"+age);
        return age;
    }
}

分别调用
haqishi h = new haqishi();
h.say();
h.say(“哈奇士”);
h.say(6);
结果如下:

汪汪汪
哈奇士汪汪汪
汪汪汪6

3、多态

多态:对于同一个行为,不同的子类对象具有不同的表现形式。多态存在的3个条件:
1)继承 2)重写 3)父类引用指向子类对象。

public class extend {
    public static void main(String[] args) {
        Animal a = new Dog();
        Animal b = new Cat();
        a.say();
        b.say();
    }
}

abstract class Animal {
    abstract void say();
}
//猫
class Cat extends Animal{
    public String name="小黑";
    public void say(){
        System.out.println("喵喵喵");
    }
}
//狗
class Dog extends Animal{
    public String name="小白";
    public void say(){
        System.out.println("汪汪汪");
    }
}

运行结果

汪汪汪
喵喵喵

理解多态
在这个运行环境中,引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定。Java虚拟机会根据引用变量指向的对象来调用该对象的指定方法,这种运行机制被称为动态绑定

参考文献:《Java面向对象编程(第2版)》- 孙卫琴

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是面向对象,它的三个基本特征:封装、继承、多态 的相关文章

  • 2022研究生数学建模B题思路

    子问题1 xff1a 排样优化问题 要求建立混合整数规划模型 xff0c 在满足生产订单需求和相关约束条件下 xff0c 尽可能减少板材用量 约束 1 在相同栈 stack xff09 里的产品项 item xff09 的宽度 xff08
  • 找到并标记Mesh顶点

    1 在Unity 3D中新建一个物体 本文以Cube为例 2 创建一个C 脚本 命名为MeshTest 3 在脚本中写入程序 在打开的脚本 MeshTest 上编写代码 xff0c 首先获取 MeshFilter 组件 xff0c 然后获取
  • TCP服务器端、客户端通讯(赋源码)

    实现通讯 xff0c 我们首先要知道是怎么样的一个流程 xff0c 下图是我画的一个通讯流程图 xff1a 一 Linux服务器端 我是在Ubuntu20 04下进行的 xff0c 使用的是C 43 43 xff0c 引入头文件socket
  • win11 命令 wmic:无效的指令 解决办法

    我想你肯定看到过让你修改环境变量的方法 但是 xff0c 如果你的电脑就根本没有装wmic xff0c 再怎么修改环境变量也是徒劳 我们打开设置 xff1a Win 43 I 点击应用 选择 可选功能 添加可选功能 搜索wmic xff0c
  • Python面向对象编程:关于类的方法中属性是否加前缀self的问题

    问题的缘起 今天完成了LeetCode首秀 xff08 而且是用刚学不久的python做的 xff09 xff0c 心情挺激动的 xff0c 毕竟之前只涉猎了竞赛OJ xff0c 没有在应用型平台上刷过题 xff0c 不妨定一个小目标 xf
  • 概念物理Ⅱ 第一讲:绪论

    目录 物理学研究的对象和动机为什么要研究物理学 xff1f 1 满足人类对大自然基本规律的好奇心2 改进技术 发展生产 两个动机之间的关系 物理学的发展历史起源于古希腊古典物理学时间 xff1a 牛顿时代 1900年经典力学 xff08 牛
  • Machine Learning:k近邻算法(KNN)

    目录 写在前面的话k 近邻算法概述优点缺点适用数据范围 原理Python代码实现Sklearn直接调用weights选项algorithm选项 算法测试与结果评价原理及方法函数主要参数说明Python代码实现 示例反思与总结 写在前面的话
  • 《Python爬虫技术:深入理解原理、技术与开发》读书笔记(一)

    目录 前言第1章 基础知识第2章 爬虫基础HTTP基础URL与URI超文本HTTP与HTTPSHTTP的请求过程Network面版 前言 这是本系列的第一篇文章 xff0c 文如其题 xff0c 这个系列旨在学习Python爬虫技术 本系列
  • 给软件工程师的自学建议

    给软件工程师的自学建议 与现在大学生的情况类似 xff0c 学校学的专业知识总是与实际工作中需要的知识相差甚远 或许进入我们这个行业就注定要一辈子不离书本 不离学习了 由于软硬件技术的推陈出新 xff0c 学校教的C Basic Pasca
  • Python基础入门—for循环

    Python基础入门 for循环 for 循环 xff1a range的使用 xff1a 循环控制语句 xff1a for else的使用 xff1a for循环嵌套 xff1a for 循环 xff1a for循环格式 xff1a for
  • 软件测试之项目总结全攻略

    在我们测试工作过程中 xff0c 由于公司业务发展 xff0c 快速迭代等原因 xff0c 我们遇到的项目以小项目居多 更新界面元素 xff0c 上个活动页 xff0c 优化一下原有的功能等等 xff0c 加上事情繁琐 xff0c 任务多
  • 教你用Python写一个京东自动下单抢购脚本(Python实现京东自动抢购)

    很多朋友都有网购抢购限量商品的经历 有时候蹲点抢怎么也抢不到 今天小编带你们学习怎么用Python写一个京东自动下单抢购脚本 以后再也不用拼手速拼网速啦 快来一起看看吧 1 问题背景 经过无数次抢购失败后 xff0c 发现商家会不定时的放出
  • JAVA基础题练习

    顺序插入 xff1a 插入有序 Scanner input 61 new Scanner System in char arr2 61 39 b 39 39 d 39 39 f 39 39 i 39 39 k 39 39 m 39 39 x
  • ubuntu20.04安装qq音乐并解决闪退问题

    在qq音乐官网下载linux版coco音乐 xff1a https y qq com download download html 下载deb包并且通过下面命令行安装 xff1a span class token function sudo
  • 架构师装逼核武器

    架构师这个职位是很多程序猿的梦想 xff0c 我有很多朋友私下和我聊天的时候 xff0c 曾多次问我要如何才能成为一个架构师 xff0c 对于这个问题 xff0c 我只能粗略的谈谈我个人的观点 xff0c 如有不同观点 xff0c 欢迎交流
  • 一文讲透java日志框架

    在项目开发过程中 xff0c 有一个必不可少的环节就是记录日志 xff0c 相信只要是个程序员都用过 xff0c 可是咱们自问下 xff0c 用了这么多年的日志框架 xff0c 你确定自己真弄懂了日志框架的来龙去脉嘛 xff1f 下面笔者就
  • HashMap底层原理

    在我们实际的项目中 xff0c HashMap这个集合类经常被用到 xff0c 可是就是这么一个常用的集合类 xff0c 却往往成了咱们面试中的绊脚石 即便你是个初级程序员 xff0c 也常会让你谈谈HashMap的底层原理 xff0c 今
  • 聊聊ThreadPoolExecutor线程池

    ThreadPoolExecutor是线程的池化技术 xff0c 也就是首先创建几个线程 xff0c 然后把线程放到池子里 xff0c 有任务来的时候直接从线程池中拉线程来执行任务 为什么要用池化技术 xff1f java中的线程是系统级别
  • Spring框架系列之bean的生命周期底层原理06

    bean的生命周期 xff0c 咱们必须从 AnnotationConfigApplicationContext的getBean方法开始 xff0c getBean顾名思义就是从Spring容器中得到一个Bean的实例对象 xff0c Sp
  • 电信运营商移动互联网发展分析

    电信运营商移动互联网发展分析 移动互联网是通信业发展的大趋势 xff0c 随着3G 和WiMAX 等高速无线接入技术的飞速发展 xff0c 移动互联网不仅继承固定互联网的很多技术 xff0c 并且在商务 娱乐以及移动性等方面拓展用户需求 自

随机推荐

  • Spring框架系列之bean的生命周期底层原理07

    上一篇我们预留了两个大的内容 xff0c 一个是Object sharedInstance 61 getSingleton beanName 从单例池中获取数据 xff0c 另外一个是getSingleton方法创建单例Bean xff0c
  • Spring框架系列之bean的生命周期底层原理08

    接着上一篇 xff0c 咱们继续doCreateBean方法的分析 xff0c doCreateBean内容比较多 xff0c 我们这次主要是把它的整体流程说下 xff0c 后续会逐个来分析每一个关键点 代码如下 xff1a protect
  • 2020-09-25 Python基础学习第三天笔记

    文章目录 一 可变字符串二 运算符三 列表1 列表的创建2 列表常用命令3 多维列表 四 元组 2020 9 24 Day3 一 可变字符串 需要原地修改字符串 xff0c 可以使用 io StringIO 对象或 array 模块 spa
  • Python Cookbook学习总结

    第一章 xff1a 数据结构和算法 任何序列 xff08 可迭代的对象 xff09 都可以通过一个简单的赋值操作来分解为单独的变量 xff0c 唯一的要求是变量的总数和结构要与序列相吻合 xff08 比如对于存储二维坐标等的二维数组 xff
  • SpringBoot解析yml/yaml/properties配置文件的四种方式汇总

    目录 一 配置文件注入方式一 64 Value 二 配置文件注入方式二 64 ConfigurationProperties 三 自定义解析类 xff0c 直接暴力读取yml配置文件 四 Spring配置文件的解析类Environment获
  • Linux下配置Apache为多端口 (centos7)

    apache设置多个不同的端口 xff0c 映射不同的文件 一 xff1a vim etc httpd conf httpd conf 查看http配置文件 滑倒最底部 xff0c 箭头标注的位置 我们需要进入该目录编辑 二 xff1a c
  • android11.0上通过广播屏蔽电源键功能

    framework base services core java com android server policy PhoneWindowManager java import java util HashSet import java
  • python和matlab实现随机攻击网络节点+蓄意攻击网络节点,实现最大连通子图比例、网络效率变化、平均距离变化等等。

    首先要有自己的邻接关系 xff0c 最好是邻接表 xff0c 如下图这样包括起点和终点 要在网络中读取自己的文件 xff0c 生成自己的复杂网络图 知道攻击方式包括哪些 xff1a 比如度 介数等 xff0c 选择自己想要的攻击方式 在研究
  • 2021-05-22

    第一个作业 xff1a 使用python编写一个数学表达式 注意 43 的运算顺序 xff0c 可以使用括号改变运算顺序 xff0c 和数学运算一样 第二个作业 xff1a 使用输入函数input xff08 提示符 xff09 xff0c
  • JavaScript变量的命名规则和命名规范

    变量的命名规则和命名规范 1 规则 你必须遵守 不然报错 1 1 一个变量只能由 数字 0 9 字母 a zA Z 美元符 划线下 组成 1 2 一个变量不能由 数字 开头 1 3 再 JS 中严格区分大小写 61 gt num Num N
  • 不惧掉签 | 苹果IPA安装包,免费自签教程

    最近连续更新了好几款 TikTok xff0c 基本上是刚更新没两天就掉签 大家也知道 xff0c 苹果的软件不像安卓 未上架App Store的软件只能签名后才能正常安装 不过 xff0c 好在国民手机管理软件 爱思助手 客户端也加入了
  • JavaScript把其他数据类型转换成字符串类型

    数据类型转换 转字符串 把其他数据类型转换成字符串类型 1 String 43 语法 String 你要转换的数据 43 返回值 转换好的数据 43 特点 61 gt 任何数据类型都能转换 2 toString 43 语法 你要转换的数据
  • JavaScript条件分支语句-switch语句

    条件分支语句 switch 43 语法 switch 要判断的变量 case 情况1 情况1执行的代码 break case 情况2 情况2执行的代码 break default 所有条件都不满足的时候执行的代码 43 注意 1 我们的每一
  • JavaScirpt - arguments

    arguments 43 在函数内部天生自带的变量 43 表示所有实参的集合 伪数组 arguments 的属性 1 length 61 gt 表示长度 arguments 里面由多少个数据 61 gt 其实就是你的函数调用由多少个实参 6
  • 简版弹幕实现。HTML+CSS+JAVASCRIPT

    思路 xff1a 1 设置video 2 设置输入框 3 获取输入框的内容 xff0c 添加 删除和更新 4 里面运用了单厂模式 xff0c 每次生成的例子都是一样的 span class token doctype lt DOCTYPE
  • webpack 模块加载原理

    webpack webpack 原理 1 webpack 模块加载原理 文件信息来源 xff1a webpack 深入理解模块加载原理 webpack 是一个模块打包器 xff0c 在它看来 xff0c 每一个文件都是一个模块 1 1 Co
  • 使用 FSL 和 TrackVis 分析 DTI 数据

    转载原文 使用 FSL 和 TrackVis 分析 DTI 数据 Alex 2018 05 21 free learner 64 163 com 弥散加权成像 xff08 Diffusion Weighted Imaging DWI xff
  • Java Swing界面设计UI(全)

    原文链接 http blog csdn net xietansheng article details 72814531 Java Swing GUI 图形界面窗口开发基础教程 xff0c 本教程将系统性地详细介绍 Java Swing 开
  • IntelliJ IDEA必会的几个常用设置

    IDEA 全称 IntelliJ IDEA xff0c 是java编程语言开发的集成环境 IntelliJ在业界被公认为最好的java开发工具 xff0c 以下归纳了初学者使用idea的一些常用设置 一 ctrl 43 滚轮调整页面大小 F
  • 什么是面向对象,它的三个基本特征:封装、继承、多态

    什么是面向对象思想 xff1f 已经学完了java确不知道如何跟别人解释面向对象是什么意思这很常见 让我们一起来回顾下这个奇思妙想 文章目录 一 面向对象与面向过程1 什么是面向过程 xff1f 2 什么是面向对象 xff1f 二 类与对象