详解Java中super的几种用法并与this的区别
简介
在 Java 中,我们常常使用 super
和 this
关键字。它们分别表示父类和当前对象的引用。本文将会详细讨论 super
的几种用法,并将其与 this
关键字进行区分。
用法一:super 调用父类的构造方法
在子类的构造方法中,我们可以使用 super
调用父类的构造方法,来初始化父类的属性。这个用法需要注意以下几点:
- 子类的构造方法的第一行必须是
super()
或this()
,否则编译器会自动添加super()
; - 如果父类没有默认构造方法,子类必须显式调用父类带参构造方法,否则编译器会报错。
以下是一个示例代码:
class Parent {
protected int x;
public Parent(int x) {
this.x = x;
}
}
class Child extends Parent {
protected int y;
public Child(int x, int y) {
super(x);
this.y = y;
}
}
在 Child
的构造方法中,我们使用 super(x)
调用了 Parent
的构造方法,将 x
初始化。然后,我们使用 this.y = y
初始化 Child
的属性。
用法二:super 调用父类的成员变量和方法
在子类中,我们可以使用 super
关键字调用父类的成员变量和方法。这个用法需要注意以下几点:
- 如果父类和子类的成员变量或方法同名,则子类中的同名变量或方法会覆盖父类的同名变量或方法;
- 在子类中,我们可以使用
super
关键字来调用父类的同名成员变量或方法。
以下是一个示例代码:
class Parent {
protected int x;
public Parent(int x) {
this.x = x;
}
public void print() {
System.out.println("Parent's print");
}
}
class Child extends Parent {
protected int x;
public Child(int x, int y) {
super(x);
this.x = y;
}
public void print() {
super.print();
System.out.println("Child's print");
}
public void test() {
System.out.println(super.x);
super.print();
}
}
在 Child
中,我们使用 super.print()
调用了 Parent
中的 print()
方法。另外,在 test()
方法中,我们使用 super.x
调用了 Parent
中的 x
成员变量。
与 this 关键字的区别
super
表示父类的引用,而 this
表示当前对象的引用。它们的区别在于:
- 当子类中的成员变量和父类中的成员变量同名时,我们可以使用
this
来引用子类的成员变量,使用super
来引用父类的成员变量; - 当子类中的方法和父类中的方法同名时,我们可以使用
this
来调用子类的方法,使用super
来调用父类的方法。
以下是一个示例代码:
class Parent {
protected int x;
public Parent(int x) {
this.x = x;
}
public void foo() {
System.out.println("Parent's foo");
}
}
class Child extends Parent {
protected int x;
public Child(int x, int y) {
super(x);
this.x = y;
}
public void foo() {
System.out.println("Child's foo");
}
public void bar() {
System.out.println(this.x);
System.out.println(super.x);
this.foo();
super.foo();
}
}
在 Child
中,我们使用 this.x
打印了子类的属性,使用 super.x
打印了父类的属性。另外,在 bar()
方法中,我们使用 this.foo()
调用了子类的方法,使用 super.foo()
调用了父类的方法。
总结
在 Java 中,super
和 this
关键字分别表示父类和当前对象的引用。super
的几种用法包括调用父类的构造方法、调用父类的成员变量和方法。与 this
的区别在于,它们分别表示父类和当前对象的引用,在同名成员变量或方法的情况下,它们的引用不同。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Java中super的几种用法并与this的区别 - Python技术站