1. 面向对象内容的三条主线
- Java 类以及类的成员 : 属性 , 方法 , 构造器 , 代码块 , 内部类
- 面向对象的特征 : 封装 , 继承 , 多态
- 面向对象的关键字 : this、super、package、import、static、final、interface、abstract 等
2. 类和对象
2.1 类和对象概述
类 : 具有相同特征的事务的抽象描述 , 是抽象的 , 概念上的定义
理解 : 以人进行举例
- 类 ——> 抽象概念的人 ;
- 对象 ——> 实实在在的某个人
对象 : 实际存在的该类事物的每个个体 , 是具体的 , 所以也称为实例(instance)
2.2 类的成员概述
面向对象程序设计的重点是类的设计
类的设计,其实就是类的成员的设计
类时一组相关属性和行为的集合 , 这也是类最基本的两个成员
属性 : 该事务的状态信息。 对应类中的成员变量
- 成员变量 ——> 属性 ——> Field
行为 :该类事物要做什么操作,或者基于事物的状态能做什么。对应类中的成员方法
- (成员)方法 <=> 函数 <=> Method
2.3 面向对象完成具体功能的操作的三步流程(非常重要)
- 步骤 1:创建类,并设计类的内部成员(属性、方法)
- 步骤 2:创建类的对象。比如:Phone p1 = new Phone();
- 步骤 3:通过对象,调用其内部声明的属性或方法,完成相关的功能
3. 对象的内存笔记
HotSpot Java 虚拟机的架构图如下。其中我们主要关心的是运行时数据区部分(Runtime Data Area)。
其中:
堆(Heap)
:此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。这一点在 Java 虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配。
栈(Stack)
:是指虚拟机栈。虚拟机栈用于存储局部变量等。局部变量表存放了编译期可知长度的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference 类型,它不等同于对象本身,是对象在堆内存的首地址)。 方法执行完,自动释放。
方法区(Method Area)
:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
4. 成员变量
- 语法格式:
[修饰符1] class 类名{
[修饰符2] 数据类型 成员变量名 [= 初始化值];
}
-
说明:
-
位置要求:必须在类中,方法外
-
修饰符 2(暂不考虑)
- 常用的权限修饰符有:private、缺省、protected、public
- 其他修饰符:static、final
-
数据类型
- 任何基本数据类型(如 int、Boolean) 或 任何引用数据类型。
-
成员变量名
- 属于标识符,符合命名规则和规范即可。
-
初始化值
- 根据情况,可以显式赋值;也可以不赋值,使用默认值
-
5. 方法的重载
-
方法重载:在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不同即可。
- 参数列表不同,意味着参数个数或参数类型的不同
-
重载的特点:与修饰符、返回值类型无关,只看参数列表,且参数列表必须不同。(参数个数或参数类型)。调用时,根据方法参数列表的不同来区别。
-
重载方法调用:JVM 通过方法的参数列表,调用匹配的方法。
- 先找个数、类型最匹配的
- 再找个数和类型可以兼容的,如果同时多个方法可以兼容将会报错
6. 封装性
面向对象的开发原则要遵循“高内聚、低耦合
”
高内聚、低耦合是软件工程中的概念,也是 UNIX 操作系统设计的经典原则。
内聚,指一个模块内各个元素彼此结合的紧密程度;耦合指一个软件结构内不同模块之间互连程度的度量。内聚意味着重用和独立,耦合意味着多米诺效应牵一发动全身
而“高内聚,低耦合”的体现之一:
-
高内聚
:类的内部数据操作细节自己完成,不允许外部干涉; -
低耦合
:仅暴露少量的方法给外部使用,尽量方便外部调用。
6.1 何为封装性
把该隐藏的隐藏起来 , 该暴露的暴露出来 , 这就是封装性的设计思想
6.2 Java 如何实现封装
- 实现封装就是控制类或成员的可见性范围。这就需要依赖访问控制修饰符,也称为权限修饰符来控制。
- 权限修饰符:
public
、protected
、缺省
、private
。具体访问范围如下:
修饰符 | 本类内部 | 本包内 | 其他包的子类 | 其他包非子类 |
---|---|---|---|---|
private | √ | × | × | × |
缺省 | √ | √ | × | × |
protected | √ | √ | √ | × |
public | √ | √ | √ | √ |
-
具体修饰的结构:
- 外部类:public、缺省
- 成员变量、成员方法、构造器、成员内部类:public、protected、缺省、private
6.3 封装性的体现
成员变量/属性私有化
概述:私有化类的成员变量,提供公共的 get 和 set 方法,对外暴露获取和修改属性的功能。
实现步骤:
① 使用 private
修饰成员变量
② 提供 getXxx
方法 / setXxx
方法,可以访问成员变量
成员变量封装的好处:
- 让使用者只能通过事先预定的方法来
访问数据
,从而可以在该方法里面加入控制逻辑,限制对成员变量的不合理访问。还可以进行数据检查,从而有利于保证对象信息的完整性。 -
便于修改
,提高代码的可维护性。主要说的是隐藏的部分,在内部修改了,如果其对外可以的访问方式不变的话,外部根本感觉不到它的修改。例如:Java8->Java9,String 从 char[]转为 byte[]内部实现,而对外的方法不变,我们使用者根本感觉不到它内部的修改。
注意:
开发中,一般成员实例变量都习惯使用 private 修饰,再提供相应的 public 权限的 get/set 方法访问。
对于 final 的实例变量,不提供 set()方法。(后面 final 关键字的时候讲)
对于 static final 的成员变量,习惯上使用 public 修饰。
7. 类的成员之三 : 构造器
构造器也被称为构造方法
语法格式:
[修饰符] class 类名{
[修饰符] 构造器名(){
// 实例初始化代码
}
[修饰符] 构造器名(参数列表){
// 实例初始化代码
}
}
说明:
- 构造器名必须与它所在的类名必须相同。
- 它没有返回值,所以不需要返回值类型,也不需要 void。
- 构造器的修饰符只能是权限修饰符,不能被其他任何修饰。比如,不能被 static、final、synchronized、abstract、native 修饰,不能有 return 语句返回值。
8. JavaBean
-
JavaBean 是一种 Java 语言写成的可重用组件。
- 好比你做了一个扳手,这个扳手会在很多地方被拿去用。这个扳手也提供多种功能(你可以拿这个扳手扳、锤、撬等等),而这个扳手就是一个组件。
-
所谓 JavaBean,是指符合如下标准的 Java 类:
- 类是公共的
- 有一个无参的公共的构造器
- 有属性,且有对应的 get、set 方法
-
用户可以使用 JavaBean 将功能、处理、值、数据库访问和其他任何可以用 Java 代码创造的对象进行打包,并且其他的开发者可以通过内部的 JSP 页面、Servlet、其他 JavaBean、applet 程序或者应用来使用这些对象。用户可以认为 JavaBean 提供了一种随时随地的复制和粘贴的功能,而不用关心任何改变。
-
《Think in Java》中提到,JavaBean 最初是为 Java GUI 的可视化编程实现的。你拖动 IDE 构建工具创建一个 GUI 组件(如多选框),其实是工具给你创建 Java 类,并提供将类的属性暴露出来给你修改调整,将事件监听器暴露出来。