Java基础-学习笔记(七)——this关键字
1、this引用句柄
this指的就是调用该方法的对象
class A { String name; public A(String x) { name=x; } public void func1() { System.out.println("my name is "+name); } public void func2() { A a2=new A("a2"); a2.func1(); this.func1();//可以去掉this,结果一致 func1(); } public static void main(String [] args) { A a1=new A("a1"); a1.func2(); } } /* F:\java_example>java A my name is a2 my name is a1 my name is a1 */
在成员方法中,对访问同类中成员前加不加this引用,效果都一样,这就好像,我们是同一个公司的成员,,彼此在提及和自己公司相关的事时,不用说出公司名一样,当然也可以显式指出我们公司怎样怎样,每个成员方法内部都有一个this引用变量,指向调用这个方法的对象。
看似this可有可无,但在有些场合中还是非常有必要的
1)我们通过构造方法将外部传入的参数赋值给类成员变量,构造方法的形参名称与类的成员变量名相同
class Person
{
String name;
public Person(String name)
{
this.name=name;
}
}
2)可作为对象进行传class Containe{
class Container
{
Component comp;
public void addComponent()
{
comp = new Component(this);
/*comp = new Component(new Container());
此种做法是不合理的,因为我想要的是,把新创建的部件归到调用这个addComponent()的Container对象中。
如果我现在又新建一个Container类,那是会把这个部件归到新创建的Container类中,
为了只对应一个Container类,我们可以用this来表示我们的对象
*/
}
}
class Component
{
Container myCon;
public Component(Container con)
{
myCon=con;
}
}
3)构造方法是产生对象时被java系统自动调用的,我们不能在程序中像调用其它函数一样来调用构造方法。但是我们可以在一个构造方法中通过this的形式调用其它重载的构造方法
class Person { String name; int age; public Person(String name) { this.name=name; } public Person(String name,int age) { this(name); this.age=age; } }
补充:关于java垃圾回收的机制
java有自动回收内存垃圾的机制,当一个对象变成垃圾,它所引用的其它对象在没有被别的有效的句柄引用的话,也会随之变成垃圾,也就是不用程序员再去做“释放对象在生存期间所占用的一些资源”这样的事。
finalize()方法是在对象被当成垃圾从内存中释放前调用,而不是在对象变成垃圾前调用,垃圾回收器的启用不由程序员控制,也无规律可循,并不是一产生垃圾它就会被唤起,因此这并不是一个很可靠的机制。
不过,java中提供了一个System.gc()方法,使用这个方法可以强制启动垃圾回收器回收垃圾。