java基础学习总结——面向对象1

2023-10-30

目录

一、面向过程的思想和面向对象的思想

二、简单理解面向对象

三、面向对象的设计思想

四、对象和类的概念

五、如何抽象出一个类?

六、类(对象)之间的关系

七、Java与面向对象

八、为什么使用面向对象编程?


 

一、面向过程的思想和面向对象的思想

       面向对象和面向过程的思想有着本质上的区别, 作为面向对象的思维来说,当你拿到一个问题时,你分析这个问题不再是第一步先做什么,第二步再做什么,这是面向过程的思维,你应该分析这个问题里面有哪些类和对象,这是第一点,然后再分析这些类和对象应该具有哪些属性和方法。这是第二点。最后分析类和类之间具体有什么关系,这是第三点。

      面向对象有一个非常重要的设计思维:合适的方法应该出现在合适的类里面

二、简单理解面向对象

  就是在程序里面首先分解出来的应该是注意不再是一步一步的过程了,而是首先考虑在这个问题域里面或者程序里面应该具有有哪些对象,所以从现在开始考虑任何问题脑子里不要再想着我实现这件事我第一步应该干什么,第二步应该干什么,如果这样想,那就是面向过程的思维了。面向对象的思维是,当我碰到这个问题域的时候,碰到这个程序的时候,我首先应该把这个问题里有哪些对象,对象与对象之间有什么关系抽象出来。

三、面向对象的设计思想

  面向对象的基本思想是,从现实世界中客观存在的事物出发来构造软件系统,并在系统的构造中尽可能运用人类的自然思维方式。

  面向对象更加强调运用人类在日常生活的逻辑思维中经常采用的思想方法与原则,如抽象、分类,继承、聚合、多态等。

  人在思考的时候,首先眼睛里看到的是一个一个的对象。

四、对象和类的概念

     对象是用于计算机语言对问题域中事物的描述,对象通过“属性(attribute)”和“方法(method)”来分别对应事物所具有的静态属性和动态属性

     类是用于描述同一类的对象的一个抽象的概念,类中定义了这一类对象所具有的静态属性和动态属性

    类可以看成一类对象的模板,对象可以看成该类的一个具体实例

    eg.什么叫瓶子?

     瓶子的定义:具有某些类特征的东西就是瓶子,比分说什么样的形状,比方说有个口,能倒水,能装水,一般有个盖等等。给瓶子下定义的过程,其实就是把瓶子里的某些东西抽象出来了,所以瓶子在这里是叫做一类事物的一个抽象,在你脑子里有瓶子的概念,可瓶子的概念在你脑子里到底是什么呢?瓶子的概念在你脑子里叫做一类事物的一个抽象。怎么抽象的呢?你往往抽象的是这两个方面:第一个方面我们叫它静态的属性,瓶子应该具有哪些特征,比分说瓶子应有个口,这是它的具有的一个静态属性,瓶子一般有一个盖,这也是它的具有一个静态属性,除此之外,你还可能给它总结动态的属性,什么动态的属性呢?比放说瓶子能倒水,这是它的动态属性。瓶子这个概念在你脑子里如果你细细的思维的话,其实你给它做了两方面的总结,一方面是静态的,一方面是动态的。反映到JAVA的类上,一个就是成员变量(静态属性),一个就是方法(动态属性)方法是可以执行的,可以动的。成员变量是某一个类的静态属性。所以你脑子里瓶子的概念实际上是一类事物的一个抽象,这种东西我们叫它类,椅子是类,桌子是类,学生是类。什么是对象呢?这一类事物的具体的某个实例就叫做对象。所以一类事物的具体的某一个东西,符合这类事物具体的特征的某个东西就叫做对象。瓶子是一个类,某个瓶子就是瓶子这个类里面的一个对象。

