'super'和'this'之间的区别

时间:2012-04-14 16:40:07

标签: java oop

  

可能重复:
  this and super in java

我是开发新手。我仍然无法理解的是这个和超级关键字之间的区别。如果有任何答案,我们将非常感激。感谢。

7 个答案:

答案 0 :(得分:6)

this

  

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

super

  

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

答案 1 :(得分:1)

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

因此,如果Parent扩展Child并创建new Child(),则super引用Parent类(并在构造函数中执行super()之类的操作将调用父的构造函数),这是指您使用Child创建的实际new实例。

答案 2 :(得分:1)

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

答案 3 :(得分: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()的调用实际上会调用Bike类中的printSpeed()方法。以下代码:

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()方法,则调用以下内容将调用Bike类的printSpeed()方法。

public static void main(String args[])
{
    MountainBike mb = new MountainBike();
    mb.printSpeed();
}

会打印

This bike can go 10 m/s!!

总而言之,我们使用this来引用我们当前所在的类,并使用super来引用我们所在类的父级。

答案 4 :(得分: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.x引用类中定义的x,其中x是传递给构造函数的参数。此处this用于解决名称x的歧义。 y也是如此。

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

答案 5 :(得分:0)

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

super:当您的类通过extend关键字扩展它时派生类'父类,并且您可以通过使用关键字super调用重写方法。您也可以使用super来引用受保护的字段。

答案 6 :(得分:0)

此关键字指的是该时间点的当前实例。 super关键字是指当前类的父/超类。

EX:

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

}