本来想看深入java虚拟机,百十页,还是找些简单的文档
把握重点,暂时需要的,把经常写的代码执行时内分分析明白,够用就好
如果需要再逐渐深入研究
内存的存放
code segment —— 存放代码
data segment —— 静态变量,字符串变量
stack —— 局部变量
heap —— new出来的东西
1、
Test test = new Test()
test为局部变量, 指向new出来的东西
stack | heap
--------------|-------------------
test: xxx | {____}
2、
int date
定义局部变量,占一块内存
stack |
----------|
data:9 |
3、
public BirthDate(int d, int m, int y) //构造方法
BirthDate d1 = new BirthDate(7,71970);
调用完成后d,m,y被释放
4、
int date =9;
void chang1(int i)
{
i = 1234;
}
test.chang1(date);
在stack中, date:9 传给i
i变为9,被赋值1234
调用结束后,i会被释放
5、
BirthDate d1 = new BirthDate(7,71970);
test.change2(Birthdat b)
{
b = new BirthDate(22,2,2003)
}
画图不便,心中执行一遍
方法调用结束后,b和new 消失
6、test.change3(d2)
{
d2.setMonth(2);
}
各种图..
=============================================
static关键字
public class Cat
{
private static int sid =0;
private String name;
int id;
Cat(String name)
{
this.name = name;
id = sid++;
}
public void info()
{
sysout("name" + name + id)
}
main()
{
Cat.sid =100;
Cat mini = new Cat("mini");
Cat pipi = new Cat("pipi");
mini.info();
pipi.info();
}
}
写程序时,心中要有一张内存图
dataSegment : 存放了 name,sid
擦~没说什么时候释放? 自己查下吧
程序整个运行期间都会存在
内存分配方式有三种:
(1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
(2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
(3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
类的静态成员变量和函数中的静态变量一样,在编译的时候就分配内存了,直到程序退出才释放,并不是随着对象的删除而释放的:
===============================================
类的继承
内存分析
super和this的使用
每个对象都有一个hashCode标识对象的在堆中的位置
对象的转型
子向父转 这个就是父类引用指向子类对象
子包含的多 转后多的部分就看不到了 , 只能访问作为父类的成员
动态绑定和多态
应该是就接口的引用指向多个实现类,
他妹的! 图画这么乱,接口怎么分析? 看看马士兵的讲的那点视频吧,分析挺不错的
随后补充下吧
==============================================
数组
数组是引用类型,它的元素相等于类的成员变量,所以分配空间后,所以每个元素
按成员变量的规则被饮食初始化。
数组作为返回值,相当于一个引用指向了数组的一个成员,成员又指向了对象
String 类不可变
String s1 = "hello";
String s2 = "world";
s1+s2;
在datasegment存放了三个区域 String是对象了
===================================================
容器API
Iterator容器 ---{}----{}----{} next();
处理流和节点流