五、如何抽象出一个类?

       有两个方面,一方面是它的静态属性,另一方面是它的动态属性。反映到JAVA里面的类怎么包装它呢?一方面成员变量,另一方面是方法。

  eg.职员这个类该怎么抽象出来?也是从两个方面,一方面是它的静态属性,另一方面它的动态属性

  职员有哪些属性呢?有姓名,年龄,目前工资数额等属性,他有哪些方法呢?让这个职员来显示姓名,显示年龄,修改姓名,领取工资。当然显示姓名,显示年龄,修改姓名,领取工资这些也可以让别人来做,但面向对象的设计思维是最合适的方法应该出现在最合适的类里面。显示姓名,显示年龄,修改姓名,领取工资由谁来做更合适呢,那就是职员自己最合适。所以这些方法应该出现在职员这个类里面。

  对于类来说,它有一些属性或者称为成员变量,以后说属性或者成员变量指的是同一回事。具体的对象他有没有相关的一些属性或者叫成员变量呢?有,每一个人都有一份,只不过是取值不同而已。如从职员这个类实例化出来的两个职员:职员A和职员B,他们都有姓名,年龄,目前工资数额这些属性,但他们的名字,年龄,领取的工资数额都不一样。这样就能把职员A和职员B区分开来了,正是因为他们的属性值不一样,所以这个对象才能和另外的对象区分开来,所以通过属性是可以区分两个对象的。猫是一个类,这只猫是一个对象,这只猫和另外一只猫该怎么区分开来呢?那就得看你的猫这个类是怎么定义的了,猫有猫毛,毛有颜色。OK,这只猫是黑猫,另一只猫是白猫,这样通过猫毛的颜色区分开来了。如果只定义一个,如捉老鼠,白猫也能捉,黑猫也能捉,这样就没办法区分出黑猫和白猫了,所以根据方法是没办法区分两个对象的。所以每个对象都有自己的属性,属性值和另外一个对象一般是不一样的

  一定要区分类和对象,什么叫做类?什么叫做对象?类是一类事物的一个抽象,具有共同特征的一类事物的一个抽象。对象是这个类具体的某一个实例,所以以后说实例(instance)或者说对象(object)指的是同一回事。

六、类(对象)之间的关系

一.关联关系(最弱的一种关系)

  类和类之间是有关系的,如学生和老师这两个类,老师可以教学生,学生可以向老师学习。这就是他们之间的关系。关系和关系之间是不同的,你和你老婆的关系和你和你其他女朋友的关系是不能混为一谈的。关系最弱的一种关系叫关联关系。关联关系反应到代码上往往是一个类的方法里面的参数是另一个类的具体的某一个对象,比如教授教研究生,教哪个研究生,教是教授这个类里面的一个方法,某个研究生是研究生这个类里面的一个具体的对象。关联关系是最弱的一种关系,咱们两个类之间有关系,或者两个对象之间有关系,但关系不是很紧密。

二.继承关系(比较强的一种关系)

  继承关系封装了这样一种逻辑:“XX是一种XX”,只要这东西能说通了,就可以考虑用继承关系来封装它。如:游泳运动员从运动员继承,游泳运动员是一种运动员,这能说得通,所以游泳运动员就是从运动员继承过来的,游泳运动员和运动员就是一种继承关系。学生是一个人,学生从人继承,老师是一个人,老师也从人继承,学生是一种老师,这说不通,所以学生和老师就不存在继承关系。所以将来做设计的时候要分清继承关系很简单,你只要说通这么一句话:“XX是一种XX”。OK,那他们之间就是继承关系。篮球运动员是一种球类运动员,这说得通,所以篮球运动员从球类运动员继承,这样继承很有可能会产生一棵继承树,运动员派生出来,派生出来的意思是游泳运动员这个类、球类运动员这个类、射击运动员类从它继承,相当于运动员派生出来了这些个不同的运动员,包括游泳的,球类的,射击的。球类的再派生足球的,篮球的,排球的。这就是一棵继承树,不过这棵树是比较理想化的情况,只有一个根节点。但实际当中,我们真实世界当中的继承关系不一定只从一个类继承,一个类可能从多个类继承过来,比如说:金丝猴从动物这个类继承,这很正常,但我还有另外一个专门的类:“应该受到保护的东西”,这也是一个类,金丝猴应该受到保护,所以金丝猴是一种应该受到保护的东西。所以金丝猴从“应该受到保护的东西”这个类继承过来。所以在现实情况当中,一个类完完全全有可能从多个不同的类继承,C++正是因为想封装这种继承关系,所以C++存在多重继承。

