Java语言基础 #面向对象 #Day6 #封装性 #Private #this

文章目录

    • 补充知识:地址值
  • 一、面向对象的概念
    • 1. 什么是面向对象思想
    • 2. 面向过程 & 面向对象
      • Demo:实现数组打印
    • 4. 面向对象 & 协议
    • 5. 类 & 对象
  • 二、创建对象
    • 1. 创建类
    • 2. 创建实例对象
    • 3. 当我操作对象时,我到底在操作什么(内存)
    • 4. 局部变量和成员变量的区别
  • 三、封装性
    • 1. private关键字
      • 1.1 Private的用处
      • 1.2 不私有化的问题
      • 1.3 间接访问私有化成员变量
      • 1.4 完善对参数的检测
  • 四、this关键字
  • 五、构造方法
    • 1.1 构造方法是什么
    • 1.2 注意事项
    • 1.3 构造方法示例
    • 1.4 构造方法完成初始化
  • 六、定义一个标准的类
    • 1. 自动生成Getter/Setter
    • 2. 自动生成构造方法

补充知识:地址值

在上一篇文章中,我们可以看到地址值由0x开头(比如 0x866),那么这个0x究竟是什么呢?

  • 内存中的地址是由3个16进制数表示的
  • 0x是16进制标识符。如果是 A73 这样的16进制数,不用标识符也可以知晓其是16进制。但是如果是 397 这样的数字,很容易被误认为十进制数,所以就加入了一个叫做进制标识符的东西,用以区分不同进制
  • 区分进制除了在前面加标识符,也可在后加后缀(后缀由一个大写字母表示)。内存地址则规定用标识符的写法。
进制 标识符 后缀
二进制 0b B
八进制 0 O
十进制 D
十六进制 0x H

一、面向对象的概念

1. 什么是面向对象思想

我们把字拆开来看:

  • 面向 ,指的是更看重什么。比如企业会说自己是to B(面向企业),还是to C(面向消费者)。也有企业暗暗把目标变成了to VC(面向融资:指通过手段,把投资者的钱弄到自己腰包),甚至是to SBVC(面向傻*融资)。
    新手程序员更喜欢面向复制黏贴编程。
  • 对象 ,英文是Object,还有一个含义,宾语,就是谓语动作的承受者。事情不必自己做,找一个能做这件事的。

古语有云“术业有专攻 ”。
编程届也有句著名的话:不要重复造轮子 , 这也是告诫我们,去用现成的轮子,又省力又好用。


面向对象有三大特性:

今天只需学 封装 即可

  1. 封装: 不需要知道内部实现,只要知道给其什么参数,会得到怎样的结果(或返回值)就行
  2. 继承: 对象的某些特性可以传递下去,而不需要自己再写一遍,或是复制黏贴。
  3. 多态: 同一个对象,由于参数各类性质的差异,造成功能的不同。

2. 面向过程 & 面向对象

面向过程就是凡事亲力亲为。面向过程就是叫别人去干。
比如,你现在要做两件事:

  1. 把衣服拿去洗了
  2. 把重物搬到仓库

你可以(面向过程):

  1. 把衣服泡水
  2. 倒洗衣液
  3. 等待半小时
  4. 搓洗干净
  5. 晾干
  6. 搬起重物
  7. 走到仓库
  8. 放进去

你也可以(面向过程):

  1. 大喊一身:“妈!”
  2. 大喊一声:“爸!”

只是开个玩笑,但是你完全可以找到另一个对象(洗衣机 & 起重机)来帮你做。


Demo:实现数组打印

之前我们使用for循环,打印一个数组,但是有没有觉得这样打印出来的,不太方便,也不太好看

Java语言基础 #面向对象 #Day6 #封装性 #Private #this_第1张图片

4. 面向对象 & 协议

假如说,你要实现一个爬虫,怎么做?

  1. 一步步写(面向过程)
  2. 直接用现成的爬虫框架,然后按照教程给它需要的参数(面向过程)√

在有很多时候,我们编写代码,是需要同时面向对象和面向过程的,因为有时候轮子并不存在。我们就得自己造。怎么办?
面向对象的思想 + 面向过程的实现

  1. 面向过程的实现好理解,一步步写嘛
  2. 面向过程的思想是什么鬼?

比如说,不存在一个成熟的爬虫框架,怎么办?

  1. 写个主程序,然后在里面放一些对象名(先调用,实际对象不存在)。比如Spider爬虫对象,给它网址,它返回数据。比如Wash对象,给他数据,它把数据清洗干净。比如Save对象,给它数据,它会存到数据库里。
  2. 在上面的步骤中,我们只写了主程序,三个对象的调用而已,同时规定了给谁上面类型的数据,它会返回什么类型的数据。也就是说,我们先规定了对象的参数和返回值是什么类型。
  3. 这样做有什么好处呢?假如我写在一个程序里,突然爬虫没有用了,要重新写过,那么庞大的代码量,而且牵一发动全身,程序都容易直接活不了了。
    再比如,我有好几个爬不同网站的爬虫,至少存储对象是可以通用的,那我为什么要再写多遍呢?
    最最关键的是,我可以把写这些对象的任务交给其他人,他们写的对象只要参数和返回值满足条件就可以了。
    每个对象更新迭代和其它对象都没关系,它只要遵守这个参数和返回值规定的格式就可。这个规定的格式,叫做协议 。只要遵守协议,程序的各个部分可以互不打扰,独自美丽。

