java初学者笔记——类与对象
一.多种方法调用如何调用栈
1.Java进入方法区,所有方法都存储在JVM内
Test
{
//有个main函数
main
}
Person {
age,
height,
name
}
调用子程序———栈————控制程序执行顺序
多线程就是多个栈
Example1:
public class Test{
public static void main(String[] aaa){
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_END");
}
public static void m3(){
System.out.println("m3开始");
m4();
System.out.println("m3_END");
}public static void m4(){
System.out.println("m4开始");
m5();
System.out.println("m4_END");
}public static void m5(){
System.out.println("m5开始");
System.out.println("m5_END");
}public static void m6(){
}
}
结果:
首先,第一个main方法压入栈,当没有新的方法调用时,顺序执行,执行完就出栈;当发生方法调用时,将其压入栈进入调用的函数,直到完成main方法。
public class Test{
public static void main(String[] aaa){
int a=9;
int b=7;
//main方法中a,b
if(a>b)
{
int k1=m1(); //调用m1,a=10,b=6入栈,a改成4 压k=3 结束了 撤销
}
for(int i=0;i<2;i++){ //i=0,s=8进入,s出栈,i更改为1,f=8入栈 最后i也出栈
int s=8;
if(i==1){
int f=8;
}
}
}
public static int m1(){
int a=10;
int b=6;
if(a>b){
a=4; //在外面声明了a 所以改变了a的值
int k=3; //消除了k,因为外部没有声明
}
else{
int h=8; //没有用到h
}
return a+b;//(a=4)+(b=6)=10
}
}
为什么静态可以直接调用,而非静态的方法和成员不可以调用?
因为一个在内存中创建了空间,另一个没有给开辟空间,使用的是空心的。
二.探寻非静态
非静态处于堆中
类->对象 :抽象,
对象->类:具体实例
类:抽象的 (不占用内存)
对象:具体的 (占用内存)
Person是类,栈中的是句柄 而堆中的是对象
//方法区内一个程序方法整体(例如Public class Person创建的Person,里面包含age、height等方法)是类,以类为模板在堆里创建的个体就是对象。栈中的是引用句柄。
Person a = new Person();
Person b = new Person();//声明的对象里面有默认值
int x;
String y; /没有默认值