三.聚合关系(整体和部分)(比较强的一种关系)

  什么是聚合?聚合就是一个整体与部分的关系。我们说“XX是XX的一部分”,只要说得通,那么他们之间的关系就是聚合关系,队长是球队的一部分,队员是球队的一部分。所以队长和球队是聚合关系,队员和球队也是聚合关系。脑袋是人的以部分,身体和胳膊也是人的一部分,因此脑袋,身体和胳膊与人都是聚合关系。聚合关系分得再细一点的话就可以分成聚集关系和组合关系,比如球队、队长,队员,这三者是聚集关系,假如这个队长既是足球的队长,同时也是篮球的队长,一个人分属两个不同的球队,这是可以的,球队与队长之间没有我离不了你,你离不了我这种情况,所以如果分得更细的话,这种就叫做聚集关系。还有一种情况叫组合,组合说的是咱们俩密不可分,我是你必不可少的一部分。一个人的脑袋不可能既属于你又属于别人,身体也一样,不可能既属于你又属于别人。所以你的身体,脑袋和你是密不可分的,这是一种更加严格的聚合关系,专门给它取了个名字叫组合。

四.实现关系

  作为父类来说,我觉得我应该具有这样一个方法,但我不知道怎么去实现,谁去实现,我的子类去实现,这就是实现关系。和实现关系息息相关的还有一种关系叫多态。

五.多态

七、Java与面向对象

  对象和类是分不开的,必须首先定义类才能有对象。首先定义方法才能调用。对象是JAVA里面的核心,做任何东西你首先都得给我造出一个对象才能做。静态属性简称属性,也叫成员变量,以后说属性或者说成员变量它们指的都是同一回事。

  整个类可以看作是静态的属性还有方法他们之间的一个综合。怎么抽象出一个类的概念,还是那句话,你必须抽象出两个方面来,第一方面是看他们的静态属性,他们有哪些成员变量,第二方面是看他们的有哪些方法。

  写JAVA程序时,我们一上来写的就是public class(声明一个类),在这个class里面我们写的是成员变量和方法。

  每一个JAVA里面的class(类)都对应了我们现实生活中某一类事物的一个抽象。比如说要在JAVA里面封装一只狗,具体怎么封装,如何写代码,代码如下:

 1 package cn.javastudy.summary;
 2 /**
 3  * 一类事物封装到JAVA里面首先得写class,定义这个类,类名是什么可以自己取。
 4  * 这里把类名叫做Dog
 5  */
 6 public class Dog {
 7     /**
 8      * 接下来就是写这个狗这个类的属性或者叫成员变量,
 9      * 比如说狗这个类的毛的颜色,怎么定义这个属性呢,
10      * 首先得定义毛的一个类型,如使用int来定义毛的颜色类型
11      */
12     int furcolor; //定义属性:毛的颜色
13     float height; //定义属性:狗的高度
14     float weight; //定义属性:狗的体重
15     
16     /**
17      * 狗的颜色,高度,体重这些属性定义完了,接下来要定义的就是方法了。
18      * 如写一个CatchMouse()方法,捉老鼠的方法。
19      * CatchMouse这个方法里面有一个对象类型的参数,捉哪一只老鼠,这个对象参数是属于Mouse这个类的
20      * @param m
21      */
22     void CatchMouse(Mouse m){
23             //在方法体内写捉老鼠这个过程,怎么捉,跑着捉,走着捉
24             System.out.println("我捉到老鼠了,汪汪!,老鼠要尖叫了!");
25             /**
26              * 老鼠尖叫一声,表示被狗咬到了,咬到了能不叫吗,很自然而然地想到,
27              * 尖叫(scream())这个方法是属于Mouse这个类里面的某一个方法。
28              * 老鼠自己调用它,让它自己尖叫。这就是面向对象的思维。
29              */
30             m.scream();
31     }
32     
33     public static void main(String[] args) {
34         Dog  d = new Dog();//首先用new关键字创建一只狗
35         Mouse m=new Mouse();//造出一只老鼠。
36         d.CatchMouse(m);//然后用这只狗去抓老鼠,让狗调用CatchMouse()方法去捉某只老鼠。
37     }
38 }
 1 package cn.javastudy.summary;
 2 /**
 3  * 封装的老鼠类
 4  */
 5 public class Mouse {
 6     /**
 7      * 老鼠自己有一个发出尖叫的方法
 8      * 当被狗咬到时就会发出尖叫
 9      */
10     public void scream() {
11         System.out.println("我被狗咬到了,好痛啊!");
12     }
13 
14 }

     从这个意义上来讲,JAVA里面的每定义一个类实际上就相当于一种新的数据类型。就跟int ,float, String等一样,不过是一种新定义的类型而已。

