《Thinking In Java》学习笔记:第5章 初始化与清理

来源:互联网 发布:股票行情分析软件下载 编辑:程序博客网 时间:2024/05/14 03:45

默认构造器(无参构造器)
如果你没有自己编写构造器,编译器会默认一个无参构造器。但是,如果你已经定义了自己的构造器,编译器就不会帮你自动创建构造器。

this关键字
对当前对象的引用,只能在方法内部使用,表示对“调用方法的那个对象”的引用,与其他对象引用方式并无不同。

static关键字
static方法内部不能调用非静态方法(编译器怎么知道是哪个对象在调用非静态方法?),反过来却可以。

成员初始化
不像其他语言(比如C),Java尽量保证所有变量在使用前都能得到恰当的初始化。
对于方法中的局部变量,Java以编译错误的形式保证其必须被初始化。
对于类的成员变量,如果是基本类型,Java会保证给他们初值;如果是对象引用,Java会自动赋值为null。
同时,Java可以在定义的时候直接为成员变量赋初值(C++中不能)。

初始化顺序
在类内部,成员变量定义的先后顺序决定其初始化顺序,所有成员变量的都会在构造器调用之前得到初始化。对于未初始化的static变量,编译器将赋予默认初值。初始化的顺序是先静态成员初始化,后非静态成员初始化。

显示的静态初始化:

public class Spoon {      static int i;      static {          i = 47;      }  }

相比之下,非静态成员也可以这样操作:

public class Mugs {      Mug mug1;      Mug mug2;      {          mug1 = new Mug(1);          mug2 = new Mug(2);      }  }

可变参数列表

public class NewVarArgs {    static void printArray(Object... args) {        for(Object obj : args)            System.out.print(obj + " ");        System.out.println();    }    public static void main(String[] args) {        // Can take individual elements:        printArray(new Integer(47), new Float(3.14), new Double(11.11));        printArray(47, 3.14F, 11.11);        printArray("one", "two", "three");        printArray(new A(), new A(), new A());        // Or an array:        printArray((Object[])new Integer[]{ 1, 2, 3, 4 });        printArray(); // Empty list is OK    }}

有了可变参数,就再也不用显式地编写数组语法了。当然,编译器事实上会将你传入的参数转成数组。如果你已经传入了一个数组作为参数,编译器会发现它已经是一个数组,因此不会进行任何转换。同时,可变参数允许用户传入0个参数。然而,如果出现以下情况:

static void f(Integer... args) {}static void f(String... args) {}

在上述情况下,如果执行 f( ),程序将无所适从。

0 0