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