可能重复:
java中的this和super
我是开发新手。我仍然无法理解的是 this 和 super 关键字之间的区别。如果有任何答案,将不胜感激。谢谢。
这些概念可能会让新开发人员感到困惑,当您了解扩展类(继承)时,它们会更加清晰。有时当你引用一个变量或方法时,你可能会模棱两可,例如,如果你在一个方法中重复了一个类变量名,编译器不会知道你指的是哪个变量,所以你可以用它来指定你是引用当前类的变量(不是局部变量)。以下将是模棱两可的(和错误的):
class Bike
{
int speed = 10;
public setSpeed(int speed)
{
speed = speed;
}
}
编译器不知道您的意图,并且可能会用一个神秘的(对于新开发人员)错误消息来侮辱您。使用this
以下方式告诉编译器“我指的是类级别变量,而不是方法级别变量”
class Bike
{
int speed = 10;
//Constructors and shiz
public void setSpeed(int speed)
{
this.speed = speed;
}
}
(尽管在实践中您不应该以这种方式重复变量名!)总而言之,this
告诉编译器您指的是 CURRENT 类。当您扩展类(继承父类或super
类的功能)时,可能会出现进一步的歧义,因为出现了覆盖父方法的选项。
class Bike
{
public Bike()
{}
public void printSpeed()
{
System.out.println("This generic bike can go 10 m/s!!");
}
}
现在,如果我们要通过引入更具体的自行车类型来扩展自行车类,我们可能想要覆盖 printSpeed 方法以提供我们闪亮的新自行车的速度,如下所示:
class MountainBike extends Bike
{
public MountainBike() {}
public void printSpeed()
{
System.out.println("WHOAAAH!! MOUNTAIN BIKE GOES 100 m/s!!");
}
public void printGenericSpeed()
{
super.printSpeed();
}
}
super.printSpeed()
告诉编译器从父类运行这个方法,所以调用实际上super.printSpeed()
会调用printSpeed()
Bike 类中的方法。以下代码:
public static void main(String args[])
{
MountainBike mb = new MountainBike();
mb.printSpeed();
mb.printGenericSpeed();
}
将打印
WHOAAAH!! MOUNTAIN BIKE GOES 100 m/s!!
This bike can go 10 m/s!!
请注意,如果我们没有重写该printSpeed()
方法,则调用以下将是printSpeed()
对 Bike 类的方法的调用。
public static void main(String args[])
{
MountainBike mb = new MountainBike();
mb.printSpeed();
}
会打印
This bike can go 10 m/s!!
因此,总而言之,我们使用this
来指代我们所在的当前类,并super
指代我们所在类的父类。
super
指当前类扩展的基类。this
指当前的类实例。
因此,如果Parent
extendsChild
并且您创建了一个new Child()
, super 指的是Parent
类(并且super()
在构造函数中执行类似的操作会调用父的构造函数),而 this 指的是Child
您使用 . 创建的实际实例new
。
Super
指一个类扩展的超类。 this
指类的当前实例。
this 关键字指的是那个时间点的当前实例。super 关键字是指当前类的父/超类。
前任:
class Test
{
Test()
{
}
Test(int i)
{
System.out.println("i=" + i);
}
}
class Sample extends Test
{
int i;
void Sample(int i) //constructor
{
this.i=i; // referring class version of the i using 'this'
super(i); // passing parameter to Super/Parent class constructor.
}
}
在 Java 中,关键字this
是指类的当前对象,例如:
class Point {
public int x = 0;
public int y = 0;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public String toString() {
return x + "," + y;
}
}
class Point3D extends Point {
public int z = 0;
public Point(int x, int y, int z) {
super(x,y);
this.z = z;
}
public String toString() {
return super.toString() + "," + z;
}
}
在类的构造函数中是Point
this.x
指x
在类中定义的,这里x
是传入构造函数的参数。这里this
用来解决名称的歧义x
。对于y
.
在类Point3D
中,方法toString()
使用超类Point
的返回值来产生自己的返回值。
this: 是其类的方法中对当前对象的引用。通过 this 关键字引用当前对象的任何成员。
super:当你的类通过extend关键字扩展它时,它是派生类的父类,你可以通过使用关键字super调用被覆盖的方法。您还可以使用 super 来引用受保护的字段。