八、为什么使用面向对象编程?

  面向对象编程:一组对象互相配合通过沟通完成特定功能

  做软件苦苦追求的一种境界是可重用性(reusable),可扩展性。如果是面向过程,一般情况是属性和方法它们是分开的,他们不是聚合的关系,不是合在一起的,这样要复用起来比较麻烦,复用的层次只是局限于方法这个层次上,而面向对象则不同,它是把属性和方法综合在一个里面。综合在一起复用的时候是整个对象进行复用。所以面向对象和面向过程相比,前者更加容易让我们达到可重用性。

转载于:https://www.cnblogs.com/xdp-gacl/p/3624100.html

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

java基础学习总结——面向对象1 的相关文章

随机推荐

  • ARM汇编指令

    1 ARM寄存器那点知识 1 1 ARM处理器的八种工作模式 在ARMv8中加入了Monitor模式用于安全扩展 usr模式 正常程序运行时的模式 fiq模式 当配置有快速中断时 如果产生fiq时间 ARM核将会切换到该模式 irq模式 中
  • 使用Docker部署FastDFS集群

    FastDFS集群部署 1 下载FastDFS镜像 2 创建fastdfs主机映射目录 3 修改配置信息 4 运行tracker容器 5 运行storage容器 6 查看FastDFS监控状态 1 下载FastDFS镜像 docker pu
  • CUDA数组分配

    cuda内存分配真是乱啊 这次总结一下数组的分配 概述 数组分配可以通过cudaMallocArray 和cudaMalloc3DArray 1 cudaMallocArray cudaError t cudaMallocArray str
  • [Pytorch系列-50]:卷积神经网络 - FineTuning的统一处理流程与软件架构 - Pytorch代码实现

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 121363706 目录 第1章 关于F
  • DCMM数据能力成熟度评估模型--学习笔记(1)

    DCMM数据能力成熟度评估模型 学习笔记 1 DCMM简介 结构组成和成熟度评估等级划分 1 1 DCMM简介 1 2 DCMM结构组成 1 3 DCMM关键过程域 1 3 1 数据战略 指导方针 1 3 2 数据治理 机制保障 1 3 3
  • MySQL学习笔记

    我们经常用到的简单MySQL语句 做一个总结 对于没有基础的同学也有帮助 对于有基础的同学可以参考作为借鉴 狂神说Java 1 连接数据库语句 mysql h 服务器主机地址 u 用户名 p 用户密码 注意 p后面不能加空格 否则会被当做密
  • Servlet学习(六):Response对象

    1 Response设置响应数据功能介绍 HTTP响应数据总共分为三部分内容 分别是响应行 响应头 响应体 对于这三部分内容的数据 respone对象都提供了哪些方法来进行设置 响应行 对于响应头 比较常用的就是设置响应状态码 void s
  • docker Error response from daemon 解决

    docker Error response from daemon pull access denied for xxx repository does not exist or may require docker login denie
  • Android Studio 导入Eclipse项目

    将Eclipse项目或者其他的Android项目导入Android 会因为项目结构不一样 或者下载的grandle版本不一致 经常会导致import project卡死 解决的简单办法 首先 打开Android studio 然后impor
  • Linux shell:判断变量是否包含某个字符串的几种方法

    方法一 利用grep查找 strA long string strB string result echo strA grep strB if result then echo 包含 else echo 不包含 fi 先打印长字符串 然后在
  • Vuejs Prop基本用法

    一 使用Prop传递数据 组件实例的作用域是孤立的 这意味着不能并且不应该在子组件的模板内直接引用父组件的数据 可以使用props把数据传给子组件 prop是父组件用来传递数据的一个自定义属性 子组件需要显示的地用props选项声明 pro
  • 异常:java.lang.ClassNotFoundException: org.springframework.web.servlet.Dispatcher

    首先声明一点 导致这个异常的情况有很多种可能 我只是说一下我遇到的异常解决办法 java lang ClassNotFoundException org springframework web servlet Dispatcher 可能原因
  • Wwise音频解决方案概述

    Wwise编辑器 音频设计师在Wwise编辑器 具体使用请参考 Wwise Help 中完成声音的集成和设置 并通过UE4和unity的Wwise插件 将制作好地资源导入到游戏编辑器中 Wwise编辑器是一款插件式架构的工具 其功能由众多插
  • 使用vue+百度接口实现关键词搜索

    html代码块 div 请输入关键词 div
  • Java11安装遇到C:\ProgramData\Oracle\Java\javapath\java.exe”

    1 官网下载java11 发现根本就找不到了 官网上放置的是最新的 之前版本我找不到 只有去别人那里拿 如果你刚好也想要 可以私聊我 我到时候发给你 2 下载完成直接下一步安装就OK了 但会发现只有jdk没有jre 其实根本没必要生成出jr
  • el-dialog实现可拖曳并且可点击底层页面

    el dialog实现可拖曳并且可操作底层页面 拖曳 1 新建文件 directives js import Vue from vue v dialogDrag 弹窗拖拽属性 Vue directive dialogDrag bind el
  • 【海思SS626

    目录 一 概述 二 安装交叉编译工具 2 1 安装 aarch64 mix410 linux tgz 2 2 安装 cc riscv32 cfg11 musl 20220523 elf tar gz 2 3 检查工具链版本 打印版本则表示安
  • Android 性能优化系列:启动优化进阶

    文章目录 启动速度优化的本质因素 CPU 层面进行速度优化 减少程序的指令数 降低时钟周期时间 降低每条指令的平均时间周期 缓存层面进行速度优化 缓存的读写速度 缓存的命中率 任务调度层面进行速度优化 通过实时进程和普通进程了解任务调度机制
  • 有了 screen 和 nohup 跑深度学习代码再也不用愁了

    在服务器上跑深度学习代码 xshell断开代码就挂掉了 如何能在服务器运行程序的时候 即使关闭终端也不会影响代码呢 screen 我用的是screen 推荐这个方法 我感觉比nohup好用一万倍 1 连接服务器 下图我连接了88 99 这个
  • java基础学习总结——面向对象1

    目录 一 面向过程的思想和面向对象的思想 二 简单理解面向对象 三 面向对象的设计思想 四 对象和类的概念 五 如何抽象出一个类 六 类 对象 之间的关系 七 Java与面向对象 八 为什么使用面向对象编程 一 面向过程的思想和面向对象的思