Class1:
类和对象:
JAVA信息首先进入的是方法区,所有的类信息会存入JVM中的方法区内,程序的执行顺序是由栈控制的
线程就是从主方法开始入栈到出栈结束的过程,线程的本质是一个栈
方法执行顺序实例:
public class Test{
public static void main(String[] args){
System.out.println("main开始");
m1();
m2();
System.out.println("main结束");
}
public static void m1(){
System.out.println("m1开始");
m3();
m4();
System.out.println("m1结束");
}
public static void m2(){
System.out.println("m2开始");
m4();
System.out.println("m2结束");
}
public static void m3(){
System.out.println("m3开始");
m4();
System.out.println("m3结束");
}
public static void m4(){
System.out.println("m4开始");
m5();
System.out.println("m4结束");
}
public static void m5(){
System.out.println("m5开始");
System.out.println("m5结束");
}
public static void m6(){
}
}
出入栈顺序图:
实例2:
public class Person(){
public int age;
public int height;
public String name;
public static int flag;
public static void m1(){}
public void m2(){}
}
public class PersonTest{
public static void main(String[] args){
Person.age = 10; //非静态变量,不直接赋予空间,报错
Person.flag = 10; //静态变量,创建时会赋予空间,不报错
Person.m1(); //静态方法,不报错
Person.m2(); //非静态方法,报错
}
}
一个类中的静态方法与变量会提前开辟一个空间,可以直接调用,而非静态方法与变量不会
方法栈图:
为此新建两个对象person1、person2:
public class PersonTest{
public static void main(String[] args){
Person person1 = new Person();
Person person2 = new Person();
}
}
此时堆栈图如下:
整个JVM图如下:
在方法中声明的变量没有默认值,而在对象中的成员都有默认值,数值类型—0,布尔类型—false,引用类型—null
此时堆内存图实际如下:
通过下列代码为对象person1、person2赋值:
person1.age = 21;
person1.height = 180;
person1.name = "李明";
person2.age = 20;
person2.height = 164;
person2.name = "李华";
此时堆内存图实际如下:
类与对象的关系:
类是对象的模板,对象是类的实例。在方法区建立的称为类,栈中储存整个程序的过程以及变量句柄,堆中存放以方法区中类为模板创建的实例对象。而类中的静态变量以及静态方法并不参与实例对象的构造,它是可以被直接调用的