三. 初始化和清理

1. 利用构造器保证初始化

在Java中,类的设计者通过构造器保证每个对象的初始化。有了构造器,那么Java会在用户使用对象之前(即对象刚创建完成)自动调用对象的构造器方法,从而保证初始化。Java中使用了与C++相同的方式:构造器名称与类名相同。如果类中没有定义任何构造器,编译器会自动生成默认的无参构造器

注意:构造器没有返回值,却同时也没有给你选择的余地(new表达式虽然返回了刚创建的对象的引用,但构造器本身却没有返回任何值)。如果它有返回值,并且可以自己选择让它返回什么,那么编译器就还得知道接下来该怎么处理那个返回值(这个返回值没有接收者)。

2. 方法重载

在Java (C++)中,由于构造器方法名必须与类名相同,所以一个类中只会有一个构造器名。为了能通过不同的方式创建一个对象,此时就需要引入重载。

特点:方法具有相同的方法名但接收的参数不同

3. this关键字

this关键字只能在非静态方法内部使用。当你调用一个对象的方法时,this生成了一个对象引用。在方法内部,用this可以获得对当前对象的引用。

在构造器中调用构造器

当在一个类中写了多个构造器,有时想在一个构造器中调用另一个构造器来避免代码重复,可以通过this关键字实现。

通常this表示"当前对象",它本身生成对当前对象的引用。当在一个构造器中,给this一个参数列表时,它表示另一层意思,可以通过这样最直接的方式显式地调用匹配参数列表的构造器。

static的含义

static方法中不会存在this。不能在静态方法中调用非静态方法(反之可以)。静态方法是为类而创建的,不需要任何对象,这就是静态方法的主要目的,静态方法看起来就像全局方法一样,但是Java中不允许全局方法,一个类中的静态方法可以被其他的静态方法和静态属性访问。

注意:一般来说,如果发现代码中出现了大量的static方法,就该重新考虑代码的设计了。

4. 成员初始化

Java尽量保证所有变量在使用前都能得到恰当的初始化。如果类的成员变量是基本类型,那么都会有一个对应初始值。而当在类里定义一个对象引用时,如果不将其初始化,那么引用就会被赋值为null。对于方法的局部变量,这种保证会以编译时错误的方式呈现,如:

class Test {
    String s;
    public static void main(String[] args) {
        Test t = new Test();
        System.out.println(t.s);
    }
}

输出结果为:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i6t9lCy1-1595233027957)(C:\Users\13615\AppData\Roaming\Typora\typora-user-images\image-20200720160405279.png)]

5. 静态数据的初始化

无论创建多少个对象,静态数据都只占用一份存储区域。static关键字不能应用于局部变量,只能作用于属性(字段、域)。如果一个字段是静态的基本类型,并且没有初始化,那么它就会获得基本类型的标准初值。如果它是对象引用,那么它的默认初值就是null。

注意:静态初始化只会执行一次

6. 非静态实例初始化

class Mug {
    Mug(int marker) {
    	System.out.println("Mug(" + marker + ")");
    }
}

public class Mugs {
    Mug mug1;
    Mug mug2;
    {
        mug1 = new Mug(1);
        mug2 = new Mug(2);
        System.out.println("mug1 & mug2 initialized");
    }

    Mugs() {
    	System.out.println("Mugs()");
    }

    Mugs(int i) {
    	System.out.println("Mugs(int)");
    }

	public static void main(String[] args) {
		new Mugs();
	}
}

输出结果为:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PEEu6nVZ-1595233027959)(C:\Users\13615\AppData\Roaming\Typora\typora-user-images\image-20200720160417430.png)]](https://img-blog.csdnimg.cn/2020072016184020.png

这种语法对于支持"匿名内部类"的初始化是必须的,但是也可以使用它保证某些操作一定会发生,而不管哪个构造器被调用。从输出看到,实例初始化子句是在两个构造器之前执行的。

7. 枚举类型

Java 5中添加了一个enum关键字,它使得我们在需要群组并使用枚举类型集时,可以很方便地处理。以前,你需要创建一个整数常量集,但是这些值并不会将自身限制在这个常量集的范围内,因此使用它们更有风险,而且更难使用。枚举类型属于非常普遍的需求,C、C++ 和其他许多语言都已经拥有它了。语法如下:

public enum Seasons {
	SPRING, SUMMER, AUTUMN, WINTER
}

枚举类型的实例是常量,因此按照命名惯例,它们都用大写字母表示。使用时代码如下:

class Test {
    public static void main(String[] args) {
        System.out.println(Seasons.SPRING);

        Seasons season = Seasons.SPRING;
        System.out.println(season);
    }
}

输出结果:
在这里插入图片描述
enum是类,并且具有自己的方法。

参考资料:On Java 8

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值