1. 类和对象的内存处理方式
1.1 方法区(method area)
- 也称静态区,用于存放用户定义的各个类、静态变量等。
1.2 堆(heap)
- 堆中存放对象和非静态变量。
- 在使用new关键字产生对象后,对象会存放进堆中进行管理,对象名就是对象在堆中的地址。
- 对象把被它调用的成员变量直接存储到堆中。
- 对象把被它调用的成员方法地址存储到堆中,间接调用。
- 堆中的内容会被垃圾回收器回收。
1.3 栈(stack)
- 调用的方法都会进入到栈中(包括main方法),方法执行完成就出栈。若调用的是对象的方法,则会先进入堆中找到这个方法的地址,再根据地址进入方法区进行调用。
2. 对象作为方法的参数和返回值
-
对象可作为方法的参数
public void fun(Scanner scan){
int i = scan.nextInt();
System.out.println(i);
}
-
对象可最为方法的返回值
public Student getStu(){
Student stu = new Student();
stu.setName("XiaoMing");
stu.setAge(11);
return stu;
}
3. 成员变量和局部变量
3.1 基本特征
- 成员变量位于方法外,可供整个类使用;局部变量位于方法内,仅它所在的方法可使用。
- 成员变量有默认值null,定义时可不赋值;局部变量没有默认值,定义时必须赋值。
3.2 内存管理
- 由于成员变量在类中定义,而类实例化为对象后是进入堆中,故成员变量是在堆中进行管理。
- 局部变量在方法中定义,方法是在栈中进行管理,故局部变量也在栈中进行管理。
3.3 生命周期
- 局部变量在栈中,故最终随方法出栈以结束生命周期,周期较短。
- 成员变量在堆中,故最终以垃圾回收的方式结束周期,周期较长。
3.4 this关键字的使用
- 若某个类中,局部变量的名称和成员变量名称相同,则可使用this关键字对局部变量进行标识,以区分两个变量。
- 若有多个类,则this表示的是造成重名的那个类。
4. private型变量的访问
- 若类中有变量private int age,则在类以外无法直接访问这个变量。
- 若要在类外访问private型变量age,需在类中定义setAge()和getAge()两个方法,按格式要求,变量名age的首字母必须为大写(idea中使用alt+insert可快速创建)。
- setAge()和getAge()方法中可编写访问控制语句。
5. 构造方法
- 构造方法用于创建对象,若默认的构造方法无法满足使用需求,可自定义构造方法,以替代默认方式,在创建对象时提供额外的功能(实现逻辑、为变量赋值等)。
-
自定义的构造方法名需和类名相同。定义构造方法时,无需设置返回值类型。
public class Student {
public Student (){
System.out.println("I'm a student");
};
}
-
构造方法可进行重载(可创建多个同名构造方法,方法名称相同,但参数列表不同,使用时根据参数列表进行区分)。
public class Student {
public Student (){
System.out.println("I'm a student");
};
public Student(String name,int age){
System.out.println("My name is"+name+", I'm "+age+"years old");
}
}
-
同一个类中的无参构造方法可用this调用本类中的有参构造方法:
public class Student {
public Student (){
this("java",18) ;//无参构造方法中调用有参构造方法
System.out.println("I'm a student");
};
public Student(String name,int age){
System.out.println("My name is "+name+", I'm "+age+" years old");
}
/*输出结果:
My name is java, I'm 18 years old
I'm a student
*/
}