内存分配
静态存储区(方法区):主要存放静态数据、全局 static 数据和常量。这块内存在程序编译时就已经分配好,并且在程序整个运行期间都存在。
栈区 :当方法被执行时,方法体内的局部变量都在栈上创建,并在方法执行结束时这些局部变量所持有的内存将会自动被释放。因为栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
堆区 : 又称动态内存分配,通常就是指在程序运行时直接 new 出来的内存。这部分内存在不使用时将会由 Java 垃圾回收器来负责回收。
注意,如果在一个方法中定义了一个引用型变量,例如String s=new String();引用s被存放在栈中,而s指向的是new String()在堆中的地址。
对象的引用。
引用指的是对象的代表,例如String s,这里的s就是引用,将它和String对象关联起来,String s=new String();
别名现象(将一个引用赋值给另一个引用)
Tank t1=new Tank();
t1.a=6;
Tank t2=new Tank();
t2.a=12
t1=t2;
t1.a=27;
这时 t2.a也会变成27,因为将t1被赋予了t2的引用,他们两个指向相同的tank对象.
别名现象只有在对象和对象之间“相等”时,才会出现。
equals和==
在很多面试情况下都会被问到
1.其实在java的基类Object类中的equals方法就是用 ==做判断来比较两个值是否相等,基本类型同样也是用 ==来进行判断的。
2.而在引用类型中,大多都重写了equals方法,所以
equals比较的是对象的内容是否相同,而==比较的是对象的内存地址是否相等
短路现象。
(1<2)&&(3>2)当编译器发现整个表达试有一部分已经为false时,不会执行后面多余的表达式。
return
一方面指定方法返回一个什么值,另一方面会让当前方法执行到return时退出方法。
重载
方法的返回值相同,方法名相同,参数不同的方法,相互为重载方法。
this关键字。
this只能在方法内部使用,表示调用方法的那个对象的引用。
static
声明常亮和静态方法,静态方法内部不能调用非静态的方法,
初始化的顺序
1.变量的初始化优先于方法,包括构造器
2.先静态对象后非静态对象。
3.静态语句块在类加载时已经执行了,静态量在被赋值时已经就初始化了,并存储在静态内存块中。
可变参数 int...f
一个方法的参数是可变参数可以不传值。