关键字this
和super
之间有什么区别?
两者都用于访问类的构造函数吗?你能解释一下吗?
答案 0 :(得分:70)
让我们考虑一下这种情况
class Animal {
void eat() {
System.out.println("animal : eat");
}
}
class Dog extends Animal {
void eat() {
System.out.println("dog : eat");
}
void anotherEat() {
super.eat();
}
}
public class Test {
public static void main(String[] args) {
Animal a = new Animal();
a.eat();
Dog d = new Dog();
d.eat();
d.anotherEat();
}
}
输出将是
animal : eat
dog : eat
animal : eat
第三行是打印“animal:eat”,因为我们正在调用super.eat()
。如果我们打电话给this.eat()
,它就会打印成“dog:eat”。
答案 1 :(得分:51)
super
用于访问基类的方法,而this
用于访问当前类的方法。
扩展这个概念,如果你写super()
,它引用基类的构造函数,如果你写this()
,它引用你编写这段代码的类的构造函数
答案 2 :(得分:19)
this
是对作为当前类输入的对象的引用,super
是对作为其父类输入的对象的引用。
在构造函数中,this()
调用当前类中定义的构造函数。 super()
调用父类中定义的构造函数。构造函数可以在任何父类中定义,但它将引用最接近当前类的重写。以这种方式调用其他构造函数可能只能作为构造函数中的第一行。
调用方法的工作方式相同。调用this.method()
会调用当前类中定义的方法,其中super.method()
将调用与父类中定义的方法相同的方法。
答案 3 :(得分:10)
从你的问题来看,我认为你真的在询问构造函数链中this
和super
的用法; e.g。
public class A extends B {
public A(...) {
this(...);
...
}
}
与
public class A extends B {
public A(...) {
super(...);
...
}
}
区别很简单:
this
表单链接到当前类中的构造函数;即在A
班。
super
表单链接到直接超类中的构造函数;即在B
班。
答案 4 :(得分:8)
this
指的是当前类的引用。
super
是指当前类的父(称为super
关键字)。
通过执行this
,它允许您访问当前类的方法/属性(包括其自己的私有方法/属性)。
super
允许您访问父(基)类的公共/受保护方法/属性。您无法看到父级的私有方法/属性。
答案 5 :(得分:5)
<强> 注:的
我们只能在构造函数中使用super()和this()而不是其他任何地方 尝试这样做会导致编译时错误。
我们必须保持super()或this()作为第一行 构造函数,但不是两个同时。
注意: 我们可以在类中的任何位置使用它们,静态区域(静态块或方法),任何 尝试这样做会导致编译时错误。
答案 6 :(得分:3)
this
用于访问当前对象的方法和字段。因此,它在静态方法中没有任何意义,例如。
super
允许访问超类中的非私有方法和字段,并且只能从类的构造函数中访问构造函数。
答案 7 :(得分:3)
编写代码时,您通常不想重复自己。如果你有一个可以用不同数量的参数构造的类,那么避免重复自己的常见解决方案就是在缺少的参数中调用另一个默认值的构造函数。这只有一个恼人的限制 - 它必须是声明的构造函数的第一行。例如:
MyClass()
{
this(default1, default2);
}
MyClass(arg1, arg2)
{
validate arguments, etc...
note that your validation logic is only written once now
}
对于super()
构造函数,再次与super.method()
访问不同,它必须是构造函数的第一行。在那之后,它非常像this()
构造函数,DRY(不要重复自己),如果你扩展的类有一个构造函数,它可以执行你想要的一些然后使用它,然后继续构造你的对象,例如:
YourClass extends MyClass
{
YourClass(arg1, arg2, arg3)
{
super(arg1, arg2) // calls MyClass(arg1, arg2)
validate and process arg3...
}
}
其他信息:
即使你没有看到它,默认的无参数构造函数总是先调用super()
。例如:
MyClass()
{
}
相当于
MyClass()
{
super();
}
我看到很多人提到在方法和变量上使用this
和super
关键字 - 一切都很好。请记住,构造函数对它们的使用有唯一的限制,最值得注意的是它们必须是声明的构造函数的第一个指令,并且只能使用一个。
答案 8 :(得分:3)
此关键字用于在同一个类中调用构造函数(其他重载的构造函数)
语法:此(args列表); //与同一类别中的其他构造函数中的 args list 兼容
super 关键字用于调用超类中的构造函数。
语法: super(args list); //与超类的构造函数中的 args list 兼容。
例如:
public class Rect {
int x1, y1, x2, y2;
public Rect(int x1, int y1, int x2, int y2) // 1st constructor
{ ....//code to build a rectangle }
}
public Rect () { // 2nd constructor
this (0,0,width,height) // call 1st constructor (because it has **4 int args**), this is another way to build a rectangle
}
public class DrawableRect extends Rect {
public DrawableRect (int a1, int b1, int a2, int b2) {
super (a1,b1,a2,b2) // call super class constructor (Rect class)
}
}