Thinking in java 16/3/8
未完待续:最后更新16/3/8 22:25
初始化:
构造器:和c++类似,每个类编写时都需要一个initialize()方法,创建对象时,如果没有构造器,java就会给对象调用相应的构造器
构造器的名字与类名相同;
构造器可以看作一个给类的对象初始化的函数,但是构造器有与函数(方法)大不相同
相同点:
存在重载(overloading)
{
重载:使用同个函数名,通过参数列表不同,执行不同的函数体内部
类中构造器和方法都存在函数重载
}
不同点:
构造器不存在返回值,没有返回值的意思是本身就不存在返回值,与void有本质不同,void只是返回一个空值,逻辑上也存在返回值
重点:
{
Tree t = new Tree();
前一个Tree指类名,后一个Tree()指Tree类中的无参构造器,
new Tree()虽然返回一个Tree类对象的引用,但是Tree()这个构造器并没有返回任何值
其中的t指的的是生成一个Tree类对象的引用,所以在函数传递中,f(Tree t),其实也是复制一个对象引用,在f()中改变对象,也会引起原来的改变
可以猜测,在java中所有对类对象的操作本质上都是通过类引用进行的
}
this关键字:
this关键字只能在方法内部使用,表示“调用方法的那个对象”,同一个类调用其他的方法不需要加this,可以通过return this返回对当前对象的引用
通过对this的(显示或者隐示)引用,可以在方法内部使用本身的其他方法或者基本类型
比如void f2(){f1(),return this};
假设f1(),f2()都是类Tree的方法,f2()的定义中,f2()参数表隐式调用了本身,(Tree t'的引用,但new Ttee()生成一个确定对象,t'的引用也就有了意义),
在f2()内调用this.f1()可以直接省略this.f1(),当然如果存在相同的标识符,this.不能省略,明确变量
this另一个重要的作用:
在构造器中调用构造器:
通过给在一个构造器中this参数表来调用另个构造器,本质上是对构造器初始化的细化,每个构造器初始化一部分分段(变量)
注意点:
尽管可以在一个构造器中通过this调用另一个构造器,但是一个构造器只能调用一次其他的构造器,也就是this只能使用一次,虽然可以迭代下去调用
this要写在构造器最前面,不然对造成编译错误 by Thinking in java page 86
重新思考static
这时候我们明白了非static方法还是字段都是通过对象具体生成也有意义的,this是非静态类成员的载体,通过this.可以调用this内部的成员
而static成员并不依靠某个具体的对象存在,不需要具体对象的生成,就可以通过类名.来调用非静态类成员,static方法内部不能调用非静态类,反过来倒是可以,
因为如果没有具体对象生成,static调用的非静态类没有意义,我们直接通过类名调用static方法也就违法了
思考:static方法是不是更像一个全局函数而"非一个对面对象"?