好的,我的基本类层次结构如下:
这是形状和圆的代码。无需阅读,仅供参考;无论如何,主要是getter和setter。如果我的错误不明显,我建议最后看看它们。
abstract public class Shape {
protected String color;
protected boolean isFilled;
public Shape() {
color = "green";
isFilled = true;
}
public Shape(String color, boolean isFilled) {
this.color = color;
this.isFilled = isFilled;
}
public String toString() {
String filledString = (isFilled)? "is filled in." : "is not filled in.";
return "A Shape of " + color + " color that " + filledString;
}
public String getColor() {
return color;
}
public boolean getIsFilled() {
return isFilled;
}
public boolean isFilled() {
return isFilled;
}
public void setColor(String color) {
this.color = color;
}
public void setIsFilled(boolean isFilled) {
this.isFilled = isFilled;
}
abstract public double getArea();
abstract public double getPerimeter();
}
还有circle课程。
public class Circle extends Shape { // save as "Circle.java"
protected double radius;
public Circle() {
radius = 1.0;
}
public Circle(double radius, String color, boolean isFilled) {
super(color, isFilled);
radius = this.radius;
}
// A public method for computing the area of circle
@Override
public double getArea() {
return radius*radius*Math.PI;
}
@Override
public double getPerimeter() {
return 2 * Math.PI * radius;
}
public double getRadius() {
return radius;
}
@Override
public String toString() {
return ("Radius: " + radius);
}
public void setRadius(double radius) {
this.radius = radius;
}
}
我的问题与以下代码执行的结果有关:
public class TestShapes
{
public static void main(String... args)
{
Shape s1 = new Circle(5.5, "RED", false); // Upcast Circle to Shape
System.out.println(s1); // which version?
System.out.println(s1.getArea()); // which version?
System.out.println(s1.getPerimeter()); // which version?
System.out.println(s1.getColor());
System.out.println(s1.isFilled());
// System.out.println(s1.getRadius()); // why doesn't this work?
}
}
注意:很抱歉代码太多;我只是不知道抽象类是否有什么奇怪的地方,或者是误解的真正根源。
我无法解释输出,其内容如下:
Radius: 0.0
0.0
0.0
RED
false
由此可以看出,第一个print命令引用的是toString的circle版本。然而,我无法解释为什么接下来的两个print命令引用了getArea或getpermiture的Shape版本;这似乎是一个矛盾!这两个类都有一个重写的方法,那么为什么一个引用circle方法,另一个引用Shape方法呢?此外,如果toString()方法对圆起作用,为什么getRadius()方法执行时不会出错?
我最近一直在翻阅几本书,以便自学Java幸运的是,主要是由于运气,我遇到的困难很少。这种情况刚刚改变。 我在继承和整个超类子类设置下阅读了下面的一节 --创建新的超类对象时,与所有对象一样,会为其指定一个引用(本例中为superReference) --如果创建了一个新的子类对象(定义子类扩展了超类),然后superReference引用被设置为引用该对象而不是原始对象,我的理解是,由于引用是针对
问题内容: 动物是狗的超类,狗有一种叫bark的方法 考虑以下: 会发生什么? the assignment isn’t allowed the call to bark is allowed and “woof” is printed at run time the call to bark is allowed but nothing is printed the call to bark c
在java中,我们可以缩小返回类型和throws异常类型(甚至删除throws子句): 但是,参数类型呢(如果A采用< code>T,那么为什么B不采用< code >?超级T)如: 让我们考虑一下我认为完全符合逻辑的这段代码: 所以我要说的是,在使用的代码上下文中仍然有效。
我在调用覆盖方法的子类方法时遇到了问题,所以我创建了一个小应用程序来测试它。当超类调用其子类覆盖的方法时,仍然调用超类的方法版本,而不是子类的版本,后者覆盖了超类的方法,应该是被调用的方法。 预期输出:
问题内容: SuperClass object = new SubClass(); 为什么使用超类实例化上面的子类对象?因为我学会实例化对象的唯一方法是: 我正在学习Java。 问题答案: 您可能有一个仅接受实例的方法。由于 是 ,您可以使用的实例并将其视为。 使用接口时,会使用相同的行为: 这就是多态的美。它允许您更改类内部的实现,而无需破坏其余代码。
我有一个基类,它定义了类方法,用于返回用于构建服务url的各种信息。基类还定义了一个用于构建该url的实例方法。我希望基类有这个方法的默认实现,这样当我需要url不同时,我只需要在子类中重写它。我如何让这个基方法调用重写的类方法来使用子类中的类方法构建url?下面是我现在的代码,但它不起作用: 基类方法: op ationId、operationVersion和方法类型是在子类中实现的类方法,但是