一:JVM内存的分析
首先编辑java源文件 *.java,然后调用javac编译器将文件编译成.class字节码文件。
当使用到某个类时,类加载器会将字节码文件加载到内存空间中,然后分配空间,
调用Class类newInstance方法实例对象。
内存中的jvm找到程序中main函数作为入口,然后开始执行。
执行过程中的内存管理
1:寄存器:用来存储指定,例如流程控制语句,下一步应该执行那一条指令语句,就是存储
在寄存器,寄存器的空间很小。
2:栈内存:用来存放主函数中变量、局部变量、引用,主要用来存储基本数据类型的值以及引用
类型的地址,指向堆中的对象,栈的结构遵循先进先出,所以不够灵活。
3:堆内存:用来存放new出来的对象,堆相对栈比较灵活,jvm虚拟机内部维护一个垃圾回收机制,
不向C++那样需要析构函数,必须将对象销毁,垃圾回收机制会定期扫描堆,一旦发现该对象不在
被使用(栈中没有地址执行它),就会把它回收掉,来释放存储空间。
4: 常量池,常量池是从堆内存中分配出来的一小块区域,用来存储经常使用的变量,例如字符串常量,
整形-127~128,如果需要使用,首先会到常量池中寻找,如果常量池中有该对象,直接return,如果没有
创建对象,put进常量池中。
5:数据区(方法区、共享区):data segment 存放静态变量,方法
代码区:code segment:用来存放代码。
二、对于面向对象、类、对象的理解
1. 我们知道面向过程强调的是一系列的动作,面向对象强调是是结果,例如:拿打开冰箱这件事来说,如果我们以面向过程的语言去理解的话:第一步,打开冰箱;第二步;把事物放进去;第三步,把冰箱关上。这就是面向过程,如果我们以面向对象的思想去理解的话,冰箱就是一个对象,他拥有打开,可以存放东西,关闭的方法,我只要用冰箱去调用这些方法就行了。
class Fridge{ private String brand; //品牌 private double price; //价格 //打开 void open(){ System.out.println("open"); } //储存食物 void depositFood(){ System.out.println("depositFood"); } //关闭 void close(){ System.out.println("close"); } public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } }
上面是一个冰箱的类,有品牌、价格等属性,还有打开、关闭、存储食物的行为。
public class Person { private String name; private int age; private Fridge fridge; Person(String name,int age,Fridge fridge){ this.name=name; this.age=age; this.fridge=fridge; } void cook(){ fridge.open(); fridge.depositFood(); fridge.close(); } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Fridge getFridge() { return fridge; } public void setFridge(Fridge fridge) { this.fridge = fridge; } }
然后又创建Person这个类,这个类有姓名、年龄以及冰箱的属性,因为人如果想使用冰箱,就必须将冰箱对象注入人中。
如果人要cook,那么就要打开冰箱,拿去食物,然后关闭冰箱。
这就是面向对象的思想,我们眼中只有一个个对象,它的功能实现与我们调用者无关,我们只要使用它们的功能就行了。
举例二:我们打开门,然后进来,把门关上,这是一个过程,而面向对象的思想就是,门是一个对象,拥有打开,关闭的方法,我们只要去调用就行了,至于如何实现,那是门的事情,与我们调用者无关。
2.类与对象,在现实生活中,存在一个个特征鲜明的个体,我们称他们为对象,就是说万事万物都是对象,张三、李四、一只狗,一只猫,它都是与众不同的,如果我们仔细观察事物,会发现,事物之间是存在共性了,张三和李四都是人,都属于人这个类,然后和一只狗之间有都是动物,在往上,和一棵树又都是生物,所以类是一个抽象的概念,它是对一些对象共性的抽取。而对象时现实生活一个个活灵活现的个体。
既然类是很多对象共性的抽取,那么某一类事物肯定又有一些属性,或者行为方式;
举例:人类,有姓名,年龄,国籍,性别, 都吃饭,走路,睡觉,说话,,等等方式,
按照类中的属性和方法对号入座填上数据,那么一个具体的对象就创建出来了
三:几个关键字的用法
1、return 返回值类型和方法指定类型保持一致,这个值总是确定的。
return的另一个作用是结束方法的执行,对于void方法,没有返回值,不用写return,其实在方法的最后默认
会加上return。
2.this 关键字:表面上是区分成员变量和参数名重名的问题,其实this可以看做一个变量,就是当前值的调用,比如讲台上有一把椅子,它就代表this。那个老师来上课,那个老师就坐在那里,而在java中,只要有对象来调用这个函数,那么this,就代表当前调用本函数的对象。