因为实在太忙这么多天来都没时间上来写东西,感觉非常对不起大家。。。
今天抓紧时间给大家说说super和this两个指针。
上一次我们说到类继承的时候,遗留了一个问题。如果我们对父级方法进行重写,然而在里面我们可能还会保留父级方法大部分的逻辑,而只是在头或尾或一头一尾做一些额外的操作(就像AOP一样)。这时候我们很希望可以直接调用父级的原方法逻辑。
怎么办?其实我们可以通过super这个指针来实现这个愿望。先看以下例子:
执行结果:
[img]http://dl.iteye.com/upload/attachment/188963/7a7af25f-5880-3137-ac1c-8c5144f2e44e.jpg[/img]
在下个例子里面,我们通过super指针调用了父级的构造函数,以及在重写的play()方法中调用了父类的play()方法。
在java初始化对象的时候,就会把方法及字段归类到一个类的super和this指针下面。它们用于区别哪些方法是来自父类的,哪些来自子类的。所以被重载的方法其实会在同一个类里面有两份执行地址段,一份是给super的,一份是给this的,然后父级的再往上的东西。而super再往上的,都不可见。这样,就能够区分开本类中的方法和来自父级的方法。
再同一个类里面调用自己的方法,默认就带有this指针。那这个this指针又有什么用?
大家可以发现在上例中,我们的ChildClass(String)构造函数有这么一段:
所以this是用于区分本类的字段和外来参数的。因为外来参数的名字没有受到同方法或者同类里面的参数不允许同名这一规则的约束,所以往往会出现外来的参数和本累的字段同名这种情况。当发生赋值时,为了区分那个是字段,哪个是外来参数,我们就会用this来区分。这种用法的经典用例如下:
这个就是Java里面著名的setter方法。
关于这部分就只能说到这里了。下次会介绍java的循环写法
今天抓紧时间给大家说说super和this两个指针。
上一次我们说到类继承的时候,遗留了一个问题。如果我们对父级方法进行重写,然而在里面我们可能还会保留父级方法大部分的逻辑,而只是在头或尾或一头一尾做一些额外的操作(就像AOP一样)。这时候我们很希望可以直接调用父级的原方法逻辑。
怎么办?其实我们可以通过super这个指针来实现这个愿望。先看以下例子:
package extendsdemo;
public class SuperThisDemo
{
public static void main(String[] args)
{
ChildClass child = new ChildClass("Car");
child.play();
}
}
class SuperClass
{
public SuperClass(String name)
{
System.out.println("I'm super constuctor with name ["+name+"]");
}
public void play()
{
System.out.println("Nothing to play with");
}
}
class ChildClass extends SuperClass
{
private String myToy;
public ChildClass(String myToy)
{
super("ChildClass");
this.myToy = myToy;
}
public void play()
{
System.out.println("I'd lost my "+myToy);
super.play();
System.out.println("What a shame! :(");
}
}
执行结果:
[img]http://dl.iteye.com/upload/attachment/188963/7a7af25f-5880-3137-ac1c-8c5144f2e44e.jpg[/img]
在下个例子里面,我们通过super指针调用了父级的构造函数,以及在重写的play()方法中调用了父类的play()方法。
在java初始化对象的时候,就会把方法及字段归类到一个类的super和this指针下面。它们用于区别哪些方法是来自父类的,哪些来自子类的。所以被重载的方法其实会在同一个类里面有两份执行地址段,一份是给super的,一份是给this的,然后父级的再往上的东西。而super再往上的,都不可见。这样,就能够区分开本类中的方法和来自父级的方法。
再同一个类里面调用自己的方法,默认就带有this指针。那这个this指针又有什么用?
大家可以发现在上例中,我们的ChildClass(String)构造函数有这么一段:
private String myToy;
public ChildClass(String myToy)
{
super("ChildClass");
this.myToy = myToy;
}
所以this是用于区分本类的字段和外来参数的。因为外来参数的名字没有受到同方法或者同类里面的参数不允许同名这一规则的约束,所以往往会出现外来的参数和本累的字段同名这种情况。当发生赋值时,为了区分那个是字段,哪个是外来参数,我们就会用this来区分。这种用法的经典用例如下:
private String field;
public void setField(String field)
{
this.field = field;
}
这个就是Java里面著名的setter方法。
关于这部分就只能说到这里了。下次会介绍java的循环写法