码迷,mamicode.com
首页 > 其他好文 > 详细

第五章:初始化与清理

时间:2015-10-24 01:34:19      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:

构造器与方法:

1. 若要创建对象,就必须调用相应的构造器,保证了对象的初始化。

2. java中,初始化和创建是捆绑在一起的,两者不能分离。

3. 构造器没有返回值。

4. 方法的参数顺序不同也可以产生重载,但是不建议这样做。

5. 如果传入给方法的参数类型小于方法声明的参数类型,实际数据类型就会向上转型。如果传入方法的参数类型大于方法声明的参数类型,就必须强制类型转换,否则编译器报错。

6. 如果类中没有定义构造器方法,系统就会帮你自动创建一个默认的构造器。

7. 构造器是隐式的static方法。

 

this关键字:

1. this表示一个对象引用→调用这个方法的对象引用,所以this只能在方法内部使用。

2. 如果在方法内部调用同一个类的另一个方法,就不必使用this,直接调用即可。

1 public Class Apricot {
2     void pick() { /* ... */};
3     void pit() { pick(); /* ... */}    
4 }

3.page85有一个很有意思的例子,快被绕晕了。

 1 class Person {
 2     public void eat(Apple apple) {
 3         Apple peeled = apple.getPeeled();
 4         System.out.println("Yummy");
 5     }
 6 }
 7 
 8 class Peeler {
 9     static Apple peel(Apple apple) {
10         return apple;
11     }
12 }
13 
14 class Apple {
15     Apple getPeeled() { return Peeler.peel(this); }
16 }
17 
18 public class PassingThis {
19     public static void main(String[] args) {
20         new Person().eat(new Apple());
21     }
22 }

Apple将自身传递给外部Peeler的peel()方法,所以必须使用this关键字

4.只能在构造器中用this来调用构造器;在一个构造器中只能调用一次构造器,并且语句必须是第一句。

 1 public class Flower {
 2     int petalCount = 0;
 3     String s = "initial value";
 4     Flower(int petals) {
 5         petalCount = petals;
 6         System.out.println("Constructor w/ int arg only, petalCount= " + petalCount);
 7     }
 8     Flower(String ss) {
 9         System.out.println("Constructor w/ String arg only, s = " + ss);
10         s = ss;
11     }
12     Flower(String s, int petals) {
13         this(petals);    //调用Flower(int petal)
14         this.s = s;      //常用的手法,将同名的局部变量赋给类的域时可以使用this关键字
15         System.out.println("String & int args");
16     }
17     Flower() {
18         this("hi", 47);  //调用Flower(String s, int petals)
19         System.out.println("default constructor (no args)");
20     }
21     void printPetalCount() {
22         System.out.println("petalCount = " + petalCount + " s = " + s);
23     }
24     public static void main(String[] args) {
25         Flower x = new Flower();
26         x.printPetalCount();
27     }
28 }

 

static 关键字:

1. static方法是没有this的方法。

2. 在static方法内部不能调用非静态方法,反过来在非静态方法中却可以调用静态方法。

3. 可以在没有创建对象的前提下,仅仅通过类本身来调用static方法。

4. static方法不是面向对象的,因为static方法不属于任何对象,只属于类。

 

java垃圾回收:

1. java的垃圾回收器只知道回收通过new分配的内存,如果对象(并非使用new)获取了一块“特殊”的内存,java回收器就无法自动回收。(可以通过finalize()方法)

2. 垃圾回收器准备释放内存时,会先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正的释放对象占用的内存。

    即finalize()方法被调用的前提是启动了垃圾回收。

3. finalize()仅适用于:通过某种创建对象方式之外的方式为对象分配了存储空间。

4. java不允许创建局部对象,必须使用new创建对象。(此句话不理解,C++相关)

5. 无论是“垃圾回收”还是“终结”,JVM并未面临内存耗尽的情形,它是不会浪费时间去执行的。

 1 class Book {
 2     boolean checkedOut = false;  //checkedOut: Book是否被打开
 3     Book(boolean checkOut) {
 4         checkedOut = checkOut;
 5     }
 6     void checkIn() {             //Book对象被回收前都应该checkIn
 7         checkedOut = false;
 8     }
 9 
10     //创建终结条件:即checkedOut为true时
11     protected void finalize() {
12         if(checkedOut)       
13             System.out.println("Error: checked out");  //通常会调用super.finalize()
14     }
15 }
16 
17 public class TerminationCondition {
18     public static void main(String[] args) {
19         Book novel = new Book(true);
20         novel.checkIn();   //novel checkIn了,属于正常情况
21         
22         new Book(true);    //new Book(true)未checkIn,触发了终结条件
23         System.gc();       //强制进行终结条件finalize(),无需等待内存耗尽。此时就会打印Error
24     }
25 }

 

初始化:

1. 方法中的变量未初始化便进行使用时会报错,但是类的数据成员在声明时便会赋予一个初始值(int是0,char是0,对象引用是null等)。

2. 静态域的初始化:

    1) 静态域只初始化一次

    2)静态域初始化只在加载这个类时才会进行

    3)静态域初始化在普通初始化之前进行

    4)要执行man方法,就必须先加载其类,此时static域便初始化了

3. 一个对象的创建过程(不包含继承)

    创建类型→java解释器定位class文件→载入class,静态初始化→分配内存,给对象默认值→执行字段定义处的初始化→执行构造器方法

4. 显示的静态初始化

1 public class Spoon {
2     static int i;
3     static {
4         i = 47;    //静态块
5     }
6 }

5. 非静态实例初始化

public class Mugs {
    Mug mug1;
    Mug mug2;
    {
        mug1 = new Mug(1);         //实例域初始化块
        mug2 = new Mug(2);
        System.out.println("mug1 & mug2 initialized");
    }    
}

6. int[] a1; 声明数组,a1仅仅是对int[]数组的引用,声明时a1分配了内存,但是int[]并没有分配内存空间。 

    访问超出数组边界时,C/C++会默默接受,但是java会出现异常。

7. 数组的创建是在运行时刻进行的

    int[] a;          //此时未创建数组

    a = new()      //此时才会创建数组

第五章:初始化与清理

标签:

原文地址:http://www.cnblogs.com/momooy/p/4906047.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!