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()中代码>。