类与对象
类与对象的概念
类:对事物的抽象概括,对象:对抽象事物进行实例化
类和对象的创建
类的创建格式:修饰词 class 类名 {}
对象创建的格式:类型 对象名 = new 类型();
对象的成员变量的赋值及访问
赋值格式:对象名.变量名 = xxx;
访问方法:配合 System.out.println() 使用
对象的成员方法的访问
访问方法:对象名.方法名();
? 补充:成员变量有默认初始值
代码演示:类与对象
public class Demo {
public static void main(String[] args) {
Student student = new Student();
student.name = "gwz";
student.age = 18;
System.out.println(student.name + ":" + student.age);
student.run();
student.eat();
}
}
class Student {
String name;
int age;
void run() {
System.out.println("喜欢运动");
}
void eat() {
System.out.println("喜欢吃饭");
}
}
对象的内存分配
内存概述
jvm = 方法区、栈区、堆区
方法区:存储.class的相关文件
成员变量、成员方法
栈区:【先进后出】main方法,最先开始,最后结束
栈帧:每次调用方法,都会在调用栈上开辟一个独立的栈帧
栈帧的生命周期:由方法的调用开始,到方法最后一句代码结束
局部变量存放在栈中【因为方法在栈中,所以局部变量也在栈中】
局部变量的生命周期:由方法的调用开始,到方法最后一句代码结束
堆区:【new出来的】
存放的是对象的地址【每个存储对象在堆中都有一个唯一的地址值和栈中的引用地址值一致】
成员变量存放在堆中【因为对象在堆中,所以成员变量也在堆中】
成员变量的生命周期:由对象的创建开始,到对象回收结束
代码演示
public class Student_Test {
public static void main(String[] args) {
Student student = new Student();
student.name = "gwz";
student.age = 18;
System.out.println(student.name + ":" + student.age);
student.run();
}
}
class Student {
String name;
int age;
void run() {
System.out.println("运动");
}
}
内存分析图
解析内存图
根据上面的代码
1. 方法区中,加载类中的信息(成员变量、成员方法、静态方法)
2. 主函数(main)在栈中开始运行,创建一个对象,其对象名就是一个引用地址
3. 该对象(new)在堆中开辟空间,此刻对象的成员变量是默认初始值,成员方法以地址的形式存放在堆中
4. 通过对象的引用地址(student.name = "gwz"),从堆中找到并赋值
5. 若成员方法中无参数列表,直接在栈中运行
6. 若成员方法中参数列表中包含对象名,此时对象名表示的是对象的引用地址
对象作为方法参数传递
代码演示
public class Student_Test {
public static void main(String[] args) {
Student student = new Student();
student.name = "gwz";
student.run(student);
}
}
class Student {
String name;
void run(Student student) {
System.out.println("获取对象名信息" + student);
System.out.println(student.name + "喜欢运动");
}
}
对象作为方法返回值类型
代码演示
public class Student_Test {
public static void main(String[] args) {
Student s = getMethod();
System.out.println(s.name + ":" + s.age);
}
public static Student getMethod() {
Student student = new Student();
student.name = "gwz";
student.age = 18;
return student;
}
}
class Student {
String name;
int age;
}
基本数据类型作为返回值时,返回的是数值
引用数据类型作为返回值时,返回的是地址
垃圾回收机制
垃圾回收器是JVM自带的一个线程(自动运行程序),用于回收没有任何引用所指向的对象
程序员可以调用System.gc()来“建议”垃圾回收系统回收资源,但是垃圾回收系统什么时候被执行以及是否被执行,程序员都控制不了
- 例 Cell c = new Cell();
- c = null;
此时,堆中创建了一个对象,但对象没被引用
建议:在某个对象使用之后,再也不会使用到情况,一定要进行null值处理(c = null),避免内存泄漏
System.gc方法
GC的回收对程序员来说是透明的,并不一定一发现有无引用的对象就立即回收。一般情况下,当我们需要GC线程即刻(短时间内)回收无用对象时,可以调用System.gc()方法。此方法用于建议JVM马上调度GC线程回收资源,但具体的实现策略取决于不同的JVM系统
通俗易懂:GC的回收对程序员来说是透明的,我们通过 "建议" JVM的方法实现垃圾的回收:System.gc();
如果堆中的对象不可用的数量过多,就会出现内存泄漏的问题
建议:在某个对象使用之后,再也不会使用到情况,一定要进行null值处理(c = null),避免内存泄漏
|