详解Java this与super关键字的用法与区别

258 阅读6分钟

本文将详细介绍Java中this与super关键字的用法与区别,并通过详细示例加深理解。此外,我们还将探讨this与super的适用场景及注意事项。

一、this关键字

1. 作用:

在Java中,this关键字表示当前对象的引用,可以用来访问对象的成员变量和成员方法。

2. 使用方法:

使用this的一般形式如下:

this.成员变量或成员方法

其中,“this.”是调用当前对象中的成员的前缀,可以直接访问当前对象中的成员变量和成员方法。

举个例子,假设我们有一个名为Person的类,它有一个成员变量名为name,如下所示:

public class Person {
    private String name;
    
    public Person(String name) {
        this.name = name;
    }
    
    public String getName() {
        return this.name;
    }
}

在该类中,构造方法Person(String name)参数中也有一个name变量,如果不使用this关键字,则无法区分这两个变量。因此,我们需要使用this关键字指定当前对象的name变量,代码如下:

public class Person {
    private String name;
    
    public Person(String name) {
        this.name = name; // 使用this关键字指定当前对象的name变量
    }
    
    public String getName() {
        return this.name; // 使用this关键字访问当前对象的name变量
    }
}

3. 示例:

下面,我们来看一个更完整的示例。假设我们有一个名为Student的类,它有如下成员变量和成员方法:

public class Student {
    private String name;
    private int age;
    
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public void displayInfo() {
        System.out.println("姓名:" + this.name + ",年龄:" + this.age);
    }
}

在该类中,构造方法Student(String name, int age)使用this关键字指定当前对象的name和age变量,成员方法displayInfo()也使用this关键字访问当前对象的name和age变量,代码如下:

public class Test {
    public static void main(String[] args) {
        Student s1 = new Student("张三", 18);
        Student s2 = new Student("李四", 20);
        
        s1.displayInfo(); // 输出结果:姓名:张三,年龄:18
        s2.displayInfo(); // 输出结果:姓名:李四,年龄:20
    }
}

从上述示例中可以看出,通过使用this关键字,我们可以很方便地访问当前对象的成员变量和成员方法。

二、super关键字

1. 作用:

在Java中,super关键字表示父类对象的引用,可以用来访问父类的成员变量和成员方法。

2. 使用方法:

使用super的一般形式如下:

super.成员变量或成员方法

其中,“super.”是调用父类对象中的成员的前缀,可以直接访问父类对象中的成员变量和成员方法。

举个例子,假设我们有一个名为Student的子类,它继承自Person父类,如下所示:

public class Person {
    protected String name;
    
    public Person(String name) {
        this.name = name;
    }
    
    public void eat() {
        System.out.println("吃饭");
    }
}

public class Student extends Person {
    private int age;
    
    public Student(String name, int age) {
        super(name); // 调用父类的构造方法
        this.age = age;
    }
    
    public void displayInfo() {
        // 使用super关键字访问父类的name变量
        System.out.println("姓名:" + super.name + ",年龄:" + this.age);
        
        // 调用父类的eat方法
        super.eat();
    }
}

在该类中,构造方法Student(String name, int age)使用super关键字调用父类的构造方法,成员方法displayInfo()使用super关键字访问父类的name变量,并调用父类的eat方法,代码如下:

public class Test {
    public static void main(String[] args) {
        Student s1 = new Student("张三", 18);
        s1.displayInfo(); // 输出结果:姓名:张三,年龄:18,吃饭
    }
}

从上述示例中可以看出,通过使用super关键字,我们可以很方便地访问父类对象的成员变量和成员方法。

三、this与super的区别

1.作用域不同:

this关键字表示当前对象的引用,可以用来访问对象的成员变量和成员方法。而super关键字表示父类对象的引用,可以用来访问父类的成员变量和成员方法。

2.使用方式不同:

this关键字使用“this.”前缀来访问当前对象的成员变量和成员方法。而super关键字使用“super.”前缀来访问父类对象的成员变量和成员方法。

3.适用范围不同:

this关键字只能在类的内部使用,即只能在类的构造方法、成员方法和内部类中使用。而super关键字既可以在子类中使用,也可以在子类的构造方法和成员方法中使用。

4.优先级不同:

当子类和父类中有同名的成员变量或成员方法时,使用this关键字访问的是当前对象中的成员,使用super关键字访问的是父类对象中的成员。

举个例子,假设我们有一个名为A的父类,一个名为B的子类,如下所示:

public class A {
    protected String name = "A";
    
    public void method() {
        System.out.println("A");
    }
}

public class B extends A {
    protected String name = "B";
    
    public void method() {
        System.out.println("B");
    }
    
    public void displayInfo() {
        System.out.println("当前对象的name变量:" + this.name); // 输出结果:B
        System.out.println("父类对象的name变量:" + super.name); // 输出结果:A
        
        this.method(); // 输出结果:B
        super.method(); // 输出结果:A
    }
}

在该类中,子类B和父类A中都有一个名为name的成员变量和一个名为method()的成员方法。在成员方法displayInfo()中,使用this关键字访问当前对象中的name变量和method()方法,使用super关键字访问父类对象中的name变量和method()方法,代码如下:

public class Test {
    public static void main(String[] args) {
        B b = new B();
        b.displayInfo();
    }
}

从上述示例中可以看出,当子类和父类中有同名的成员变量或成员方法时,使用this关键字访问的是当前对象中的成员,使用super关键字访问的是父类对象中的成员。

四、this与super的适用场景及注意事项

1. 适用场景:

this关键字适用于在同一类中访问该类的成员变量和成员方法。通常,我们使用this关键字来区分成员变量和局部变量,或者在方法中访问对象的成员。此外,在构造方法中调用另一个构造方法时,我们也可以使用this关键字。

super关键字适用于在子类中访问父类的成员变量和成员方法。通常,在子类中我们需要访问父类中的变量或方法时,就需要使用super关键字。

2. 注意事项:

在使用this关键字时,要注意不要与局部变量或方法参数重名,否则会产生歧义。此外,在使用this关键字调用另一个构造方法时,必须放在构造方法的第一行。

在使用super关键字时,要注意父类中被访问的成员变量和成员方法必须是protected或public类型的,否则访问将被拒绝。此外,在使用super关键字调用父类的构造方法时,必须放在子类构造方法的第一行。

以上就是本文对Java中this和super关键字的详细介绍和示例分析。通过本文的讲解,相信读者已经掌握了this和super的使用方法和区别,能够灵活地运用到Java编程中。