方法重载:
1. 当创建一个对象时,也就给此对象分配到的存储空间取一个名字。所谓方法则是给某个动作取的名字。通过使用名字,你可以引用所有的对象和方法
2.每个重载的方法都必须有一个独一无二的参数类型列表。参数顺序的不同也足以区分两个方法。不过一般情况下别这么做,因为这会使代码难以维护。
3.涉及基本类型的重载:
如果传入的数据类型(实际参数类型)小于方法中声明的形式参数类型,实际数据类型就会被提升。char型略有不同,如果无法找到恰好接受char参数的方法,就会把char直接提升到int型
如果传入的实际参数较大,就得通过类型转换来执行窄化转换。如果不这样做,编译器就会报错 f1((float)x)
this关键字:
1.this关键字只能在方法内部使用,表示对”调用方法的那个对象“的引用。this的用法和其他对象引用并无不同。
清理:终结处理和垃圾回收
1.假定你的对象(并非使用new)获得了一块”特殊"的内存区域,由于垃圾回收器只知道释放那些经由new分配的内存,所以它不知道该如何释放改对象的这块“特殊"内存。
2.用finalize(),就能在垃圾回收时刻做一些重要的清理工作。例如:java调用C的代码
垃圾回收如何工作
1.Java虚拟机中,堆的实现截然不同:它更像一个传送带,每分配一个新对象,它就往前移动一格。这意味着对象存储空间的分配速度非常快。Java的”堆指针“只是简单地移动到尚未分配的区域,其效率比得上C++在堆栈上分配空间的效率。
构造器初始化
1.初始化顺序: 在类的内部,变量定义的先后顺序决定了初始化的顺序。即使变量定义散布于方法定义之间,它们仍旧会在任何方法(包括构造器)被调用之前得到初始化。例如
class Window {
Window(int marker){
print("Window(" + marker + ")");
}
}
class House {
Window w1 = new Window(1); //Before constructor
House() {
//Show that we're in the constructor:
print("House()");
w3 = new Window(33); //Reinitialize w2
}
Window w2 = new Window(2); //After constructor
void f() {
print("f()");
}
Window w3 = new Window(3); //At end
}
public class OrderOfInitialization {
public static void main(String[] args) {
House h = new House();
h.f();
}
}
/*Output:
Window(1)
Window(2)
Window(3)
House()
Window(33)
f()
*/
静态数据的初始化
无论创建多少个对象,静态数据都只占用一份存储区域。static关键字不能应用于局部变量,因此它只能作用于域。如果一个域是静态的基本类型域,且也没有对它进行初始化,那么它就会获得基本类型的标准初值;如果它是一个对象引用,那么它的初始值就是null
public class StaticInitialization {
public static void main(String[] args) {
print("Createint new Cupboard() in main");
new Cupboard();
print("Createing new Cupboard() in main");
new Cupboard();
table.f2(1);
cupboard.f3(1);
}
static Table table = new Table();
static Cupboard cupboard = new Cupboard();
}
class Bowl {
Bowl(int marker) {
print("Bowl(" + marker + ")");
}
void f1(int marker) {
print("f1(" + marker + ")");
}
}
class Table {
static Bowl bowl1 = new Bowl(1);
Table(){
print("Table()");
bowl2.f1(1);
}
void f2(int marker) {
print("f2(" + marker + ")");
}
static Bowl bowl2 = new Bowl(2);
}
class Cupboard {
Bowl bowl3 = new Bowl(3);
static Bowl bowl4 = new Bowl(4);
Cupboard() {
print("Cupboard()");
bowl4.f1(2);
}
void f3(int marker) {
print("f3(" + marker + ")");
}
static Bowl bowl5 = new Bowl(5);
}
/*
Bowl(1)
Bowl(2)
Table()
f1(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
f1(2)
Createing new Cupboard() in
Bowl(3)
Cupboard()
f1(2)
Creatint new Cupboard() in
Bowl(3)
Cupboard()
f1(2)
f2(1)
f3(1)
*/
显式的静态化初始化
Java