多态性而不是重载方法,加上

时间:2017-04-12 11:50:41

标签: java polymorphism override

我在想。当我有两个类而第二个类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);
   }

}

因此,当我调用渲染时,它将打印出x,y宽度和高度

5 个答案:

答案 0 :(得分:3)

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

其他信息:https://docs.oracle.com/javase/tutorial/java/IandI/super.html

答案 1 :(得分:2)

首先,你需要继承robot

class metalRobot extends robot {
}

然后,您可以通过关键字super访问父方法:

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

答案 2 :(得分:1)

调用super.render()是一种解决方案。另一个解决方案,也就是我个人更喜欢的解决方案,是使用the decorator pattern。它需要一个额外的界面,但它可以让你的班级用户更好地控制他们如何组成一个复合对象。

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());

假设您稍后要添加FatRobotRedRobot

// 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()));

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

答案 3 :(得分:0)

要调用超类的overriden方法,必须使用if (cell==null) { continue; }

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

e.g。 super

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

如果

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

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

通过子类构造函数

在超类构造函数中的参数

e.g。如果您的超类具有super

的构造函数

并且不包含默认构造函数

您必须为超类构造函数提供值,才能使用MySuperclass(String myString)关键字

super

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

<强>为什么吗

因为孩子班级不知道哪个extends是哪个以及许多其他原因导致 James Gosling 不允许这样做

答案 4 :(得分:0)

使用 super.render()访问父类的方法