Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/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 多态性,而不是搭便车方法,添加_Java_Polymorphism_Overriding - Fatal编程技术网

Java 多态性,而不是搭便车方法,添加

Java 多态性,而不是搭便车方法,添加,java,polymorphism,overriding,Java,Polymorphism,Overriding,我在想。当我有两个类,而第二个类metalRobot扩展了第一个类robot时,有没有一种方法可以在第二个方法中调用第一个类的方法,而第二个方法会覆盖它 示例 //super class class robot{ private int width; private int height; //constructor robot(int width,int height){ this.width=height; this.width=height;

我在想。当我有两个类,而第二个类
metalRobot
扩展了第一个类
robot
时,有没有一种方法可以在第二个方法中调用第一个类的方法,而第二个方法会覆盖它

示例

//super class
class robot{
   private int width;
   private int height;

   //constructor
   robot(int width,int height){
    this.width=height;
    this.width=height;
   }

   //display width and height
   void render()
   {
     System.out.println(width + " " + height);
   }

}


//child class
class metalRobot{
   private int x;
   private int y;

   //constructor
   metalRobot(int x,int y, int height, int width){
    super(width,height);
    this.x=x;
    this.y=y;
   }

   @Override
   void render()
   {
     System.out.println(x + " " + y);
   }

}
因此,当我调用render时,它将打印出metalRobot中render()第一行的x、y宽度和高度

调用super.render()

其他信息:

在metalRobot中render()的第一行调用super.render()


其他信息:

首先,您需要从
机器人继承:

class metalRobot extends robot {
}
然后您可以通过关键字
super
访问父方法,如下所示:

@Override
void render() {
    super.render();
    System.out.println(width + " " + height);
}

首先,您需要继承自
robot

class metalRobot extends robot {
}
然后您可以通过关键字
super
访问父方法,如下所示:

@Override
void render() {
    super.render();
    System.out.println(width + " " + height);
}

为了调用超类的重写方法,必须使用
super

关键字后跟一个点,然后是方法名称

e、 g.
super.render()

请注意,
super
仅允许在子类的非静态方法中使用

当在中有构造函数时,也可以在构造函数中使用
super

不是默认构造函数的父类必须提供所需的

通过子类构造函数在超类构造函数中的参数

e、 g.如果您的超类有一个构造函数
MySuperclass(String myString)

并且不包含默认构造函数

如果使用
super
关键字,则必须为超类构造函数提供值

MySubclass()
{
   super("Needed String");
}
还请注意,java中不允许多重继承,因此不能将
扩展
多次,例如2次或更多

为什么?


因为子类不知道哪个
super
是哪个,还有许多其他原因,这就是为什么James Gosling不允许这样做的原因

为了调用超类的重写方法,必须使用
super

关键字后跟一个点,然后是方法名称

e、 g.
super.render()

请注意,
super
仅允许在子类的非静态方法中使用

当在中有构造函数时,也可以在构造函数中使用
super

不是默认构造函数的父类必须提供所需的

通过子类构造函数在超类构造函数中的参数

e、 g.如果您的超类有一个构造函数
MySuperclass(String myString)

并且不包含默认构造函数

如果使用
super
关键字,则必须为超类构造函数提供值

MySubclass()
{
   super("Needed String");
}
还请注意,java中不允许多重继承,因此不能将
扩展
多次,例如2次或更多

为什么?

因为子类不知道哪个
super
是哪个,还有许多其他原因,这就是为什么James Gosling不允许这样做的原因使用super.render()访问父类的方法使用super.render()访问父类的方法调用
super.render()
是一种解决方案。另一个解决方案,也是我个人更喜欢的,就是使用。它需要一个额外的接口,但它让类的用户能够更好地控制如何组成复合对象

interface Robot
{
    void render();
}

class DefaultRobot implements Robot
{
    public void render()
    {
        //do some stuff
    }
}

class MetalRobot implements Robot
{
    private final Robot wrapped;

    public MetalRobot(Robot robot)
    {
        this.wrapped = robot;
    }

    public void render()
    {
        wrapped.render();
        // do some extra stuff
    }
}
示例用法可能类似于:

Robot robot = new MetalRobot(new DefaultRobot());
假设您要添加一个
FatRobot
和一个
RedRobot
,以后您可以执行以下操作:

// metal, fat, red robot
Robot robot = new MetalRobot(new FatRobot(new RedRobot(new DefaultRobot())));

// fat and red robot
Robot robot2 = new FatRobot(new RedRobot(new DefaultRobot()));

// red, metal robot
Robot robot3 = new RedRobot(new MetalRobot(new DefaultRobot()));
或者你能想象的任何其他组合。多态性不允许您以优雅的方式执行此操作。

调用
super.render()
是一种解决方案。另一个解决方案,也是我个人更喜欢的,就是使用。它需要一个额外的接口,但它让类的用户能够更好地控制如何组成复合对象

interface Robot
{
    void render();
}

class DefaultRobot implements Robot
{
    public void render()
    {
        //do some stuff
    }
}

class MetalRobot implements Robot
{
    private final Robot wrapped;

    public MetalRobot(Robot robot)
    {
        this.wrapped = robot;
    }

    public void render()
    {
        wrapped.render();
        // do some extra stuff
    }
}
示例用法可能类似于:

Robot robot = new MetalRobot(new DefaultRobot());
假设您要添加一个
FatRobot
和一个
RedRobot
,以后您可以执行以下操作:

// metal, fat, red robot
Robot robot = new MetalRobot(new FatRobot(new RedRobot(new DefaultRobot())));

// fat and red robot
Robot robot2 = new FatRobot(new RedRobot(new DefaultRobot()));

// red, metal robot
Robot robot3 = new RedRobot(new MetalRobot(new DefaultRobot()));

或者你能想象的任何其他组合。多态性不允许您以优雅的方式执行此操作。

您的
metalRobot
的可能副本需要扩展
robot
-类,否则它不是子类。按照惯例,Java中的类名应该使用大写。当我在教学时,我告诉我的学生,当我看到一个覆盖方法不包含
super
调用时,我通常会产生怀疑,就像在
super.render()中一样
。您的
metalRobot
的可能副本需要扩展
robot
-类,否则它不是子类。按照惯例,Java中的类名应该使用大写。当我在教学时,我告诉我的学生,当我看到一个不包含
super
调用的重写方法时,我通常会产生怀疑,在
super.render()中