5. 类 & 对象

类是对一类对象的抽象概况
可以认为,类是对象的模板 , 对象是类的实例
我属于人类 , 我是人类中一个实实在在的例子 ,人类就是这个抽象概念,我就是实例对象。

二、创建对象

1. 创建类

类 = 属性 + 方法

  • 属性指的是存在。比如人的年龄,身高之类的。
  • 方法指的是行为功能。比如人能跑,人能吃。

Java中的属性叫做成员变量 , 方法叫做成员方法

  • 下面我们来定义一个蔡徐坤对象:
成员变量(属性) 成员方法(方法)
名字 = 蔡徐坤
练习时长 = 2.5
鸡 = 你太美 Rap
- 打篮球
String name = "蔡徐坤";
Double practiseHour = 2.5;
String chicken = "You are so beautiful";

public void sing() {}
public void jump() {}
public void rap() {}
public void playBasketball() {}

先不要着急定义main函数,直接把上述代码复制到Demo2CXK.java中(这就是一个类),然后在方法中加一些打印函数(更直观些)。

Java语言基础 #面向对象 #Day6 #封装性 #Private #this_第2张图片

  1. 成员变量是直接定义在类当中的,在方法外边
  2. 成员方法不要写static关键字

2. 创建实例对象

  1. 导包:指出需要使用的类的位置(如果文件和当前类属于同一个包,可以省略不写)
    import 包名.类名称
  2. 创建
    类名称 对象名 = new 类名称();
  3. 使用
    对象名.成员变量名
    对象名.成员方法名(参数)
    Java语言基础 #面向对象 #Day6 #封装性 #Private #this_第3张图片

3. 当我操作对象时,我到底在操作什么(内存)

下面这个文件究竟发生了什么?
Java语言基础 #面向对象 #Day6 #封装性 #Private #this_第4张图片

  1. 先画个内存图。
    Java语言基础 #面向对象 #Day6 #封装性 #Private #this_第5张图片
  2. 方法区载入(载入的是.class信息,谁具有main方法就会执行谁)
    Java语言基础 #面向对象 #Day6 #封装性 #Private #this_第6张图片
  3. main方法进栈(压栈)(栈是先进后出,先进去的压在底下,所以叫压栈);对象名本质是变量名,存在栈中;new时在堆中开辟一个内存空间
    Java语言基础 #面向对象 #Day6 #封装性 #Private #this_第7张图片
  4. 栈中记录这个对象的地址值;堆中的成员属性,参考方法区中类的成员属性,如果没有,按照规则赋予0、0.0、null之类的值(具体规则在我昨天的博客Day5 三、2. 中)这里跳转堆中的成员方法,会记录方法区的地址值。
    Java语言基础 #面向对象 #Day6 #封装性 #Private #this_第8张图片
  5. 其它的操作,如赋值,就太简单了(按照地址引用即可,还不了解多琢磨我上一篇Day5内容。);调用方法会在栈中,需要根据地址,一层层找过去。
    Java语言基础 #面向对象 #Day6 #封装性 #Private #this_第9张图片
  6. 这个方法执行完毕,出栈(弹栈)
    Java语言基础 #面向对象 #Day6 #封装性 #Private #this_第10张图片

4. 局部变量和成员变量的区别

  1. 定义位置不一样【重点】
    局部变量:方法内部
    成员变量:方法外部,直接写在类中
  2. 作用域不一样【重点】
    局部变量:方法内部
    全局变量:整个类
  3. 默认值不一样【重点】
    局部变量:无默认值,使用前必须手动赋值
    成员变量:有默认值,规则在Day5 三、2.中(这里跳转)
  4. 内存位置不一样
    局部变量:位于栈内存
    成员变量:位于堆内存
  5. 生命周期不一样
    局部变量:随着方法进栈而诞生,随着方法出栈而消失
    成员变量:随着对象创建而诞生,随着对象被垃圾回收而消失

三、封装性

面向对象三大特性:封装、继承、多态

封装在Java中的体现:

  1. 方法就是一种封装
  2. 关键字private(私有化)也是一种封装

封装: 不需要知道内部实现(隐藏内部实现),只要知道给其什么参数,会得到怎样的结果(或返回值)就行

1. private关键字

private int age;  // 私有化age变量

