HM-Java基础-day01面向对象基础

目录

学习导图

单个对象内存图

两个(多个)对象内存图(多个对象使用的是同一个字节码文件,使用的就是同一份方法,但是成员变量不同,每个对象的成员变量在堆内存都有独立的空间)

题目:执行如下代码输出的结果为:

垃圾回收

成员变量与局部变量

this关键字

封装:

 构造方法


学习导图

单个对象内存图

一、有这样一段代码:

 二、JVM有三块内存区

 三、两个类被编译为字节码文件加载进方法区,TestStudent中的主方法所在类的字节码文件会先加载进方法区(因为main方法是程序的入口)

四、此次方法区中有什么方法就看源文件中有啥方法,源文件中只有main方法,则Teststudent字节码文件所在的方法区中也有main方法

五、主方法会被JVM虚拟机自动调用执行,会压入栈内存中,开始执行主方法中的代码

六、 执行第一行代码Student s = new Student();此时声明一个Student对象但是内存中没有Student对象的内存地址,需要将Student.class字节码文件加载进方法区

 七、new Student()需要在堆内存中开辟一个空间,生产Student对象

八、对象是根据类创建的,所以类中的成员变量,在堆内存中也有一份并且拥有初始化值(Student对象存在于堆内存,其属性肯定在堆内存中也有一份),而成员方法不会进入堆内存,但是在堆内存中有一份成员方法的地址。

 九、创建对象s完成,堆内存中地址为001,再将001赋值给s,此时控制台打印001地址

 十、执行到s.study()方法时,就会在堆内存中找到s对应的地址001,在根据成员方法的地址值,找到Student.clss字节码文件中的study()方法,然后将study()方法加载进栈内存中

 执行完study()方法中的代码后,study()方法会弹出栈内存,然后主方法弹栈程序执行完毕。


两个(多个)对象内存图(多个对象使用的是同一个字节码文件,使用的就是同一份方法,但是成员变量不同,每个对象的成员变量在堆内存都有独立的空间)


不会再加载一次 

题目:执行如下代码输出的结果为:

class Student{
    String name;
    int age;
    public void study(){
        System.out.println("好好学习!");
    }
}
public class TestStudent {
    public static void main(String[] args) {
        Student stu1 =new Student();
        stu1.name = "阿强";
        Student stu2= stu1;
        stu2.name ="阿珍";
        System.out.println(stu1.name+"..."+stu2.name);
        stu1 = null;
        System.out.println(stu1.name+"..."+stu2.name);
        stu2=null;
        System.out.println(stu1.name+"..."+stu2.name);
    }
}

A.

阿强...阿珍

NullPointerException

B.

阿珍...阿珍

NullPointerException

NullPointerException

C.

阿强...阿珍

null...阿珍

null...null

D.

阿珍...阿珍

NullPointerException

垃圾回收

注意:当堆内存中,对象或者数组产生的地址,通过任何方式都不能被找到后,就会被判定为内存中的“垃圾”,垃圾会被Java垃圾回收器,空闲的时候自动进行清理

成员变量与局部变量

this关键字

this:代表所在类的对象引用,方法被哪个对象调用

封装:

 构造方法

 

猜你喜欢

转载自blog.csdn.net/qq_53663718/article/details/127274285