一.封装:
尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。
系统的其他对象只能通过包裹在数据外面的已经授权的操作(简单的外部接口)来与这个封装的对象进行交流和交互。
也就是说用户是无需知道对象内部的细节,但可以通过该对象对外提供的接口来访问该对象。
优点:
1.保证内部结构的安全
2.屏蔽复杂,暴露简单
实现:所有成员变量添加private关键字,设置set和get函数
public class Student {
private String name;
private int age;
private char gender;
public void setName(String name) {
//this的作用:区分成员变量和局部变量
this.name = name;
}
public void setAge(int age) {
if (age >= 18 && age <= 50) {
this.age = age;
}else{
System.out.println("数据非法");
}
}
public void setGender(char gender) {
this.gender = gender;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public char getGender() {
return gender;
}
}
封装思想的应用:
当一个函数的参数不确定时,或者参数很多时,可以把这些参数封装成一个对象。传递参数时,就只要传递这个整体的对象就可以了,不需要管底层零散的数据。
User userInfo = new User(username, password, null, null);
//以User对象作为参数传递,而不是内部零散的一些属性
boolean result = checkUserInfo(list, userInfo);
二.构造方法
创建对象时,由虚拟机自动调用,作用是给成员变量初始化。
1.无参构造方法:
初始化对象时,成员变量的数据均采用默认值
public class Student {
private String name;
private int age;
private char gender;
public Student(){
System.out.println("hello");
}
}
注意:如果我们自己没有写任何的构造方法,那么虚拟机会自动创建一个默认的无参构造方法
2.带参构造方法:
初始化对时,同时为对象赋值
public class Student {
private String name;
private int age;
private char gender;
public Student(String name, int age, char gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
}
注意:如果已经定义了构造方法,那么虚拟机将不再提供默认的无参构造方法
解决方法:无论是否都使用,都要同时手写无参构造方法和全参构造方法
三.对象内存图
1.创建一个对象所需要的步骤(7步):
①加载class字节码文件(进入方法区/元空间)
②申明局部变量
③在堆内存中开辟一个空间
④默认初始化
⑤显示初始化
如果在定义成员变量时,已经初始化值,则执行该步骤;否则可以忽略
⑥构造方法初始化
如果使用的是有带构造方法创建对象,则需要执行该步骤;否则可以忽略
例如:
public class Main {
public static void main(String[] args) {
Student s=new Student("李四",18);
}
}
所以,构造方法≠创建对象,构造方法只是创建对象7步中的一步
⑦将堆内存中的地址赋值给局部变量
2.两个引用指向一个对象
public class Main {
public static void main(String[] args) {
Student s1=new Student("zhangsan",23);
Student s2=s1;
}
}
四.this的内存原理
本质:方法调用者的地址值
作用:区分成员变量和局部变量
举个🌰🌰🌰
主函数:
首先创建了一个对象,地址值为001
s1调用setName方法进行赋值,setName方法加载进栈
执行setName方法
此时,s1是setName方法的调用者,对于setName方法中的this,代表的就是调用者s1的地址值。
也就是将参数 "竹小玲" 赋值给this(001)中的name
setName方法执行完毕,出栈