1. 概念
面向对象是基于面向过程的一种程序设计思想,核心思想:把现实中的事物抽象成对象,通过对象之间的信息传递来实现通信和交互。完成一些功能,只需要找到可以完成该功能的对象即可。
- 类:用户自定义的数据类型,具有相同属性和行为的对象的集合。
- 对象:根据类作为模板创建的实例,具有类所有的属性和行为。
使用类描述事物的维度:
- 有什么: 变量(属性-成员变量)
- 干什么: 方法(行为-成员方法)
根据类创建对象: 借助new关键字实现。
2. 类的对象
2.1 使用类描述事物的维度:
- 有什么: 变量(属性-成员变量)
- 干什么: 方法(行为-成员方法)
- 成员变量: 定义到类中,方法外
- 成员方法: 定义到类中,方法外, 不要写static
//用于描述手机这种事物的类
public class Phone {
//属性-成员变量描述有什么
//品牌
String brand;
//价格
double price;
//颜色
String color;
//行为-成员方法描述干什么
//打电话
public void call(String name){
System.out.println("拿着"+price+"块的"+color+brand+"手机 "+"躺着给 "+name+" 打电话");
}
//玩游戏
public void playGame(String gameName){
System.out.println("趴着玩: "+gameName);
}
//刷抖音
public void playTiktok(){
System.out.println("刷5小时抖音");
}
}
2.2 根据类创建对象:
借助于new关键字完成, new 类名();
public class PhoneTest {
public static void main(String[] args) {
//1.创建根据Phone类创建对象
Phone p1 = new Phone();
p1.brand = "mate60";
p1.price = 9999.99;
p1.color = "嫩粉";
p1.call("柳岩");
Phone p2 = new Phone();
p2.call("舒淇");
p2.brand = "honorv70";
p2.price = 4000;
p2.color = "黑色";
p2.call("老婆");
}
}
2.3 对象在内存中的执行原理
步骤:
代码示例:
- 加载class文件到方法区,首先加载TestStudent的类信息。
- main方法进栈。
- 执行Student s = new Student();
- 首先,虚拟机会检查 Person 类是否已经加载。如果尚未加载,会根据类的全限定名去加载 Person 类的类信息(如类的字段、方法信息等),并且进行类的验证、准备(为静态字段分配内存并设置默认初始值)、解析等工作。
- 创建对象实例:一旦 Person 类的类信息加载完毕并且通过了验证,就会在堆内存中为 Person 类的对象分配内存空间,然后调用 Person 类的构造方法进行初始化。
- 根据堆获取信息进行打印。
- 堆中有一种类型信息区,存储成员方法的地址,执行到s.study将study方法进栈。
下图是:被调用方法进栈的步骤。
注意:- 方法区也会有对应的内存地址
- 堆中的类会根据方法区的类申请对应的堆内存大小
- 堆中会存储类方法区的地址值
3. 封装(private关键字)
面向对象三大特征之一。
封装在成员之前,添加private关键字即可。
- 如果一个成员被private修饰,那么外部是不能直接通过对象.访问。
- 给被private修饰的成员变量提供公共的访问方法(设置值的方法, 获取值的方法), 叫做setter/getter方法
private修饰成员变量的作用:防止用户输入恶意数据对javabean造成影响。所以设置输入变量值的范围,从而避免该情况。
// setAge 方法,用于设置 age 属性
public void setAge(int age) {
// 设置年龄范围为正数,避免输入负数的情况
if (age >= 0) {
this.age = age;
} else {
throw new IllegalArgumentException("年龄不能为负数");
}
}
private修饰成员方法的作用:只在合适的上下文中被调用,避免了不必要的外部访问和误用。
4.this关键字
概念:是一个引用类型变量,表示方法调用者的地址值。
作用: 区分同名的成员变量和局部变量
- 成员变量: 定义在类中,方法外的变量
- 局部变量: 定义在方法内,以及方法的参数列表上的变量
//提供get和set方法
public void setPrice(double price) {
//默认就近查找原则,谁离我近,我用谁
//price = price;
this.price = price;
}
5. 构造方法
概念:一种特殊的方法
要求:
- 没有返回值类型
- 该方法的方法名必须是类名
格式:
public 类名(){}
作用:
- 创建对象, 被new关键字调用
- 给成员变量赋值
特点:
如果定义类的时候,没有提供构造方法, 那么编译器会自动的赠送一个空参数构造, 如果提供了,将不再赠送。
6. JavaBean(实体类)
我认为:因为在java中以数据结构存储数据。javaBean就是自定义数据类型用来灵活的存储数据,其中只包含成员变量和Getter和Setter方法,创建这种类的好处是:
- 封装信息将对象的属性和数据库字段进行对应
- 通过lombok注解对属性设置值的时候进行不合法过滤
- 当做自定义数据类型
扩展:成员变量和局部变量的区别
- 成员变量:
- 位置: 类中,方法外
- 存储位置不同: 堆中
- 局部变量:
- 位置: 方法内或者方法的声明上
- 存储位置不同: 栈中
7. 对象数组
扩展:null
概念: 引用类型数据的占位符。
作用: 如果一旦一个引用类型的变量的值为null,那么证明该引用类型的变量将不指向堆中的任何内存,此时不能通过该引用做任何操作,否则会报错, NullPointerExceotion(空指针异常)。