类 : 具有相同特征的事务的抽象描述 , 是抽象的 , 概念上的定义
理解 : 以人进行举例
对象 : 实际存在的该类事物的每个个体 , 是具体的 , 所以也称为实例(instance)
面向对象程序设计的重点是类的设计
类的设计,其实就是类的成员的设计
类时一组相关属性和行为的集合 , 这也是类最基本的两个成员
属性 : 该事务的状态信息。 对应类中的成员变量
行为 :该类事物要做什么操作,或者基于事物的状态能做什么。对应类中的成员方法
HotSpot Java 虚拟机的架构图如下。其中我们主要关心的是运行时数据区部分(Runtime Data Area)。
其中:
堆(Heap)
:此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。这一点在 Java 虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配。
栈(Stack)
:是指虚拟机栈。虚拟机栈用于存储局部变量等。局部变量表存放了编译期可知长度的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference 类型,它不等同于对象本身,是对象在堆内存的首地址)。 方法执行完,自动释放。
方法区(Method Area)
:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
[修饰符1] class 类名{
[修饰符2] 数据类型 成员变量名 [= 初始化值];
}
面向对象的开发原则要遵循“高内聚、低耦合
”
高内聚、低耦合是软件工程中的概念,也是 UNIX 操作系统设计的经典原则。
内聚,指一个模块内各个元素彼此结合的紧密程度;耦合指一个软件结构内不同模块之间互连程度的度量。内聚意味着重用和独立,耦合意味着多米诺效应牵一发动全身
而“高内聚,低耦合”的体现之一:
高内聚
:类的内部数据操作细节自己完成,不允许外部干涉;低耦合
:仅暴露少量的方法给外部使用,尽量方便外部调用。
把该隐藏的隐藏起来 , 该暴露的暴露出来 , 这就是封装性的设计思想
public
、protected
、缺省
、private
。具体访问范围如下:修饰符 | 本类内部 | 本包内 | 其他包的子类 | 其他包非子类 |
---|---|---|---|---|
private | √ | × | × | × |
缺省 | √ | √ | × | × |
protected | √ | √ | √ | × |
public | √ | √ | √ | √ |
成员变量/属性私有化
概述:私有化类的成员变量,提供公共的 get 和 set 方法,对外暴露获取和修改属性的功能。
实现步骤:
① 使用 private
修饰成员变量
② 提供 getXxx
方法 / setXxx
方法,可以访问成员变量
成员变量封装的好处:
访问数据
,从而可以在该方法里面加入控制逻辑,限制对成员变量的不合理访问。还可以进行数据检查,从而有利于保证对象信息的完整性。便于修改
,提高代码的可维护性。主要说的是隐藏的部分,在内部修改了,如果其对外可以的访问方式不变的话,外部根本感觉不到它的修改。例如:Java8->Java9,String 从 char[]转为 byte[]内部实现,而对外的方法不变,我们使用者根本感觉不到它内部的修改。
注意:
开发中,一般成员实例变量都习惯使用 private 修饰,再提供相应的 public 权限的 get/set 方法访问。
对于 final 的实例变量,不提供 set()方法。(后面 final 关键字的时候讲)
对于 static final 的成员变量,习惯上使用 public 修饰。
构造器也被称为构造方法
语法格式:
[修饰符] class 类名{
[修饰符] 构造器名(){
// 实例初始化代码
}
[修饰符] 构造器名(参数列表){
// 实例初始化代码
}
}
说明: