0

可能重复:
java中的this和super

我是开发新手。我仍然无法理解的是 this 和 super 关键字之间的区别。如果有任何答案,将不胜感激。谢谢。

4

7 回答 7

6

this

在实例方法或构造函数中,this 是对当前对象的引用——调用其方法或构造函数的对象。您可以使用 this 从实例方法或构造函数中引用当前对象的任何成员。

super

如果您的方法覆盖了它的超类的方法之一,您可以通过使用关键字 super 来调用被覆盖的方法。您也可以使用 super 来引用隐藏字段(尽管不鼓励隐藏字段)。

于 2012-04-14T16:41:56.027 回答
1

这些概念可能会让新开发人员感到困惑,当您了解扩展类(继承)时,它们会更加清晰。有时当你引用一个变量或方法时,你可能会模棱两可,例如,如果你在一个方法中重复了一个类变量名,编译器不会知道你指的是哪个变量,所以你可以用它来指定你是引用当前类的变量(不是局部变量)。以下将是模棱两可的(和错误的):

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指代我们所在类的父类。

于 2012-04-14T17:35:01.960 回答
1

super指当前类扩展的基类。this指当前的类实例。

因此,如果ParentextendsChild并且您创建了一个new Child(), super 指的是Parent类(并且super()在构造函数中执行类似的操作会调用父的构造函数),而 this 指的是Child您使用 . 创建的实际实例new

于 2012-04-14T16:42:18.627 回答
1

Super指一个类扩展的超类。 this指类的当前实例。

于 2012-04-14T16:42:31.210 回答
0

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. 
  } 

}
于 2012-04-14T17:02:13.407 回答
0

在 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.xx在类中定义的,这里x是传入构造函数的参数。这里this用来解决名称的歧义x。对于y.

在类Point3D中,方法toString()使用超类Point的返回值来产生自己的返回值。

于 2012-04-14T16:54:59.647 回答
0

this: 是其类的方法中对当前对象的引用。通过 this 关键字引用当前对象的任何成员。

super:当你的类通过extend关键字扩展它时,它是派生类的父类,你可以通过使用关键字super调用被覆盖的方法。您还可以使用 super 来引用受保护的字段。

于 2012-04-14T16:56:42.797 回答