this 与super

关键字this 和super分别用来指明子类和父类中同名的成员变量或成员方法。

当父类的成员变量、子类的成员变量和类中方法使用的局部变量三者同名，或其中的两者同名时，可以使用关键字this和super来指定所要使用的变量。如用this和super区别同名的变量：

1.

2. class A{

3. int x； // 类A中声明了成员变量x

4. ………………… ;

5. }

6. class B extends A { // 类B继承类A，也继承了类A的成员变量x

7. int x; // 类B中又声明了成员变量x

8. ………………………… ;

9. void m()

10. {

11. int x; // 方法m声明了自己的局部变量x

12. …………

13. super.x=2; // super.x是其所在类的父类即类A的x

14. this.x=1; // this.x 是其所在类即类B的x

15. x=100; // x是方法本身的局部变量x

16. …………

17. }

18. }

在同一个范围或一个封装范围内，定义二个重名的局部变量在Java中是不合法的。有趣的是，局部变量，包括传递到方法的正式的自变量，可以与类的实例变量的名字重叠。在这种情况下，局部变量名就隐藏(hide)了实例变量名。这就是在Box类中，width、 height、depth没有作为Box()构造函数自变量名字的原因。

如果它们是，那么width将正式的引用自变量，而隐蔽实例变量width。由于通常简单地使用不同的名字更容易，对这种状况还有其它的解决办法。因为this可以直接引用对象，能用它来解决可能在实例变量和局部变量之间发生的任何同名的冲突。

#### 1. this是指当前对象自己

当在一个类中要明确指出使用对象自己的的变量或函数时就应该加上this引用。如下面这个例子中:

1. public class A {

2.

3. String s = "Hello";

4.

5. public A(String s) {

6. System.out.println("s = " + s);

7. System.out.println("1 -> this.s = " + this.s);

8. this.s = s;

9. System.out.println("2 -> this.s = " + this.s);

10. }

11.

12. public static void main(String[] args) {

13. new A("HelloWorld!");

14. }

15. }

运行结果：

s = HelloWorld!

1 -> this.s = Hello

2 -> this.s = HelloWorld!

在这个例子中，构造函数A中，参数s与类A的变量s同名，这时如果直接对s进行操作则是对参数s进行操作。若要对类A的变量s进行操作就应该用this进行引用。运行结果的第一行就是直接对参数s进行打印结果；后面两行分别是对对象A的变量s进行操作前后的打印结果。

#### 2. 把this作为参数传递

当你要把自己作为参数传递给别的对象时，也可以用this。如：

1. public class A {

2. public A() {

3. new B(this).print();

4. }

5.

6. public void print() {

7. System.out.println("Hello from A!");

8. }

9. }

10.

11. public class B {

12. A a;

13. public B(A a) {

14. this.a = a;

15. }

16.

17. public void print() {

18. a.print();

19. System.out.println("Hello from B!");

20. }

21. }

运行结果：

Hello from A!

Hello from B!

在这个例子中，对象A的构造函数中，用new B(this)把对象A自己作为参数传递给了对象B的构造函数。