Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用一个类声明一个对象并将其分配给另一个类有什么好处吗?_Java_Class_Object - Fatal编程技术网

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

Java 使用一个类声明一个对象并将其分配给另一个类有什么好处吗?,java,class,object,Java,Class,Object,在我大学的一个Java课程中,我们教授这个例子。虽然我确实理解这是如何工作的,但我无法想象一个现实生活中这种做法可能有用的例子。在我看来,这使代码更难理解。更具体地说,使用一个类声明一个对象并将其分配给另一个类(smallBig=new Big();)是否有某种好处?您能给我一个简单的场景,说明这种做法可能有用吗 守则: public class Small { public int value; public Small() {value = 10;} public int

在我大学的一个Java课程中,我们教授这个例子。虽然我确实理解这是如何工作的,但我无法想象一个现实生活中这种做法可能有用的例子。在我看来,这使代码更难理解。更具体地说,使用一个类声明一个对象并将其分配给另一个类(
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

我认为在这个senario中,它会很有用:

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);
} 
}


希望我能帮助您。

在本例中,您使用的是getValue作为模板方法“”

让我们以你为例,略带曲折

public class Small { 
public int value; 
public Small() {value = 10;} 
public int getValue() {// this method fetches data from database} 
}

}

正如您所看到的,getValue的实现正在发生变化。每个子类都提供自己的getValue实现。
因此,它为我的超类提供了在运行时使用此方法的不同实现的机会(在您的例子中)。我希望这能说明问题。看看模板方法模式,你会有一个更好的想法。

创建一个在
Big
s和
Small
s上运行的方法将有助于更好地说明这一点

假设问题中已经使用了相同的类定义,您可以创建一个方法来打印
getValue()
value
。因为
大扩展小
,所以您只需要一种方法

public void printValues(Small val) {
    System.out.println("getValue() == " + val.getValue());
    System.out.println("value == " + val.value);
}
如果没有这种关系,并且能够将
Big
对象分配给
Small
变量(请记住:将值传递给方法与分配变量相同),则需要使用两种不同的方法来处理这种情况

extends
关键字理解为
A Big是一种更具体的Small
。一般来说,最好编写使用最不特定的类型来处理事情的方法,因为它将允许该方法处理您甚至还没有想象到的情况

例如,假设有人决定写一篇文章

class Medium extends Small {
    public Medium() {value = 20;} 
    public int getValue() {return value-5;} 
} 

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

Google“多态性”。长话短说:您定义了一个每个人都可以依赖的接口,并隐藏了实现细节。基本示例:Java collection API,其中
List
是一个接口,定义每个列表的行为方式,
ArrayList
是一个列表的实现,使用数组作为支持概念。请注意术语。您不是“声明一个对象并将其分配给另一个类”,而是声明一个类型的变量,并将其分配给一个新实例化的子类型对象。声明变量;你实例化了对象。@IanMcLaird我会记得,也许你可以修改标题,使它更适合主题?你应该解释一下它是如何有用的。因此,基本上这是对代码的更明智的使用。不过,在我自己的项目中使用它,我还是觉得不太舒服,感觉它降低了可读性,但我想它会对我产生影响,对你也会产生影响。从长远来看,你会发现这类事情非常自然和可读。上面关于“编码到接口”的评论很贴切。是的,例子很清楚。虽然,在一个大型项目中,这种做法会不会降低代码的可读性,或者我会有这种感觉,因为我对它还不满意吗?当然不会。正如您所知,我们编程到接口,现在这并不意味着我们必须创建一个单独的接口,并让所有类实现它(我们最终将得到大量的接口)。接口通常用于连接两个组件或模块。类的公共方法是它的接口。如果模块X包含4个对象,这4个对象将使用彼此的公共方法(public interace)来完成工作,但是如果我可以为模块提供一个单独的接口,这样我就可以为它进行单独的实现。希望它能把事情说清楚。
class Medium extends Small {
    public Medium() {value = 20;} 
    public int getValue() {return value-5;} 
}