第五章 初始化与清理

标签(空格分隔): 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一起使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值