使用类声明对象并将其分配给另一个类是否有一定的好处?

时间:2014-12-01 13:22:29

标签: java class object

在我大学的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

3 个答案:

答案 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)

创建一个同时对BigSmall进行操作的方法将有助于更好地说明这一点。

假设您已在问题中使用了相同的类定义,则可以创建一个同时打印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