标签(空格分隔): AgainThinkingInJava
挑出几个似乎已经忘记了的点
- this关键字
- static关键字
- 清理:终结处理和垃圾回收 finalize()
- 垃圾回收器怎么工作
- 对象创建过程
- 枚举类型还有方法
this关键字
this关键字只能在方法中使用,表示对“调用方法的对象的引用”
this在表示引用的时候和其他使用对象引用并无不同,注意在方法内部调用同一个类的另一个方法就不必使用this.直接调用就可以了。
Talk is cheap,show me the code
public class EmptyTest {
private int i = 5;
public void test() {
this.i = 10;
}
public static void main(String[] args) {
EmptyTest e = new EmptyTest();
System.out.println(e.i);
e.test();
System.out.println(e.i);
EmptyTest ee = new EmptyTest();
System.out.println(ee.i);
}
}
输出结果:
5
10
5
这段代码生动形象的解释了this表示对调用方法的对象的引用,这里调用方法的对象指的就是e,调用了一下test()方法,因此此时test()方法内部的this就是e这个对象的引用。于是乎他的i值被修改了。
Talk is cheap,show me the code
public class EmptyTest {
private int i = 5;
public void test() {
this.i = 10;
print();//使用
this.print();//不使用
}
public void print() {
System.out.println(i);
}
public static void main(String[] args) {
EmptyTest e = new EmptyTest();
e.test();
}
}
输出结果:
10
10
这段代码就是说的在同一个类中的方法,方法A调用方法B时,可是使用this,但是一般不这样用。因为当前方法中的this会自动应用于同一类中的其他方法,一般都是使用第一种,
this关键字对于将对象传递给其他方法也很有用
这里要说明的是其他类的其他方法,同一类的方法之间使用除了其他类的对象,不存在什么对象传递。但是真的存在对象传递,就不会使用this了,因此这个场合是在不同类的不同方法之间的对象传递。
在构造器中调用构造器
只能在构造方法中这样使用,在其他任何场合中调用构造方法都是非法的
Talk is cheap,show me the code
public class EmptyTest {
private String string;
public EmptyTest() {
System.out.println("这是没有参数的构造方法");
}
public EmptyTest(String str) {
// TODO Auto-generated constructor stub
this();
string = str;
System.out.println("这是只有一个参数的构造方法");
}
public EmptyTest(String str, String str1) {
// TODO Auto-generated constructor stub
this(str);
System.out.println("Str1:" + str1);
System.out.println("这是有两个参数的构造方法");
}
public static void main(String[] args) {
EmptyTest e = new EmptyTest("what", "when");
System.out.println("最终的实例变量值:" + e.string);
}
}
输出结果:
这是没有参数的构造方法
这是只有一个参数的构造方法
Str1:when
这是有两个参数的构造方法
最终的实例变量值:what
整个调用的过程也是在栈中进行的。
方法调用和局部变量都是在栈中。当调用一个方法时,该方法会放在调用栈的栈顶。具体比较生动讲解生存空间的内容在HeadFirstJava的P236-P237.
static关键字
当声明一个事物为static时,意味着这个域或方法不会与包含它的那个类的对象实例关联在一起。所以即使没有创建对象,也可以调用其static方法和static域。
资料对于static域的解释还是一致的,就是是这个类对象实例共同拥有的,不是某一个对象私有。
static方法就有很多要注意的问题了。
- 首先,static方法经常是通过类名来调用的。比如我们的Math类的很多方法。
- 注意的是static方法是不能调用非静态的方法和数据的。
这里解释一下为什么静态方法不能调用非静态的方法和数据?
既然静态方法不是通过实例关联来调用,那么就没有this引用这个说法,因为你对象都没有怎么会有引用。没有电视机,遥控器是没有任何用处的。既然静态方法都没有this关键字,那就不能自如的调用非静态方法。因为就算在同一个类中方法之间互相调用都会自动补上一个this.没有this怎么补?关于静态域,非静态变量是不共享的,与实例变量相关联,但是静态方法有的时候是通过类名称来调用,根本就不会知道可以使用哪个实例变量值(非静态域/数据)。就好像情景:如果你在静态方法中使用实例变量,编译器会认为“我不知道你说的是哪一个实例变量”静态的方法是不知倒堆上有哪些实例的——部分语句来自HeadFirstJava
有些类带有很多的静态方法,通常是不打算要被初始化的。比如Math类,只能通过类名来进行调用
。在有些测试的例子中也会写很多的静态方法来写一些过程操作。
清理:终结处理和垃圾回收 finalize()
这个说实话,两三页的内容是真没有看懂这个东西。
只能靠猜,是说的我们在新建一个对象,但是没有给引用的时候是怎么处理的。有的资料是说的,这种的无引用对象只能是等死。但是没有说具体的死的过程,这个方法大致就是解决这种问题的。一直在和C++的析构对比,老实说真是,。,。万一没学过C++岂不是早就扔书了。因此要说的是:C++中new出来的对象都要delete才能释放空间
垃圾回收器怎么工作
- 有系统是使用引用计数器,每个对象都有一个引用计数器,垃圾回收器会在堆上的所有对象上遍历,引用计数器为零的对象,并处以死刑。Java并没有使用这种机制
- Java使用的是一种自适应的垃圾回收机制。典型的做法就是停止-复制。当空间不够用了,程序停止运行,把没有引用的对象标记好。有引用的对象复制到另一块,没有引用的对象在的一块就被剿灭。
- 还有很多附加技术。即时编译器技术
对象创建过程
以前不知道就认为要创建对象就是需要那么的一种形式,实际上这个动作包含很多的东西尼。
这个,构造方式实际上也是静态方法。
枚举类型还有方法
把枚举类型当成一个类,成员方法
- toString(),显示某个实例的名字
- ordinal(),表示某个常量在enum中的声明所在的顺序
- values(),按照声明的顺序产生这些常量值构成的数组
枚举常和switch一起使用