#Thinking in Java阅读笔记# 第五章 初始化与清理

5.1 用构造器确保初始化

构造器是一个特殊的函数,函数名与类名相同,且无返回类型。使用new关键字调用构造器可创建对象并初始化。构造器分为无参构造器和有参构造器

5.2 方法重载

方法拥有相同名字但不同的参数会进行重载,参数列表一定要是独一无二的,不可以根据返回值来区分重载方法。
当方法接受较小的基本类型作为实参、而形成是较大基本类型时,实参会被自动提升,其中char会自动提升为int
如int x = 5;print(long l);,当print(x)时,x转换为long。
当方法接受的实参时较大基本类型时,则需要对实参进行类型转换,否则就会报错
如double x = 5.0;print(int l),需要print((int)x);
这里写图片描述

5.3 默认构造器

如果类没有给出构造器,则编译器会给出一个默认构造器(无参构造器),如果已经有构造器,则不会提供

5.4 this关键字

this只能用于方法内部,表示调用此方法对象的引用。
用途:1.在构造器中调用构造器。

public class TestJava {
    public TestJava() {
        System.out.print("Hello!My name is ");
    }
    public TestJava(String s) {
        this();
        System.out.println(s);
    }
    public static void main(String[] args) {
        TestJava t = new TestJava("Nancy");
    }
}

注意:在一个构造器中只能调用一个构造器,而不能构造多个,且必须将调用的构造器放于初始部位。构造器的调用只能发生在构造器中。
2.在同一方法中区分同名的参数和实例变量

5.5 清理 终结处理和垃圾回收

5.6 成员初始化

1.变量(基本类型和抽象类型)的初始化发生在任何方法包括构造器被调用之前

public class TestJava {
    public static void main(String[] args) {
        start t = new start();
    }
}
class printW{
    public printW(int i) {
        System.out.println("printW("+i+")");
    }
}
class start{
    printW w1 = new printW(1);
    public start() {
        System.out.println("start()");
        printW w3 = new printW(33);
    }
    printW w2 = new printW(2);
    printW w3 = new printW(3);
}

输出结果为:
printW(1)
printW(2)
printW(3)
start()
printW(33)

2.数组初始化
所有数组有一个固定成员length,表示数组的长度。
new不能创建单个基本类型数据,但是可以创建单个对象
对于非基本类型数组,首先创建一个引用数组,然后逐个对引用元素匹配对象

Integer[] a = new Integer(20);//创建引用数组
for(int i = 0;i < a.length;i++)
    a[i] = new Integer[i];//匹配对象

创建非基本类型数组另两种方法:

Integer[] a = {new Integer(1),new Integer(2),new Integer(3)};
String[] b = new String[]{"Hello","World","!"};

3.可变参数列表
用于参数个数和类型位置的场合(如以Object[]为方法参数)

public class TestJava {
    static void print(Object[] array) {
        for(Object i:array)
            System.out.print(" "+i);
        System.out.println();
    }
    public static void  main(String[] args) {
        print(new Object[]{new Integer(3),new Double(4.1),new Integer(2)});
        print(new Object[] {"Hello","World",new Integer(2017)});
        print(new Object[] {new A(),new A()});
    }
}
class A{}
输出为:
 3 4.1 2
 Hello World 2017
 A@15db9742 A@6d06d69c//直接打印对象是类名+@+地址

在Java SE5以后,出现了可变参数列表,从而不用显示的编写数组了
(Object… args) == (Object[] args)

public class TestJava {
    static void print(Object... array) {
        for(Object i:array)
            System.out.print(" "+i);
        System.out.println();
    }
    public static void  main(String[] args) {
        print(new Integer(3),new Double(4.1),new Integer(2));
        print("Hello","World",new Integer(2017));
        print();//传递参数可以为空
    }
}
class A{}

实质还是与上一种情况相同,只是编译器代替填充数组。
可变参数列表可以使用任何类型的参数,包括基本参数类型

5.9 枚举(enum)

public class TestJava {
    public enum Spiciness{
        NOT,MILD,MEDIUM,HOT
    }
    public static void main(String[] args) {
        for(Spiciness s:Spiciness.values()) {
            System.out.println(s+",ordinal "+s.ordinal());
        }
    }
}
输出:
NOT,ordinal 0
MILD,ordinal 1
MEDIUM,ordinal 2
HOT,ordinal 3

其中枚举量中自带toString()方法,values()用来生成枚举量数组,ordinal()用来给出枚举量顺序对应的值

猜你喜欢

转载自blog.csdn.net/zhou373986278/article/details/78344572
今日推荐