JavaRush /Java 博客 /Random-ZH /Java中this和super关键字的区别
grishin
第 27 级
Харьков

Java中this和super关键字的区别

已在 Random-ZH 群组中发布
thissuper是 Java 中的两个特殊关键字,分别表示类及其超类的当前实例。Java 程序员经常混淆这些词,并且很少意识到它们的特殊属性,而这些特殊属性在 Java Core 面试中经常被问到。例如,我立即想到的几个问题是关于thisand 的super,是否可以为thisJava 中的关键字分配不同的含义?thisJava 中的关键字和有什么区别super。不知道?好吧,我不会在这里给出答案 - 可以在文章末尾找到答案。 Java中this和super关键字的区别 - 1所以,正如我一开始所说的, JavathissuperJava 中的主要区别在于,代表的是this类的当前实例,而super代表的是父类的当前实例。这是使用变量的一个示例this,并且super- 您可能已经看到了从一个变量调用另一个变量的构造函数的示例,即所谓的。在链中调用构造函数,这可以通过使用关键字thisand来实现super。在类内部,要调用其无参构造函数,请使用 use this(),而super()它用于调用无参构造函数,或者也称为父类的默认构造函数。顺便说一句,通过这种方式,您不仅可以调用不带参数的构造函数,还可以通过向其传递适当的参数来调用任何其他构造函数。我们很快就会看到这种this用法的示例super。同样在thisJava中super,它们还用于访问类实例及其父类的变量。事实上,可以在没有前缀super和 的情况下访问它们this,但前提是在当前块中这些变量不与其他变量重叠,即 如果它不包含同名的局部变量,否则你将不得不使用带有前缀的名称,但这并不重要,因为 在这种形式下,它们更具可读性。这种方法的一个经典示例是在内部使用this构造函数,该构造函数采用与实例变量同名的参数。在本文后面,我们将了解super和之间还有哪些其他区别this,并查看它们的一些使用示例。

this 和 super 有何相似之处

this在了解关键字和之间的差异之前super,让我们先看看它们的一些相似之处:
  1. thissuper都是非静态变量,因此它们不能在静态上下文中使用,这意味着它们不能在 main 方法中使用。这将导致编译时错误“this无法从静态上下文引用非静态变量”。如果您在 main 方法中使用关键字,也会发生同样的情况super

  2. this, 和都super可以在构造函数内部使用来调用链中的其他构造函数,例如,this() 和super() 分别调用不带继承类和父类参数的构造函数。
在下面的示例中,我们首先将调用从类 B 的无参数构造函数传递给同一类 B 的具有单个类型参数的构造函数String,该构造函数又从super("")超类调用单参数构造函数。
class A{

    A(){
        System.out.println("Конструктор без аргументов класса A");
    }

    A(String args){
        System.out.println("Конструктор с одним аргументом класса A");
    }
}

class B extends A{

   B(){
        this(""); // вызов конструктора с одним аргументом класса B
        System.out.println("Конструктор без аргументов класса B");
    }

   B(String args){
        super(""); // вызов конструктора с одним аргументом класса A
        System.out.println("Конструктор с одним аргументом класса B");
    }
}

// Тест-класс и вывод
public class Test {

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

}
输出: 类 A 的单参构造函数 类 B 的单参构造函数 类 B 的无参构造函数
  1. 在构造函数内部this, 和super必须出现在所有其他表达式之上,在最开始的位置,否则编译器将发出错误消息。由此可见,一个构造函数不能同时包含this(), 和super()

super 和 this 的区别

现在我们知道如何使用关键字superthis了解它们的用途。但是还有另一种使用这些关键字的选项,我没有提到 - 在内部类中,在它们的帮助下,使用外部表示法形式引用外部类非常方便。this对于其当前实例和外部。super- 为了他的父母。不要忘记将 Outer 替换为外部类的名称。this现在让我们简单列出一下关键字和关键字之间的主要区别super
  1. 变量this指的是使用它的类的当前实例,而它super指的是父类的当前实例。

  2. 在没有显式调用其他构造函数的情况下,每个构造函数都会隐式调用super()其父类的无参数构造函数,但您始终可以选择使用 、this()或 显式调用任何其他构造函数super()
这可能就是关于 Java 中关键字thisand之间的差异super以及它们在程序中如何使用的全部内容。正如我们所看到的,它们的主要目的是从另一个构造函数调用一个构造函数,并引用当前类及其父类中声明的实例变量。不要忘记这些并不完全是普通变量,现在 - 我在第一段中提出的问题的答案。不,不能为变量this分配新值,因为它被声明为最终的。您可以尝试在 IDE 中执行此操作 - 您将收到编译错误“您无法为变量分配新值this- 它被声明为最终值。” 原创文章在这里
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION