对象和类
Class is the blueprint or prototype from which objects are created.
The introduction of OOP
OOP对软件进行模块化的开发将一个大问题划分成诸多小问题,对与小问题相关的事物按照共性进行分析和抽象出对象的模板即类随之通过所产生的对象以及对象之间的耦合关系解决问题.
世间万物(人、事、物)都可以是实体eg:一名学生、一份债务、一艘宇宙飞船等
每个对象都有自己独特的【标识】、【状态】和【行为】
- 对象的状态(state) - property\attribute是由【当前值的数据域】来表示的。
- 对象的行为(behavior) - action是由【方法】定义的。
🧨 用一个通用类定义同一类型的对象 🧨 类是一个模板、蓝本或合约 🧨 类用来定义对象的数据域是什么以及方法做什么 🧨 一个对象是类的一个实例 🧨 通过类创建对象的过程就是类实例化的过程也是个性化的体现。 🧨 Java中 ===》 【变量 -> 数据域】 【方法 -> 行为】 【构造方法 - 对象初始化】
使用构造方法来构造对象
构造方法在使用new操作符创建对象的时候被调用

一个类会隐式提供一个无参构造方法(no-argument constructor) 当前仅当类中没有明确定义任何构造方法时才会自动提供它
通过引用变量访问对象
对象的数据域和方法可以通过【引用变量】和【.】进行访问
引用变量和引用类型
对象在分配好内存空间之后,通过对象引用变量(reference variable)来访问该对象的数据域和方法
ClassName objectRefVar; // 声明一个对象的引用变量
ClassName ObjectRefVar = new ClassName(); // 声明一个对象的引用变量、创建对象以及将对象的引用赋值给这个变量。
Xobject xObjectRefVar = new Xobject(); 1. 创建Xoject()对象在内存开辟空间 2.将执行该内存空间的引用赋值给该对象的引用变量
访问对象的数据域和方法
Xobject xObjectRefVar = new Xobject(); // 创建一个对象并将该对象的引用赋给该引用变量
xObjectRefVar.dataField 引用对象的数据域
xObjectRefVar.method(arguments) 调用对象的方法
引用数据域和null值
null、true、false是Java关键字
- 引用类型数据域的默认值是null
- 整数类型默认值是0
- 浮点数类型默认值是0.0
- boolean类型数据域的默认值是false
- char类型数据域的默认值是'\u0000'
Java中不会给方法中的局部变量赋予默认值,对初始化的局部变量使用的时候会出现编译型错误
The local variable x may not have been initialized
基本类型变量和引用类型变量之间的区别
每个变量都是代表一个【存储值的内存位置】.
声明一个变量表明该变量可以所在的内存位置可以存储什么样的数据类型。
- 基本数据类型:对应内存所存储的值是基本类型的值。 - 引用数据类型:存储一个引用指定对象存储内容的内存位置。
- 没有引用赋值的引用变量将出现NullPointerException
- 没有引用变量所引用的对象,JVM将自动回收其所占内存空间。
使用Java类库
Date类 - 表示特定的时刻,精度为毫秒。
| 方法 | 描述 |
|---|---|
| +Date() | 分配 Date对象并对其进行初始化,使其表示分配时间,测量 Date到毫秒。 |
| +Date(elapseTime: long) | 分配Date对象并初始化它以表示自标准基准时间(称为“纪元”)以来的指定毫秒数,即1970年1月1日00:00:00 GMT。 |
| +toString() | 返回一个代表日期和时间的字符串表示 |
| +getTime | 返回从1970年1月1日至今流逝的毫秒数 |
Date date = new Date(); // 为当前的日期和时间创建一个实例
System.out.println(date.toString()); // Sun Apr 25 15:17:32 CST 2021
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:SS");
String currentDateAndTimeInfo = sdf.format(date);
System.out.println(currentDateAndTimeInfo); // 2021-04-25 15:17:654
Random类 - 该类的实例用于生成伪随机数流。
java.util.Random实例是线程安全的。 但是,跨线程同时使用相同的java.util.Random实例可能会遇到争用,从而导致性能不佳。 请考虑在多线程设计中使用ThreadLocalRandom 。
java.util.Random实例不具有加密安全性。 请考虑使用SecureRandom来获取加密安全的伪随机数生成器,以供安全敏感应用程序使用。
| 方法 | 描述 |
|---|---|
| +Random() | 以当前时间作为种子创建一个Random对象 |
| +Random(seed: long) | 以一个特定值作为种子创建一个Random对象 |
| +nextInt(): int | 返回一个随机的int值 |
| +nextInt(n: int): int | 返回一个0到n(不包含n)之间的int类型的值 |
| +nextLong(): long | 返回一个随机的long值 |
| +nextDouble():double | 返回一个0.0到1.0(不包含1.0)之间的随机double类型的值 |
| +nextFloat():float | 返回一个0.0F到1.0F(不包含1.0F)之间的随机float类型的值 |
| +nextBoolean(): boolean | 返回一个随机的boolean值 |
如果使用相同的种子创建了两个Random实例,并且对每个实例都进行了相同的方法调用序列,则它们将生成并返回相同的数字序列。
// 【使用Random random = new Random(seed)生成一个随机发生器在通过random.nextInt(100)指定范围内进行随机数的产生】
public static void main(String[] args) {
// 创建一个Random对象必须指定一个种子或使用默认的种子
// 种子是一个用于初始化一个随机数字生成器的数字。
// 无参数构造方法使用当前已经逝去的时间作为种子。
Random random1 = new Random(1);
System.out.print("From random1:");
for(int i = 0; i < 10; i++) {
System.out.print(random1.nextInt(1000) + " ");
}
Random random2 = new Random(1);
System.out.print("\nFrom random2: ");
for(int i = 0; i < 10; i++) {
System.out.print(random2.nextInt(1000) + " ");
}
// From random1:985 588 847 313 254 904 434 606 978 748
// From random2: 985 588 847 313 254 904 434 606 978 748
/*
* 产生相同随机值序列的能力在软件测试以及其他应用非常有用
* 在软测中需要一组固定顺序的随机数来重复生成测试案例
* */
}
静态变量、常量和方法
静态变量被类中的所有对象所共享。静态方法不能访问类中的实例成员。
- 实例的实例变量存储在互不相关的内存中 - 静态变量是被同一个类的所有实例所共享 - 实例变量和实例方法必须经过在创建对象之后才能访问 - 静态变量和静态方法可以在未创建对象的情况下访问

