在我大学的Java课程中,我们教这个例子。虽然我当然明白这是如何工作的,但我无法想象这个实践可能有用的真实例子。在我看来,它使代码更难理解。更具体地说,使用类声明对象并将其分配给另一个类(Small smallBig = new Big();
)是否有一定的好处,你能给我一个简单的场景,这个练习可能有用吗?
代码:
public class Small {
public int value;
public Small() {value = 10;}
public int getValue() {return value;}
}
public class Big extends Small {
public int value;
public Big() {value = 40;}
public int getValue() {return value-10;}
}
public class Main {
public static void main (String args[]) {
Small small = new Small();
Small smallBig = new Big();
Big big = new Big();
System.out.println(small.getValue());
System.out.println(smallBig.getValue());
System.out.println(big.getValue());
System.out.println(small.value);
System.out.println(smallBig.value);
System.out.println(big.value);
small = (Small) big;
System.out.println(small.getValue());
System.out.println(small.value);
big = (Big) small;
System.out.println(big.getValue());
System.out.println(big.value);
}
}
输出:
10
30
30
10
10
40
30
10
30
40
答案 0 :(得分:0)
我认为在这种情况下它会很有用:
public class Person{
Mobility mobility;
Person(Mobility mobility){this.mobility = mobility;}
}
public class Mobility{
int speed;
public Mobility(int speed){this.speed = speed;}
}
public class Car extends Mobility{
public Car(int speed){super(speed);}
}
public class Main {
public static void main (String args[]) {
Car ferrari = new Car(1000);
Person john = new Person(ferrari);
}
}
希望我能帮到你。
答案 1 :(得分:0)
在这种情况下,您使用getValue作为模板方法“http://en.wikipedia.org/wiki/Template_method_pattern”
让我们以一点点扭曲为例
public class Small {
public int value;
public Small() {value = 10;}
public int getValue() {// this method fetches data from database}
}
public class Big extends Small {
public int value;
public Big() {value = 40;}
public int getValue() {//this method fetches data from xml}
public class Big2 extends Small {
public int value;
public Big() {value = 40;}
public int getValue() {//this method fetched data from some server}
}
正如您所见,getValue的实现正在发生变化。每个子类都提供自己的getValue实现。 因此,它为我的超类提供了在运行时使用此方法的不同实现的机会(在您的情况下)。我希望它能说清楚。看看模板方法模式,你会得到一个更好的主意。
答案 2 :(得分:0)
创建一个同时对Big
和Small
进行操作的方法将有助于更好地说明这一点。
假设您已在问题中使用了相同的类定义,则可以创建一个同时打印getValue()
和value
的方法。因为Big extends Small
,您只需要一种方法。
public void printValues(Small val) {
System.out.println("getValue() == " + val.getValue());
System.out.println("value == " + val.value);
}
如果没有具有该关系,并且能够将Big
个对象分配给Small
变量(请记住:将值传递给方法与分配相同一个变量),你需要有两种不同的方法来处理这种情况。
将extends
关键字视为含义A Big is a more specific type of Small
会有所帮助。通常,最好使用至少特定类型来编写处理事物的方法,因为它将允许该方法处理您甚至还没有想到的情况。
例如,假设在某个地方,有人决定写
class Medium extends Small {
public Medium() {value = 20;}
public int getValue() {return value-5;}
}
printValues()
方法已经可以处理这个类,即使我们在编写它时不知道Medium
。