Java 类未从扩展到JComponent的类继承
我在这些课上都有这个Java 类未从扩展到JComponent的类继承,java,inheritance,multiple-inheritance,jcomponent,Java,Inheritance,Multiple Inheritance,Jcomponent,我在这些课上都有这个 public class Car extends JComponent { } public class Mazda extends Car { } public class Subaru extends Car { } 在我的car类中,我重写了方法paint component @Override public void paintComponent(Graphics g) { //why my planets aren't painted b
public class Car extends JComponent {
}
public class Mazda extends Car {
}
public class Subaru extends Car {
}
在我的car类中,我重写了方法paint component
@Override
public void paintComponent(Graphics g) {
//why my planets aren't painted by this method
if (this instanceof Mazda) {
g.fillOval(0, 0, this.getWidth(), this.getHeight());
System.out.println(this.getClass());
}
if (this instanceof Subaru) {
g.setColor(Color.blue);
g.fillOval(0, 0, this.getWidth(), this.getHeight());
System.out.println(this.getClass());
}
}
它很好地绘制了马自达的实例,但斯巴鲁实例的代码从未被调用。看起来斯巴鲁并没有从汽车上继承Jcomponent?或者为什么不调用painComponent?Java新手,所以我可能遗漏了一些基本的东西斯巴鲁类肯定是从Car继承的,但可能根本没有显示出来。这有一些原因,但没有看到代码,只是猜测:
instanceof
通常表明OOP设计中存在缺陷:
如果每个子类都有自己版本的
paintComponent
,而根本不必使用instanceof
,那么它将更加面向对象。这样做的一个好处是:如果添加新车型,则无需更改汽车类别。斯巴鲁类别肯定继承自汽车,但可能根本不会显示。这有一些原因,但没有看到代码,只是猜测:
instanceof
通常表明OOP设计中存在缺陷:
如果每个子类都有自己版本的
paintComponent
,而根本不必使用instanceof
,那么它将更加面向对象。这样做的一个好处是:如果添加新车型,汽车类别不需要更改。我认为,您在设计上有问题,因为,如果您想@覆盖super class中的方法,最好的选择是在基类中执行,例如马自达或斯巴鲁,
,尤其是,您希望指定不同的行为。在像Car
这样的抽象类中,您可以@覆盖方法,该方法对于Mazda
和Subaru
来说很常见,对于超级类的子类来说并不重要。我想你可以这样写这个结构:
class Car extends JComponent{
}
class Mazda extends Car{
@Override
public void paintComponents(Graphics g) {
g.fillOval(0, 0, this.getWidth(), this.getHeight());
System.out.println(this.getClass());
}
}
class Subaru extends Car{
@Override
public void paintComponents(Graphics g) {
g.setColor(Color.blue);
g.fillOval(0, 0, this.getWidth(), this.getHeight());
System.out.println(this.getClass());
}
}
然后创建类MazdaMazda Mazda=new Mazda()
并调用方法:Mazda.paintComponent(…
或使用polimorphism创建e.q.Mazda
如下所示:Car Mazda=new Mazda()我认为,你在设计上有问题,因为,如果你想@重写超类中的
方法,最好的选择是在基类中,比如马自达或斯巴鲁,
特别是,你想指定不同的行为。在抽象类中,比如汽车你可以@重写方法谁是谁对于马自达
和斯巴鲁
来说,这是很常见的,但对于超级级的孩子来说并不重要。所以,我想你可以这样写这个结构:
class Car extends JComponent{
}
class Mazda extends Car{
@Override
public void paintComponents(Graphics g) {
g.fillOval(0, 0, this.getWidth(), this.getHeight());
System.out.println(this.getClass());
}
}
class Subaru extends Car{
@Override
public void paintComponents(Graphics g) {
g.setColor(Color.blue);
g.fillOval(0, 0, this.getWidth(), this.getHeight());
System.out.println(this.getClass());
}
}
然后创建类MazdaMazda Mazda=new Mazda()
并调用方法:Mazda.paintComponent(…
或使用polimorphism创建e.q.Mazda
如下所示:Car Mazda=new Mazda()在代码<马自达> <代码> >代码> SuARU < /代码>,我尝试过,但只有马自达代码工作,而不是在SubARU中,我也尝试在汽车中抽象化,但没有运气。如何添加和添加实例?考虑创建一个.删除额外的代码,在空框架A上添加马自达和SuSARU。nd告诉我们到底出了什么问题。这些信息没有默认区域设置所要求的那么有用。为什么你不在马自达和斯巴鲁中覆盖paintComponent
?我试过了,但只有马自达代码起作用,而不是在斯巴鲁,我也试着在车内将其抽象化,但没有成功。如何以及在哪里考虑添加一个A.删除额外的代码,在一个空的框架中添加马自达和Suasu,并告诉我们到底出了什么问题。