OOP上半部分-Java与生活

2023-05-16

目录

  • 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新的Earth
    private Earth(){

    }
    //Earth在外部得到Earth
    public 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上半部分结束

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

OOP上半部分-Java与生活 的相关文章

随机推荐

  • 4:数据操作-MySQL

    目录 4 1 插入数据1 插入数据2 数据的自动添加 xff1a NULL3 default的使用4 省略自增 4 2 一次性插入多条数据4 3 删除数据1 删除2 条件删除 4 4 清空表1 删表跑路2 删节跑路 4 5 小细节 xff0
  • 5:数据类型-MySQL

    目录 5 1 数据库的数据类型问题5 2 int数值类型5 3 int类型实际操作和注意事项5 4 浮点数类型5 5 定点数类型5 6 字符串与文本类型5 7 布尔类型5 8 枚举类型5 9 枚举类型的另类存储方式5 10 枚举类型的好处
  • 6:列属性完整性-MySQL

    目录 6 1 列属性问题6 2 Primary key主键作用以及企业用途6 3 删除主键 组合键 选择主键1 删除主键2 组合键3 选择主键 6 4 复合主键究竟有什么用 xff1f 6 5 unique唯一键的作用以及使用6 6 唯一键
  • 7:数据库设计思维-MySQL

    目录 7 1 数据库设计的基本概要7 2 实体和实体之间的关系7 3 Codd第一范式 xff1a 确保每列原子7 4 Codd第二范式 xff1a 非键字段必须依赖与键字段7 5 Codd第三范式 xff1a 消除传递依赖 7 1 数据库
  • 8:单表查询-MySQL

    目录 8 1 开端8 2 select8 3 from8 4 dual8 5 where8 6 in8 7 between and8 8 is null8 9 聚合函数8 10 第三方客户端的使用8 11 like模糊查询8 12 orde
  • 9:多表查询-MySQL

    目录 9 1 union联合查询9 2 inner join内联查询9 3 inner join注意事项9 4 left join 外连接9 5 rigth join 外连接9 6 cross join 交叉连接9 7 natural jo
  • 如何在jupyter notebook中播放视频(不停地展示图片)

    在解决图像处理问题的时候 xff0c 可以利用opencv打开视频 xff0c 并一帧一帧地show出来 xff0c 但是要用到imshow xff0c 需要本地的界面支持 代码如下 span class token comment cod
  • CentOS7配置VNC远程桌面

    桌面还是有很多方便的地方 xff0c 在用U盘给电脑安装了centos7 xff08 带gnome xff09 后 xff0c 接着就需要弄远程桌面 xff08 1 xff09 安装vncserver yum y install tiger
  • 10:子查询-MySQL

    目录 10 1 子查询基本语法10 2 in 和 not in10 3 exists 和 not exists10 4 基础结束语 10 1 子查询基本语法 将一个查询的结果作为另一个查询的数据来源或判断条件 一般情况下子查询结果返回超过1
  • 11:高级部分-MySQL

    目录 xff08 一 xff09 view 视图1 开场2 view视图创建 使用以及作用3 显示视图4 更新和删除视图5 视图算法 xff1a temptable merge xff08 二 xff09 transaction 事务1 事
  • 12:企业规范约束-MySQL

    目录 12 1 库表字段约束规范12 2 索引规范12 3 SQL开发约束规范12 4 其他规范 12 1 库表字段约束规范 字段名 xff1a is vip unsigned tinyint 长度为1mysql命名是不区分大小写的 xff
  • Java与生活

    目录 一带而过 0 0 前言 1 1 Java是怎么执行的 xff1f 说好的exe呢 xff1f 1 2 package 1 3 第一个程序的讲解 1 4 注释和文档 2 0 一带而过 2 1 字符串演示 2 2 字符串结束符的那些事儿
  • 一带而过-Java与生活

    目录 认识Java0 0 前言1 1 Java是怎么执行的 xff1f 说好的exe呢 xff1f 1 2 package1 3 第一个程序的讲解1 4 注释和文档2 0 一带而过2 1 字符串演示2 2 字符串结束符的那些事儿2 3 自动
  • 0:Linux的初步认识-步入Linux的现代方法

    目录 0 0 系统的认识0 1 Linux操作系统认识 xff0c 以及开源的提出 xff1a Linux的千奇百怪的版本0 2 开源的含义0 3 Linux的用途 xff0c 各类发行版本 0 0 系统的认识 什么是系统 xff1f 鼠标
  • 1:VMware虚拟机的使用-步入Linux的现代方法

    目录 1 1 Vmware虚拟机1 2 VMware 161 3 关于从15更新到16的说法 1 1 Vmware虚拟机 安装系统的方式 实体机双系统虚拟机 详见 xff1a VMware Workstation 虚拟机权威指南 零基础虚拟
  • 2:发行版本安装演示——Ubuntu、CentOS、Kali?-步入Linux的现代方法

    目录 2 1 先尝试Ubuntu2 2 VMware Tools2 3 Ubuntu 20 04设置2 4 Linux其他发行版本的安装指导2 5 下载指导 2 1 先尝试Ubuntu 详见 xff1a Linux Ubuntu 零基础体验
  • 3:步入Linux的世界-步入Linux的现代方法

    目录 3 1 Linux究竟需要我们学习什么 xff1f Linux四大组成部分3 2 Linux是命令还是图形界面 xff1f GUI 是什么 xff1f 那GNU是什么东西 xff1f GNU Linux 和Linux有什么区别 xff
  • Linux中 sudo su 和 su 区别

    su 直接切换root用户 xff0c 需输入root密码ubuntu xff0c 默认没有设置root密码 xff0c 使用sudo passwd root设置root密码 sudo su 当前用户暂时申请root权限 xff0c 需输入
  • Python 使用 Qt5 实现水平导航栏

    在 Qt5 中可以使用 QWidget 包含两个水平布局 xff0c 通过点击水平布局里的按钮 xff0c 实现下标滑动与页面的切换 可以按照以下步骤来实现上面图片中的功能 xff1a 导入必要的 Qt 包 xff1a span class
  • OOP上半部分-Java与生活

    目录 1 1 1 问题产生和引导1 1 2 烦人1 1 3 变换思维1 1 4 规划明确目标站在更高层次思考问题1 1 5 上代码 xff0c 设计体验面向对象编程 xff0c 实例和对象1 1 6 去你md成员变量行为类和this1 1