1. 类和对象

​ 类:对象共同特征的描述

​ 对象:真实存在的具体东西

在java中,必须先设计类,才能获取对象。

  • 如何定义类

1
2
3
4
5
6
7
public class 类名{
1.成员变量(代表属性,一般是名词,如手机的价格、品牌)
2.成员方法(行为,一般为动词,如手机可以玩游戏)
3.构造器(后面学习)
4.代码块(同上)
5.内部类(同上)
}
  • 如何得到类的对象

类名 对象名 = new 类名();

1
Phone p = new Phone();
  • 如何使用对象

访问属性:对象名.成员变量

访问行为:对象名.方法名(…)

  • 使用时建议

(1)类名首字母建议大写、英文、有意义、满足驼峰模式,不能用关键字,满足标识符规定

(2)一个代码文件中可以定义多个类,但只能有一个类是public修饰的,public修饰的类名必须是Java代码的文件名称(一般建议一个文件只定义一个类)

(3)定义类时不需要给属性赋值

  1. 封装

​ 原则:对象代表什么,就要封装对应的数据,并提供数据对应的行为

  • 好处

​ 简化编程。只需要找对象,调方法就行

​ 降低学习成本,可以少学、少记,或者不用学、不用记对象有哪些方法,需要时去找就行

  • 使用private关键字判断输入值是否合理

如果直接对price赋值一个负数,在语法上是没有问题的,不会出现报错,但是不符合常理

private关键字

(1)是一个权限修饰符

(2)可以修饰成员(变量和方法)

(3)被private修饰的成员只能在本类中访问

1
2
3
4
public class Phone{
private String brand;
private int price;
}

通过以上修饰后,当再次对新的对象赋值会出现报错(赋值合理也会报错)

1
2
Phone p1 = new Phone();
p1.price = 1999;

改写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class Phone{
//属性
private String brand;
private double price;

//对于每一个私有的变量都需要使用get和set方法
//set方法:给成员变量赋值
public void setBrand(String n) {
brand = n;
}
//get方法:对外提供成员变量的值
public String getBrand() {
return brand;
}

public void setPrice(double p) {
if(p > 0 && p < 1000000) { // 假设价格在合理范围内
price = p;
}else{
System.out.println("价格不合理,请输入正确的价格");
}
}

public double getPrice() {
return price;
}

//行为
public void call(){
System.out.println("正在拨打电话...");
}

public void sendMessage(){
System.out.println("正在发送短信...");
}

}

分别使用“setXxx(参数)”方法为变量赋值与“getXxx()”方法获取变量的值。方法用public修饰(get方法要根据数据变量的类型确定返回值类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class PhoneTest{
public static void main(String[] args) {
//创建手机对象
Phone p = new Phone();

//给手机赋值
p.setBrand("xiaomi");
p.setPrice(1999.98);

//获取手机对象中的值
// System.out.println(p.brand);
// System.out.println(p.price);
System.out.println(p.getBrand());
System.out.println(p.getPrice());

//调用手机中的方法
p.call();
p.sendMessage();
}

}
  1. this关键字

  • 就近原则

1
2
3
4
5
6
7
public class Phone{
private int price;//0
public void method(){
int price = 10;
System.out.println(price);
}
}

​ 成员变量与局部变量重复时,会采用就近原则。由此可知上方输出的是局部变量中的price,结果为10.

​ 如果一定要成员变量price,需要使用this关键字

1
2
3
4
5
6
7
public class Phone{
private int price;//0
public void method(){
int price = 10;
System.out.println(this.price);
}
}

​ this用于区分成员变量和局部变量

  1. 构造方法

​ 也称为构造器、构造函数

​ 作用:在创建对象时给成员变量进行初始化(赋值,功能相当于上面的set方法)

特点:

(1)方法名与类名相同,大小写一致

(2)没有返回值类型,也没有void

(3)没有具体返回值(不能由return带回结果数据)

构造时机:

创建对象时由虚拟机调用,不能手动调用构造方法

每次创建一次对象,就会调用一次构造方法

注意事项:

①构造方法的定义

​ 如果没有定义构造方法,系统将给出一个默认的无参数的构造方法

如果定义了构造方法,系统将不再提供默认的构造方法(如:你已经定义了一个有参构造,再去使用无参构造方法的话就会报错)

②构造方法的重载

​ 带参构造方法,和无参构造方法,两者方法名相同,但是参数不同,这叫构造方法的重载

1
2
3
4
//无参构造
public Student(){
……
}
1
2
3
4
//带参构造
public Student(String name, int age){
……
}

③推荐的使用方法

​ 无论是否使用,都要手动书写两种构造方法

  1. JavaBean类

①类名要见名知意(驼峰命名)

②成员变量使用private修饰

③提供无参和带参的两种构造方法

④成员方法

  • 提供每个成员变量对应的setXxx()/getXxx()
  • 其他的行为(若没有则不用写)

(有一些idea可用的快捷键,但是我自己用的是vscode就先不写了)

  1. 对象内存图

一个对象的内存图

image-20250723111241184

当所有方法执行完毕后,就会从栈里出去。main方法出栈后里面的变量就没有人使用了,堆内存中的空间也会消失。

两个对象的内存图

image-20250723131141745

两个引用指向同一个对象

image-20250723135131542

区别在于:

1
Student stu2 = stu1;

此时stu2指向的地址跟stu1相同,后续对stu2的操作也会影响stu1。如上图:当对stu2.name赋值为“阿珍”时,原本的名字也被重置了。