不算重零开始的java学习
第二篇
相比于方法如何实现,我对底层似乎更有兴趣。
NO.1
栈与堆
在java中,内存中会存在两个区域:对象的生存空间堆(heap)以及方法调用及变量的生存空间(stack)。当java虚拟机运行时,它会从底层操作系统中取得一块内存,并依此来执行java程序。
栈 | 堆(又称为垃圾回收的堆) |
---|---|
方法调用和实例变量 | 所有对象 |
实例变量是被声明在类中,因此实例变量存在于所属的对象中。
public class Duck{
int size;//每个Duck对象都会有一个独立的size
}
局部变量以及方法的参数都被声明在方法中,声明周期只限于方法被放在栈的这段时间。
public void foo(int x){
int i = i + 3;
boolean b = true; //参数X和参数I,b都是局部变量
}
当调用一个方法时,改方法会被放在栈顶。
public class doStuff{
boolean b = true;
go(4);
}
public class go(int x){
int z = x + 24;
crazy();
}
public class crazy{
char = 'a';
}
1、某段程序代码调用了doStuff()是的doStuff()被放在最上方的栈块
2、doStuff()调用go(),go()就被放在栈顶
3、go()又调用crazy(),是的crazy()放在栈顶
4、当crazy()执行完成后,它的栈对块就被释放掉。执行就回到了go()
1 | 2 | 3 | 4 |
---|---|---|---|
doStuff() | go() | crazy() | go() |
doStuff() | go() | doStuff() | |
doStuff() |
NO.2
构造函数
谈到构造函数,我想起在学习javascript时,当new出某个函数时,会导致函数中this的绑定。在刚开始接触javascript时,我对这其中的原理百思不得其解。为什么javascript中这种函数会被称为构造函数,书中都是这样形容,后来我才明白这是来自于java的一个词,实际上javascript中只是执行了new而已,并不算是构造函数。用构造函数这个词只是为了方便理解。
先让我们回到之前的那段代码:
Duck myDuck = new Duck();
new Duck()这段代码创建了一个Duck的对象,我们并不是在调用Duck()的方法,而是调用Duck的构造函数
public class Duck{
public Duck(){
//do sth
}
}
public class UseDuck{
Duck d = new Duck();
}
构造函数时可以重载的
public class Duck2{
int size;
public Duck2(){
int size = 26;
}
public Duck2(int ducksize){
size = ducksize;
}
}