一旦使用了private进行修饰,超出本类的范围就不能直接 访问了。
Java语言基础 #面向对象 #Day6 #封装性 #Private #this_第11张图片
标红表示出现错误,错误原因是 “age 是私有化成员变量”
Java语言基础 #面向对象 #Day6 #封装性 #Private #this_第12张图片

1.1 Private的用处

1.2 不私有化的问题

  • 类文件
    Java语言基础 #面向对象 #Day6 #封装性 #Private #this_第13张图片
  • 运行文件
    Java语言基础 #面向对象 #Day6 #封装性 #Private #this_第14张图片
  • 什么?年龄-18?
  • 因为年龄符合了整数这个要求,所以就被设置了。怎么解决呢?Private私有化+Setter+Getter

1.3 间接访问私有化成员变量

间接访问成员变量,只有定义一对Getter/Setter方法

public void setAge(int num) {  // Setter方法
	age = num;
}
public int getAge() {  // Getter方法
	return getAge;
}
  • Setter方法必须有参数无返回,参数类型和set标的要一致
  • Getter方法必须有返回无参数,返回对象和get标的要一致

命名规则:

  • setter的命名规则是setXxx
  • getter的命名规则是getXxx
    如果返回的是布尔类型的,命名规则为isXxx

1.4 完善对参数的检测

  • 首先是要对参数进行检测,就需要一个方法,这个方法被定义在类内部,可以通过这个方法访问这个私有属性。聪明的你经过上面的内容,一定想到了,用setter方法。
  • 而getter方法,一般用于对返回值格式进行设定。

Java语言基础 #面向对象 #Day6 #封装性 #Private #this_第15张图片
Java语言基础 #面向对象 #Day6 #封装性 #Private #this_第16张图片

四、this关键字

当方法的局部变量和类的成员变量重名时,会优先使用局部变量。

  • 如果需要访问成员变量,需要使用以下格式:
this.成员变量名
  • 只访问到局部变量
    Java语言基础 #面向对象 #Day6 #封装性 #Private #this_第17张图片
    Java语言基础 #面向对象 #Day6 #封装性 #Private #this_第18张图片
  • 访问成员变量
    Java语言基础 #面向对象 #Day6 #封装性 #Private #this_第19张图片
    Java语言基础 #面向对象 #Day6 #封装性 #Private #this_第20张图片
  • 体会一下这句话:this一定要放在方法中。通过谁调用的,这个this就指谁。
  • 比如上面的,thisObject调用的callPhone()这个方法,callPhone()这个方法内部的this就指代thisObject这个对象

五、构造方法

1.1 构造方法是什么

构造方法是专门用于创建对象 的方法,当我们通过new来创建对象时,其实就是在调用构造方法。

public 类名称(参数类型 参数名称) {
	方法体;
}

1.2 注意事项

  1. 构造方法的名称必须和所在的类名称完全一样,就连大小写也要一样
  2. 构造方法不写返回值类型,连void都不写
  3. 构造方法的调用不是通过.方法名来调用,而是通过new 方法名来调用的
  4. 构造方法不能return一个返回值
  5. 如果没有编写任何构造方法,那么编译器会默认赠送一个没有参数、没有方法体的构造方法。
  6. 一旦编写了一个构造方法,编译器便不再赠送。

类比Python中,new类似__new__创建函数,构造方法类似__init__初始化函数

  1. 构造方法可以重载

1.3 构造方法示例

Java语言基础 #面向对象 #Day6 #封装性 #Private #this_第21张图片
Java语言基础 #面向对象 #Day6 #封装性 #Private #this_第22张图片

1.4 构造方法完成初始化

Java语言基础 #面向对象 #Day6 #封装性 #Private #this_第23张图片
Java语言基础 #面向对象 #Day6 #封装性 #Private #this_第24张图片

六、定义一个标准的类

标准的类 (一个标准的类,也叫做Java Bean),通常有以下四个组成部分:

  1. 所有的成员变量都要使用private关键字修饰
  2. 为每一个成员变量编写一对儿Getter/Setter方法
  3. 编写一个无参数的构造方法
  4. 编写一个全参数的构造方法

1. 自动生成Getter/Setter

是不是 看起来 很麻烦?别急,有快捷键

  1. 编写私有化的成员变量。把光标放至下一行。
    Java语言基础 #面向对象 #Day6 #封装性 #Private #this_第25张图片
  2. Alt Insert,选Getter and Setter
    Java语言基础 #面向对象 #Day6 #封装性 #Private #this_第26张图片
  3. 看到这个界面,选择所有变量(按住Shift再点击),点确定
    Java语言基础 #面向对象 #Day6 #封装性 #Private #this_第27张图片

2. 自动生成构造方法

Constructor自动生成构造方法
Java语言基础 #面向对象 #Day6 #封装性 #Private #this_第28张图片

  • 无参数: 点击select None再点确定
    Java语言基础 #面向对象 #Day6 #封装性 #Private #this_第29张图片
  • 全参数: 选择所有参数,点确定

你可能感兴趣的:(java)