类作为变量类型

时间:2013-12-30 01:26:41

标签: java object-reference

我是第二学期学习计算机科学的新手。对不起德语课程。但我希望理解它不会是一个问题。它基本上是关于转换货币。

我的问题是:作为变量/数据类型的类的功能在这里是什么?我的意思是在类dm(deutsche mark)中你有一个带有给定参数的构造函数(Euro a)。我应该将“a”视为欧元类别的新对象吗?或者究竟是什么?我在很多场合看到过这种变量,显然它很常见。我希望有人能帮帮忙。

谢谢!

梅尔

public abstract class waehrung {
    public abstract double dollarBetrag();
}   

public class Euro extends waehrung {
    private static double kurs = 1;
    private double wert;

    public Euro(double wert){
        this.wert = wert; 
}

    public double dollarBetrag(){
        return wert*kurs;
    }

    public double euroBetrag(){
    return wert;
    }

    public static void setEuroKurs(double Kurs){
        kurs = kurs;
    }   
}

class DM extends Euro{
    public DM (double dm){      
        super(dm/1.95583);
    }

    public DM(Euro a){  
        super(a.euroBetrag());
    }   

    public double waehrungsBetrag() {
        return euroBetrag()*1.95583;
    }
}

4 个答案:

答案 0 :(得分:1)

您应该将a视为对类Euro的对象的引用。它来自用于构造DM对象的代码:

DM dm = new DM(euro);

其中euro是对类Euro的某个对象的引用。在构造函数中,这变为a

答案 1 :(得分:1)

问题:

  

这里作为变量/数据类型的类的功能是什么?我的意思是   在类dm(deutsche mark)中你有构造函数   给定参数(欧元a)。我应该把“一个”想象成一个新的对象   欧元?或者究竟是什么?我看到了这种变量   很多场合,显然很常见

 public DM(Euro a){  
        super(a.euroBetrag());
 }

答案:a是一个变量,其类型是欧元,因此a(称为引用)是指一个Euro对象。您的示例中的欧元对象可以是DMEuro

答案 2 :(得分:0)

请注意DMEuro的子类,并且在其构造函数中

public DM(Euro a){  
    super(a.euroBetrag());
} 

它调用a.eurobetrag()并将其传递给超类构造函数:

public Euro(double wert){
    this.wert = wert; 
}

因此,a不是DM类的变量,它只是用于获取值a.euroBetrag(),然后将其分配给属性wert

this.wert = wert; 

答案 3 :(得分:0)

public DM(Euro a){  

a不是“新”对象。当程序的其余部分使用此构造函数时,它将需要一个现有的 Euro对象,如下所示:

Euro someEuroVariable;  // for example
...
DM d = new DM(someEuroVariable);

然后构造函数将使用someEuroVariable作为参数,它将引用为a。但是没有创建新的Euro对象。

希望这有帮助。

编辑:回答评论中的问题:你不能说

DM d = new DM();

因为DM没有可以在没有参数的情况下使用的构造函数。但是,假设您使用了像

这样的合法构造函数
DM d = new DM(1.234);

现在你说

Euro a = d;

ad将引用相同的对象。此对象的运行时类型为DM。当您声明变量a具有类型Euro时,这意味着a在其生命周期内可以是Euro 类型的对象或其任何类型的对象子类。但是,由于编译器无法确定运行时实际类型的内容,因此如果为a.method()定义了方法,则只能使用方法Euro。如果DM包含method2没有的新方法Euro,则无法直接使用a.method2()进行调用。这也意味着稍后,您可以将a重新分配给具有其他子类的对象:

a = new Lira(100000000000.0);

虽然您无法对d执行此操作,因为它只能是DM类型或DM的子类:

d = new Lira(100000000000.0);  // Error at compile time

编译时类型和运行时类型之间的区别在您习惯之前很难掌握。它与将Euro作为参数传递给DM构造函数时发生的情况完全无关;作为参数传递的对象是一个单独的对象,并且必须在调用构造函数之前存在。