关键词: this与super; 构造方法的多态与继承;
this 指代当前对象,主要应用场合:
在一些容易混淆的场合,如成员方法的参数名与数据成员同名;成员方法的局部变量名与数据成员同名。this(参数)——引用重载的构造方法(见后节)this指带对象。super访问当前类的直接父类,主要应用场合:
子类的数据成员或成员方法与父类的数据成员或成员方法名字相同时,当要调用父类的同名方法或同名数据成员时则可用super来指明。即super.数据成员;super.成员方法super(参数)//调用父类构造函数 class A { int x=4;int y=1; public void Printme() { System.out.println("x="+x+" y="+y); System.out.println("class name: "+getClass().getName()); } } public class AA extends A { int x; public void Printme() { int z=super.x+6; super.x = 5; super.Printme(); System.out.println("I am an "+getClass().getName()); x=6; System.out.println("z="+z+" x="+x+" super.x="+super.x+" y="+y+" super.y="+y);} public static void main(String arg[]) { int k; A p1=new A(); AA p2=new AA(); p1.Printme(); p2.Printme();} } //----------------- output: x=4 y=1 class name: A x=5 y=1 class name: AA I am an AA z=10 x=6 super.x=5 y=1 super.y=1 子类和父类定义了同名数据成员,子类继承了父类的x,自己又定义了一个x,则会发生父类数据成员的隐藏。在子类中用的x都是子类自己的,若要使用父类x,则必须用super.x。子类在覆盖父类方法的同时,调用父类的super.Printme(),这个方法中的成员变量均为父类的成员变量。super.Printme()中的代码虽然调用父类代码,但其中的this指的是子类对象。构造方法的多态:重载和覆盖 一个类的若干个重载的构造方法之间可以相互调用。当一个构造方法需要调用另一个构造方法时,可以使用关键字this,同时这个调用语句应该是整个构造方法的第一个可执行语句。
使用关键字this来调用同类的其它构造方法,优点同样是以最大限度地提高对已有代码的利用程度,减少程序的维护工作量。
构造方法的继承遵循以下的原则:
父类构造方法,子类可以在自己的构造方法中使用super来调用,但必须是子类构造方法的第一个可执行语句。若子类构造方法中没有显式调用父类构造方法,也没有用this调用重载的其它构造方法,则在产生子类的对象时,系统在调用子类构造方法的同时,默认调用父类无参构造方法。若子类构造方法中显式调用了父类构造方法,或使用了this,则不会默认调用父类无参构造方法。综上两点:子类的构造方法必定调用父类的构造方法。如果不显式用super方法,必然隐含调用super()。1.为对象分配内存空间,对成员变量进行默认的初始化
成员变量初始值byte,short,int0long0Lfloat0.0Fdouble0.0DChar‘\u0000’booleanfalse所有引用声明NULL注:局部变量必须进行显示初始化。 2.绑定构造方法,将new中的参数传递给构造方法的形式参数。 3.调用this或super语句(二者必居其一,不能同时存在),有了this, 则第四步被省略,但有了super则不省略。 4.进行实例变量的显式初始化操作, 如:
public class A{ int value=4; //显式初始化 B b = new B(); //显式初始化,注:B为一另一个类 }5.执行当前构造方法的方法体中的程序代码。如果本类是applet,则init()方法在构造方法调用后执行。
class Pare { int i =3; Pare(){} } class Construct extends Pare { int i=8; Construct(){} Construct(int num){this();} int getSuper(){return super.i;}; public static void main(String[] args) { Construct ct = new Construct(9); System.out.println(ct.i); System.out.println(ct.getSuper()); } } class Construct { int i=1; Construct(int num,int i) { this.i=i;} public static void main(String[] args) { Construct ct=new Construct(2,3); System.out.println(ct.i); } }visitor tracker