可见性修饰符
| 修饰符 | 本类 | 本包 | 子类 | 其他 |
|---|---|---|---|---|
| public | ✔ | ✔ | ✔ | ✔ |
| protected | ✔ | ✔ | ✔ | |
| default | ✔ | ✔ | ||
| private | ✔ |
- default被称为包私有或包内访问
- private只能用在类成员上(如果一个对象是在其自己的类中定义的,则这个对象可以访问它的私有成员)
- public可以应用类或类成员上
- 局部变量使用public和private会导致编译错误
- 构造方法一般公共为了防止用户创建类的实例才采用构造方法私有化使用private进行修饰
数据域封装
好处:1.防止数据被篡改 2.使类更易于维护
为了避免数据域的直接修改,应使用private修饰符将数据域声明为私有的。这称之为数据域封装(data field encapsulation)
为了能够访问私有数据域向外提供统一的setter(accessor)和getter(mutator)访问
向方法传递参数 - Java只有一种参数传递方式:值传递(pass-by-value)。
当传递基本数据类型值时: 传递的是实参的值。 当传递引用类型的参数时: 传递的是引用类型的引用。
实例1
class Circle{
double radius;
Circle(double newRadius){
radius = newRadius;
}
}
public class Sample01 {
public static void main(String[] args) {
Circle circle1 = new Circle(100);
Circle circle2 = new Circle(2);
swap1(circle1, circle2);
System.out.println("After swap1: circle1 = " + circle1.radius + " circle1 = " + circle2.radius);
// After swap1: circle1 = 100.0 circle1 = 2.0
swap2(circle1, circle2);
System.out.println("After swap1: circle1 = " + circle1.radius + " circle1 = " + circle2.radius);
// After swap1: circle1 = 2.0 circle1 = 100.0
}
public static void swap1(Circle x, Circle y){
// 此处注入的引用不涉及原有对象在内存上内容的变化
Circle temp = x;
x = y;
y = temp;
}
public static void swap2(Circle x, Circle y){
double temp = x.radius;
x.radius = y.radius;
y.radius = temp;
}
}
实例2
public class Sample04 {
public static void main(String[] args) {
T2 t1 = new T2();
T2 t2 = new T2();
// 经过两次初始化 T2类的静态数据域i的值已经累加为2
System.out.println("t1's i = " + t1.i + " and j = " + t1.j);
System.out.println("t2's i = " + t2.i + " and j = " + t2.j);
/*
t1's i = 2 and j = 1
t2's i = 2 and j = 1
*/
}
}
class T2{
static int i = 0;
int j = 0;
T2(){
i++;
j = 1;
}
}


并没有通过原有的内存区域的引用来更改内存中的内容
案例

this引用
this引用对象自身,可以在构造方法中引用同一个类的其他构造方法
关键字this是指向调用对象本身的引用名,可以采用this关键字引用对象的实例成员。
this - 引用隐藏数据域
public class F{
private int i = 5;
private static double k = 0;
public void setI(int i){
this.i = i;
}
public static void setK(double k){
F.k = k;
}
}
🍎 隐藏的静态变量可以通过类名.静态变量的方式引用
🍎 隐藏的实例变量可以通过this.实例变量的方式引用
this - 调用构造方法
关键字this可以调用同一个类的另一个构造方法
public class Circle{
private double radius;
public Circle(double radius){
this.radius = radius; // this关键字用于引用构建对象的隐藏数据域radius
}
public Circle(){
this(1.0); // this关键字用于调用另外一个构造方法
}
}
在构造方法中 this(参数列表)应该在任何其他可执行语句之前出现。
总结
1. 类是对象的模板或蓝图,其他包含【定义对象的属性、创建对象的构造方法、操作对象普通方法】 2. 类也是一种数据类型属于引用类型 3. 对象是现实世界具有唯一标识的客观存在有自己的状态(state - attribute)和行为(behavior - method) 4. 对象是类的实例时类个性化的体现


浙公网安备 33010602011771号