Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 与x27之间的差异;超级';和';这';_Java_Oop - Fatal编程技术网

Java 与x27之间的差异;超级';和';这';

Java 与x27之间的差异;超级';和';这';,java,oop,Java,Oop,可能重复: 我对发展一无所知。我仍然无法理解的是这个关键字和超级关键字之间的区别。如果有任何答案,我们将不胜感激。谢谢。 在实例方法或构造函数中,这是对当前对象的引用,即调用其方法或构造函数的对象。您可以使用以下方法从实例方法或构造函数中引用当前对象的任何成员 如果您的方法重写其超类的方法之一,则可以通过使用关键字super调用被重写的方法。您还可以使用super来引用隐藏字段(尽管不鼓励隐藏字段) super引用当前类扩展的基类此引用当前类实例 因此,如果Parent扩展Child并创建一

可能重复:

我对发展一无所知。我仍然无法理解的是这个关键字和超级关键字之间的区别。如果有任何答案,我们将不胜感激。谢谢。

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

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


super
引用当前类扩展的基类<代码>此引用当前类实例


因此,如果
Parent
扩展
Child
并创建一个
新的Child()
,super引用
父类(在构造函数中执行类似
super()
的操作将调用父类的构造函数)这是指使用
new
Super
创建的实际
Child
实例是指类扩展的超类
引用类的当前实例。

在Java中,关键字
引用类的当前对象,如:

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;
    }
}
在类的构造函数中,
这个.x
指的是类中定义的
x
,其中
x
是传递给构造函数的参数。此处
用于解决名称
x
的歧义。同样的情况也适用于
y


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

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


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

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

例:


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

编译器可能不知道您的意图,并且可能会用一条神秘的(对于新开发人员)错误消息侮辱您。以以下方式使用
告诉编译器“我指的是类级变量,而不是方法级变量”

(尽管在实践中不应该以这种方式复制变量名!) 总之,
这个
告诉编译器您正在引用当前类。当扩展类(继承父类或
super
类的功能)时,可能会出现进一步的歧义,因为覆盖父方法的选项出现了

class Bike
{
    public Bike()
    {}

    public void printSpeed()
    {
        System.out.println("This generic bike can go 10 m/s!!");
    }
}
现在,如果我们要通过引入更具体类型的自行车来扩展bike类,我们可能希望覆盖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
来指代我们所处班级的家长

WHOAAAH!! MOUNTAIN BIKE GOES 100 m/s!!
This bike can go 10 m/s!!
public static void main(String args[])
{
    MountainBike mb = new MountainBike();
    mb.printSpeed();
}
This bike can go 10 m/s!!