标签:
构造器与方法:
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