Java进阶之初始化与清理

初始化与清理

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构造方法
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浔汐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值