OOP上半部分-Java与生活
目录
- 1-1-1 问题产生和引导
- 1-1-2 烦人
- 1-1-3 变换思维
- 1-1-4 规划明确目标站在更高层次思考问题
- 1-1-5 上代码,设计体验面向对象编程,实例和对象
- 1-1-6 去你md成员变量行为类和this
- 1-1-7 注销账户和null空指针异常
- 1-2-1 OOP封装
- 1-2-2 jar导入和lombok
- 1-2-3 toString()
- 1-2-4 构造方法
- 1-2-5 构造方法的重载与再探this
- 1-2-6 垃圾回收
- 1-2-7 静态变量和静态方法
- 1-2-8 private static
- 1-2-9 static单例模式
- 1-2-10 内部类扯淡系列
- 1-2-11 OOP上半部分结束
1-1-1 问题产生和引导
假设有一个养狗系统
面向过程 | 面向对象 |
---|---|
流水线 | 模块化 |
一件事"该怎么做" | 一件事"该让谁来做" |
狗饿了,狗吃了食物 | 属性:狗、食物、饿;动作:狗吃食物 |
强调的是“吃”,“狗”只是一个参数 | 强调的是“狗”,“吃”只是一个动作 |
一件事“该让谁来做”,那个“谁”就是对象,他要怎么做是他自己的事,最后一群对象合力能把事做好了
1-1-2 烦人
首先我们要明白什么是对象?
- 根据词典指行动或思考时作为目标的事物
- 简单来说就是你现在所干的事情的目标是为了啥
1-1-3 变换思维
思考什么是过程?
- 第一步怎么做,第二步怎么做,接着怎么做……最后怎么做(return 0)
- 走一步看一步,目标不明确,我们不可能把所有过程写一遍,不适用于大众
面向过程编程:(POP:Procedure Oriented Programming)
- 分析解决问题所需要的步骤,然后用函数把这些一步步实现,使用的时候按顺序依次调用
- 代码线性,严格按着顺序,侧重解决步骤,着眼局部或者具体
面向对象编程:(OOP:Object Oriented Programming)
该程序,要大众化
明确目标吗,对象就是目标,目标就是对象
不强调过程
1-1-4 规划明确目标站在更高层次思考问题
明确目标
- 计划、规划 设计它
- 当你执行完计划时候,达到目标
- OOP:站在更高的层次看待事物
1-1-5 上代码,设计体验面向对象编程,实例和对象
首先我们要明白什么是对象(实例)?
- 根据词典指行动或思考时作为目标的事物,简单来说就是你现在所干的事情的目标
- 显示生活的一个东西,对抽象的东西进行表示出来的产物,是一个活生生存在的事物,它是唯一的
现在要制作一个What‘s Animal 的软件,那这里面所有的对象就是大家会养的宠物,比如猫猫狗狗等
这个时候就比如设置一个狗Dogs
的类(class),这个class就是一个狗的基础模型
public class Dogs {public String name;public String variety;public int age;public String food;public void eat(){System.out.println("eat food");}public void sleep(){System.out.println("狗睡觉");}
}
myDog
就是一个对象(实例)了,当我们看到 myDog
的时候只会觉得这是一只狗,但是我们不能知道
它具体的样子
我们就要继续对这个狗进行描述操作,然后它就会浮现出一个具体的样子
然后在另外一个main()
方法里面new
一个Dogs
对象(实例)
public class main {public static void main(String[] args) {Dogs myDog = new Dogs();myDog.name = "Tom";myDog.age = 2;myDog.variety = "哈士奇";myDog.sleep();}
}
1-1-6 去你md成员变量行为类和this
在了解什么是属性的时候,我们先思考什么是类(class)?
- 我比较倾向把它理解成分类的类,回到What‘s Animal 这个软件当中
- 软件中有很多的宠物,很多类型的宠物,有猫、狗、猪等等,那我们最好的分类方式就是对不同的动物分类
这样我们就去创建一个Dogs
类
public class Dogs {}
什么是属性(共性、特性)?
- 属性是事物的性质与事物之间关系的统称。
- 事物的性质——事物的形状、颜色、气味、善恶、优劣、用途等
- 事物的关系——大于、小于、压迫、反抗、朋友、热爱、同盟、矛盾等
- 任何属性都是属于某种对象的
类当中的变量和方法都称为属性(共性、特性)或者成员变量,它们组成和构成了类,所以我们这么命令,它们是类的重要组成部分
例如同一类动物的特征有身高、体重、毛皮颜色等,会作出吃饭、睡觉等行为,这些特征和行为就是属性
public class Dogs {public String name;public String variety;public int age;public String food;
}
这些方法(函数)在类中叫行为
public void eat(){System.out.println("eat food");}
this 是啥?
- 当我们在做英语阅读理解的时候,会看到一种题目叫做文中的xx段xx行的this代表指代的是前文的啥?
- 那这个问题就和这个阅读理解一样,计算机在做英语的阅读理解啦,计算机一般比我们聪明些总是能正确的回答
- this的中文意思是“这个”,当我创建好一个对象,并且将它实例化以后,我使用这个对象进行一个操作
myDog.sleep()
:
这个时候回到类里 sleep()
这个方法里,里面有一个this
,那很显然这个 this
调用的就是 myDog
,那 myDog.name
不就是Tom嘛
要是我的英语阅读理解题有这么简单就好了
1-1-7 注销账户和null空指针异常
使用软件要进行账户的注册,我们姑且把账户注册等同于制造一个新的对象
填写完注册信息之后,我们就变成了一个实例,假如我们想注销,这个过程就会把我们的信息从软件上抹去
这个时候我们对代码进行这样的操作
public class main {public static void main(String[] args) {Dogs zhangDog = new Dogs();zhangDog.name = "Tom";zhangDog.age = 2;zhangDog.variety = "哈士奇";//张大爷想注销账户zhangDog = null;System.out.println("zhangDog.name = " + zhangDog.name);}
}
注销之后如果你就找不到张大爷了!空指针异常啦
zhangDog
相当于一个指针,在内存里指向对象,注销后,指针就指向了一块空的区域,接下来讲说明如果解决这个问题
1-2-1 OOP封装
为什么要进行封装?
- 如果狗的年龄被改成-30怎么办?这不是出错了吗,或者如果没封装起来,我岂不是可以修改支付宝余额为9999999
- 在上数字电路实验课的时候,会发现它比模拟电路的实验更加简单,而数字电路中,时序逻辑电路,又比门电路简单,这是一步一步的集成所达到的效果,会让东西用起来更简单,但是内部复杂的模拟电路和门电路就不需要去理会
- OOP的封装也是如此,我们在一些类里已经写好了很多功能,用户在使用的过程中,不需要理会在类里面写了什么,只要根据自己想实现的功能使用就可以了
那OOP是如何封装的呢?
- 首先我们要明白一个道理就是,我们的集成电路里面的模拟电路、门电路是看不到的,也取不出来,它的原理对设计它的公司来说是私密的,那我们在封装的过程中也要将变量变成私密的
但这个时候main()
就会出现错误提示
那我们就无法操作这个类的属性了,就像你集成完电路后没有留外接口,这个时候我们就要请上 getter
setter
函数了
把成员变量做的安全,使用private
代替public
(公共的,用户可以修改此属性)成员变量的特性,另外提供getter and setter
,这种方式叫做oop封装
getter
setter
可以看作是一个按钮,这就是封装,而在按钮设置的过程中,你可以对按钮编程,让它符合条件以后才可以被启动
1-2-2 jar导入和lombok
下载lombok
插件
lombok插件下载导致idea出现字体bug,详见 idea_bugs文件夹下 “0-0-0 字体bug"视频
lombok的Java包下载详见:maven repository-Project Lombok
将下载好的jar
文件拖入jar
文件夹下
右击选择Add as Library
选择Projcet Library
此时在类中输入注释,并导入包
@Getter
@Setter
还需要在设置Annotation Processors
中将Enable annotation processing
勾选上
重建项目
完成
这样就不用写getter
setter
了,但如果有特殊的方法则需要单独写,即方法的重写
1-2-3 toString()
toString()
这个方法可以输出相应的对象的函数,alt + insert
一键创建getter
setter
函数
当然也可以利用jar包,在类前加注解
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;@Getter
@Setter
@ToString
@Date
相当于包含以下三种
1-2-4 构造方法
回忆一下数组是怎么写的?
- 两种不一样的定义和给数组赋值的方式,创建对象的方式和第二种先定义再赋值的方式是一样的
//1.初始化 定义+赋值
int[] arrDogs = {1, 2, 3, 4};//2.先定义 后赋值
int [] arr = new int[4];
arr[0] = 1;
我们如何让对象也可以初始化呢?
这就需要构造方法 alt+insert
- 构造方法不要有类型,方法名和类名一样
- 在一般情况下要加一个空参构造方法
public Dogs(String name, String variety, int age, String food) {this.name = name;this.variety = variety;this.age = age;this.food = food;}public Dogs() {}
然后就可以实现对象的初始化
public static void main(String[] args) {Dogs zhangDog = new Dogs("Tom", "哈士奇", 2,null);}
1-2-5 构造方法的重载与再探this
构造方法也是可以重载的
1-2-6 垃圾回收
回到1-1-7,找不到张大爷了,空指针异常怎么办?
- java一般是不需要你手动回收的,如果一定要自己手动来垃圾回收,可以使用
System.gc()
这个方法
这样就不会出现空指针异常了
1-2-7 静态变量和静态方法
静态变量
public static String plot ="NanG";
静态方法
public static void goplot(){System.out.println("所有狗都进了小区");}
1-2-8 private static
万一静态变量被改了怎么办?
咱们小区名被黑了
这就需要用到private static
private static String plot ="NanG";public static String getPlotInstance(){return plot;}
System.out.println("Dogs.getPlotInstance() = " + Dogs.getPlotInstance());
这样定义变量和方法只能在有类名来使用,可以看作是所有类都必须做的事情,而对象无法使用,对象无权选择或者不选择。
1-2-9 static单例模式
单例模式怎么来的?
private static
定义变量和方法只能在有类名来使用,可以看作是所有类都必须做的事情,而对象无法使用,对象无权选择或者不选择,这里就衍生出了一种设计模式:单例模式
单例模式怎么用?
- 单例模式的存在是为了保证一个类仅有一个实例,无法克隆,并提供一个访问它的全局访问点
下面就拿课程Frank讲的例子来理解一下
public class Earth {//new 一个新的地球,只有Earth类内可以调用private static Earth earthInstance = new Earth();//外部无法new新的Earthprivate Earth(){}//Earth在外部得到Earthpublic static Earth getEarthInstance(){return earthInstance;}public void showMessage(){System.out.println("Hello Earth!");}
}
public class main {public static void main(String[] args) {//不合法的构造函数//编译时错误:构造函数 Earth() 是不可见的//Earth object = new Earth();//获取唯一可用的对象Earth object = Earth.getEarthInstance();//显示消息object.showMessage();}
}
"Hello Earth!"
参考:
- 单例模式-菜鸟教程
1-2-10 内部类扯淡系列
内部类是啥?
- 类里面再来一个类
- 静态内部类只能用静态变量
- 方法内部类,只能在方法里面用
- 用的比较少,十分难维护,可以自己去了解
1-2-11 OOP上半部分结束
OOP上半部分-Java与生活相关推荐
- 盘点关于Java在生活中的应用!
如果你是初学者,之前对Java没有太多的了解,肯定想知道学习Java具体可以从事的工作有哪些.事实上随着Java技术的日渐成熟,很多服务器都是用Java进行编写,可以说Java在生活中的应用还是随处可 ...
- Java在生活中的应用盘点!
如果你是初学者,之前对Java没有太多的了解,肯定想知道学习Java具体可以从事的工作有哪些.事实上随着Java技术的日渐成熟,很多服务器都是用Java进行编写,可以说Java在生活中的应用还是随处可 ...
- Java OOP 9 Java I/O
Java OOP 9 Java I/O 文章目录 Java OOP 9 Java I/O 一.学习目标 二.文件 三.File类 四.IO流 五.Java流的分类 Java流的分类 按流向划分:输入流 ...
- 基于JAVA社区生活超市管理系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
基于JAVA社区生活超市管理系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署 基于JAVA社区生活超市管理系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署 本源码技术栈: ...
- 基于JAVA校园生活信息服务平台计算机毕业设计源码+系统+数据库+lw文档+部署
基于JAVA校园生活信息服务平台计算机毕业设计源码+系统+数据库+lw文档+部署 基于JAVA校园生活信息服务平台计算机毕业设计源码+系统+数据库+lw文档+部署 本源码技术栈: 项目架构:B/S架构 ...
- 计算机毕业设计Java小区生活服务平台的设计与实现(源码+系统+mysql数据库+Lw文档)
计算机毕业设计Java小区生活服务平台的设计与实现(源码+系统+mysql数据库+Lw文档) 计算机毕业设计Java小区生活服务平台的设计与实现(源码+系统+mysql数据库+Lw文档) 本源码技术栈 ...
- 计算机毕业设计Java健康生活运动咨询系统(源码+系统+mysql数据库+lw文档)
计算机毕业设计Java健康生活运动咨询系统(源码+系统+mysql数据库+lw文档) 计算机毕业设计Java健康生活运动咨询系统(源码+系统+mysql数据库+lw文档) 本源码技术栈: 项目架构:B ...
- Java OOP 7 JAVA 集合框架
Java OOP 第七章 JAVA 集合框架 文章目录 Java OOP 第七章 JAVA 集合框架 一.学习目标 二.数组存在的缺陷 三.Java集合框架 四.Collection接口 五.Coll ...
- OOP设计模式[JAVA]——03职责链模式
职责链模式 Responsibility of Chain 在职责链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求 ...
最新文章
- 英伟达公开课 | 手把手教你部署一辆高速目标检测Jetbot智能小车
- python gui插件_Python进阶量化交易专栏场外篇17- GUI控件在回测工具上的添加
- ctags对部分目录生成tags
- 一类动词二类动词三类动词_基于http动词的完全无效授权技术
- 工作流实战_03_flowable 流程模板部署
- 基础知识—数据类型-数据的输出与输入
- 20.变量及数据类型
- 网吧服务器ip地址修改,详解修改BXP服务器IP地址的方法
- 计算机共享文件输入网络密码是什么,Win7共享文件时需要输入网络密码怎么办?...
- 如何阻止事件冒泡和浏览器的默认行为
- 刀塔自走棋上线不到十分钟就被功击,几十万玩家登录不上
- python怎么去掉换行符_python去除空格和换行符的实现方法(推荐)
- [16-8-1]每日总结
- python爬取微信小程序源代码_【实战】CrawlSpider实现微信小程序社区爬虫
- 教师公开课卡通动态通用PPT模板
- 西北工业大学 计算机学院 姜,姜学锋(计算机学院)老师 - 西北工业大学 - 院校大全...
- MacOX以及XCode下文件结束符(EOF)的输入
- c语言换零钱程序,换零钱问题。将一元钱换成1分,2分,或5分的零钱有多少换法。vb编程...
- 《穷爸爸和富爸爸》读后感
- 平板电脑能安装java_手机上能安装的应用,平板电脑上是不是都能安装