一、this关键字

this是指向对象本身的一个指针。this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this。

1.调用本类的构造方法

1)说明:仅仅在类的构造函数中调用本类的其他构造函数。用法是this(参数列表),这一句必须处于构造函数的第一句,同时一个构造函数内部只能调用另一个构造函数
2)例子:

class A{
    private string name;
    public A(){
        System.out.print("无参数构造函数!");
    }
    public A(int b){
        System.out.print(b);
    }
    public A(String s){
        this(1);//调用参数为int型的构造函数
        name = s;
    }
}

2.表示类中属性和方法

1)说明:用this来访问类中的属性和方法。比如函数参数或者参数中的局部变量和成员变量同名的情况下,成员变量被屏蔽,此时要访问成员变量则需要用”this.成员变量名”来访问成员变量
2)例子:

class B{
    private int x = 1;
    public void out(){
        int x = 2;
        System.out.print(x);//打印2
        System.out.print(this.x);//打印1
    }
}

3.表示当前对象

1)说明:在函数中,需要引用该函数所属类的当前对象时候,直接使用this
2)例子:

class C{
    public static void main(String[] args){
        C c1 = new C();
        c1.tell();
    }
    public static void tell(){
        System.out.print(this);//打印当前对象的字符串表示
    }
}

4.匿名类和内部类

1)说明:在匿名类或者内部类中用this时,这个this指的是匿名类或内部类本身。这时如果我们要使用外部类的方法和变量的话,则应该加上外部类的类名。
2)例子:

public class Hello{
    int i = 1;
    public Hello(){
        Thread thread = new Thread(){//匿名类
            public void run(){
                Hello.this.run();//调用外部类的方法
            }
        };//这里有分号
    }
}

二、super关键字

super关键和this作用类似,是使被屏蔽的成员变量或者成员方法变为可见,或者说用来引用被屏蔽的成员变量和成员成员方法。不过super是用在子类中,目的是访问直接父类中被屏蔽的成员,注意是直接父类(就是类之上最近的超类)。

1.在子类构造方法中调用父类的构造方法

1)说明:用super(参数列表)的方式调用,参数不是必须的。同时,还要注意super(参数列表)这条语句只能在子类构造方法中的第一行
2)例子:

class A{
    public A(){
        System.out.print("A");
    }
}
class B extends A{
    public B(){
        super();//调用父类构造方法,打印A
        System.out.print("B");
    }
}

2.访问父类中被覆盖的同名变量或者方法

1)说明:当子类方法中的局部变量或者子类的成员变量与父类成员变量同名时,也就是子类变量覆盖同名父类变量时,可以使用super.成员变量名引用父类成员变量。同时,若子类的成员方法覆盖了父类的成员方法时,也可以使用super.方法名(参数列表)的方式访问父类的方法。

2)例子:

class A{
    public int a = 1;//可以直接赋值,不用通过构造函数
    public void say(){
        System.out.print(a);
    }
}

class B extends A{
    private int a = 2;
    public void say(){
        System.out.print(super.a);//访问父类的a变量,前提是父类的a变量是公有的
    }
    public void tell(){
        super.say();//调用父类的say()方法而不是子类的say()方法
    }
}