初始化与清理
1.自动初始化
在创建一个类时,若类中包含有未初始化的类对象的引用,则该引用会被java初始化成null,基本类型被初始化为0.
例:
package day10;
class C1{
String str;
int num;
}
public class Test3 {
public static void main(String[] args) {
C1 c1 = new C1();
if (c1.str == null && c1.num == 0) {
System.out.println("null");
}
}
}
//运行结果:
//null
2.方法(函数)重载
方法(函数)重载是依靠参数的不同,返回值不同并不能重载.即每个重载的方法(函数)都必须有一个独一无二的参数类型列表
(注意:其实参数顺序的不同也足以区分两个方法,但是这样做会使得代码难以维护,如下例子:)
package day10;
class C2 {
void test(String b,int a) {
System.out.println("test1");
}
void test(int a,String b) {
System.out.println("test2");
}
}
public class Test3 {
public static void main(String[] args) {
}
}
/*能成功重载*/
3.传参类型转换
方法传参时,如果传入的数据类型小于方法中声明的形式参数类型,实际数据类型就会被提升,如int被视为float寻找知否有参数为float的方法.(char型略有不同,会被转为int型)
例:
package day10;
class C2 {
static void test(int x){
System.out.println("test2 \t" + x);//char类型传进来以后就变成了int型,值是对应的ASCII值
}
}
public class Test3 {
public static void main(String[] args) {
C2.test('a');
}
}
//运行结果
//test2 97
如果传入的数据类型大于方法中声明的形式参数的类型,则需要手动类型强转(窄化转换),可能会有精度损失:
例:
package day10;
class C2 {
static void test(char x){
System.out.println(x);
}
}
public class Test3 {
public static void main(String[] args) {
C2.test((char)97); //不加(char)进行强转会报错: java: 不兼容的类型: 从int转换到char可能会有损失
}
}
//运行结果
//a
4.this
通过在类的内部传递this,表示对对象自身的引用.
package day10;
class Manager {
static Person changedName(Person p1){
p1.name = null;
return p1;
};
}
class Person{
String name = "zhagnsan";
Person deletedName(){
return Manager.changedName(this); //this代表了这整个对象
}
}
5.this()
如果this带了参数列表,那么this就有了不同的含义,相当于调用根据参数调用自身的构造函数,如this(参数),必须放在自身某个构造函数第一句:
package day10;
class C4 {
C4() {
System.out.println("无参构造");
}
C4(int a) {
this("aaaaa");
System.out.println("带int参构造");
}
C4(String str){
System.out.println("带String参构造");
}
}
public class Test3 {
public static void main(String[] args) {
C4 c1 = new C4(); //只调用C4()构造函数
System.out.println("-------------------分割线");
C4 c2 = new C4(23); //先进入C4(int a)构造,然后该构造函数第一句是this("aaaaa")所以要调用C4(String str)构造.
}
}
/*运行结果:
无参构造
-------------------分割线
带String参构造
带int参构造
*/
6.垃圾回收
垃圾回收并不是在对象生命周期结束时就立即调用,只要程序没有濒临内存空间不足,对象占用的空间就总得不到释放.这是因为垃圾回收本身也有开销,因此能不调用就不调用.
(垃圾回收器只知道释放那些经由new分配的内存)
7.默认初始化
无论是否使用构造器来进行初始化,默认的初始化都会进行,可以用下来这段代码来演示默认初始化的进行:
package day10;
class C5 {
int i;
C5(){
System.out.println("i 的值为:" + i); //默认初始化的值
i = 10;
System.out.println("i 的值为:" + i); //构造器初始化后的值
}
}
public class Test3 {
public static void main(String[] args) {
C5 c1 = new C5();
}
}
/*运行结果
i 的值为:0
i 的值为:10
*/
8.静态初始化
静态初始化只有在必要时候才会进行,并不是声明定义了一个static变量就会不论是否使用它立马就创建了。只有在第一次访问静态数据的时候才会被初始化。如下例子:C4类虽然定义了一个static的C2类,但不会被创建,因为没有东西使用访问它。
package day11;
class C1{
public static int i = 0;
C1(){
System.out.println("C1构造方法");
}
}
class C2{
C2(){
System.out.println("C2构造方法");
}
}
class C3{
static C1 c1;
static C2 c2 = new C2();
}
//虽然这里定义了C2并new了,但是并没有被引用(或者说被访问),所以也不会进行初始化。
class C4{
static C1 c1;
static C2 c2 = new C2();
}
public class TEST {
public static void main(String[] args){
C3 c3 = new C3();
}
}
/*运行结果:
C2构造方法
*/