this


- a、this构造方法调用只能放在构造函数之间调用,不能放在普通方法里使用。
- b、this在类中就是代表当前对象,可以通过this关键字完成当前对象的成员属性、成员方法和构造方法的调用。
- c、当在定义类中的方法时,如果需要调用该类对象,就可以用this来表示这个对象。也就是说,但凡在本类功能内部使用到了本类对象,都用this表示。至于代表哪个对象,就看其所在功能被哪个对象调用,这样就知道谁在参与运算。
案例分析

Ps:需要借助于this关键字调用,并且如果用this调用的是构造函数,不能放在普通方法里使用;如果调用的普通方法,则可以,甚至可以省略this关键字。
super
如何区分调用的是继承父类的方法还是子类自己重写的方法?

- 子类的构造的过程中必须调用其父类的构造方法,如果想调用父类带参的构造方法,则需要在子类构造方法第一行“super(arg0, arg1...)”。
- 如果子类的构造方法中没有显式标注,则系统系默认调用父类无参的构造方法。
- 如果子类构造方法中既没有显式标注,且父类中没有无参的构造方法(有其他构造,但没有显示标出无参构造),则编译出错。
- 使用super调用父类指定构造方法,必须在子类的构造方法的第一行。

Ps:一个构造方法中,this和super只能存在一个,因为一山不容二虎,以及它们都在抢占第一行位置,所以会CE。
案例分析

Ps:第 3 处是正确的,因为当前找不到就自动像上级去找。
附:在构造器中为什么 this 或 super 必须放在第一行?
this()和super()是你如果想用传入当前构造器中的参数或者构造器中的数据调用其他构造器或者控制父类构造器时使用的;
在一个构造器中你只能使用this()或者super()之中的一个,而且调用的位置只能在构造器的第一行;
在子类中如果你希望调用父类的构造器来初始化父类的部分,那就用合适的参数来调用super(),如果你用没有参数的super()来调用父类的构造器(同时也没有使用this()来调用其他构造器),父类缺省的构造器会被调用,如果父类没有缺省的构造器,那编译器就会报一个错误。
也就是说你必须在构造器的第一行放置super或者this构造器,否则编译器会自动地放一个空参数的super构造器的,其他的构造器也可以调用super或者this,调用成一个递归构造链,最后的结果是父类的构造器(可能有多级父类构造器)始终在子类的构造器之前执行,递归的调用父类构造器。无法执行当前的类的构造器。也就不能实例化任何对象,这个类就成为一个无为类。
从另外一面说,子类是从父类继承而来,继承了父类的属性和方法,如果在子类中先不完成父类的成员的初始化,则子类无法使用,应为在java中不允许调用没初始化的成员。在构造器中是顺序执行的,也就是说必须在第一行进行父类的初始化。而super能直接完成这个功能。This()通过调用本类中的其他构造器也能完成这个功能。
因此,this()或者super()必须放在第一行。
所以当你看到子类的构造器经过的时候,还没经过方法体就马上再去走父类构造器的时候,好像如果子类没有写super的话,就不会经过方法体,其实程序内部给他补充了一个“super()”,只是表面没经过罢了。