首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用类声明对象并将其分配给另一个类有什么好处?

使用类声明对象并将其分配给另一个类有什么好处?
EN

Stack Overflow用户
提问于 2014-12-01 13:22:29
回答 3查看 65关注 0票数 0

在我大学的Java课程中,我们教这个例子。虽然我当然理解这是如何工作的,但我无法想象现实生活中的一个例子,在这个例子中,这种实践可能是有用的。在我看来,这会使代码更难理解。更具体地说,使用类声明对象并将其分配给另一个类(Small smallBig = new Big();)是否有一定的好处,您能给出一个简单的场景,在这个场景中,这个实践可能很有用吗?

守则:

代码语言:javascript
运行
复制
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); 
    } 
}

产出:

代码语言:javascript
运行
复制
10
30 
30
10
10 
40
30 
10
30 
40
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-01 13:48:13

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

假设问题中已经使用了相同的类定义,则可以创建一个同时打印getValue()value的方法。因为Big extends Small,您只需要一种方法。

代码语言:javascript
运行
复制
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的意思是很有帮助的。一般来说,最好是编写使用最小特定类型来处理事情的方法,因为它将允许该方法处理您还没有想象过的情况。

例如,假设某一行的某个地方,有人决定写

代码语言:javascript
运行
复制
class Medium extends Small {
    public Medium() {value = 20;} 
    public int getValue() {return value-5;} 
} 

printValues()方法已经可以处理这个类了,尽管我们编写它时并不知道Medium

票数 0
EN

Stack Overflow用户

发布于 2014-12-01 13:33:01

我觉得在这份文件里会很有用的:

代码语言:javascript
运行
复制
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);
} 

}

希望我能帮你。

票数 0
EN

Stack Overflow用户

发布于 2014-12-01 13:44:26

在本例中,您使用getValue作为模板方法"pattern“。

让我们以你为例

代码语言:javascript
运行
复制
public class Small { 
public int value; 
public Small() {value = 10;} 
public int getValue() {// this method fetches data from database} 

}

代码语言:javascript
运行
复制
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实现。因此,它使我的超类有机会在运行时使用此方法的不同实现(在您的情况下)。我希望这能说明清楚。看看模板方法模式,你会得到一个更好的想法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27229410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档