使用其他类中的函数而不修改它(静态引用非静态方法)

时间:2014-01-10 10:48:19

标签: java eclipse static non-static

我有一个用于获取Date的Java类。我想知道如何访问这个类而不改变它。 (代码我用德语,但只是几个字)

这是我无法改变的课程:

import java.util.Calendar;


public class Datum {
    private int tag;
    private int monat;
    private int jahr;

    /**
     * Standard Datum 1.1.1970
     */
    public Datum() {
        this.tag = 1;
        this.monat = 1;
        this.jahr = 1970;
    }

    /**
     * 
     * @param tag   : tag > 0 und tag <= 31
     * @param monat : monat > 0 und monat <= 12
     * @param jahr  : jahr beliebig
     **/
    public Datum(int tag, int monat, int jahr) {
        assert(tag > 0 && tag <= 31);
        assert(monat > 0 && monat <= 12);

        this.tag = tag;
        this.monat = monat;
        this.jahr = jahr;
    }

    public int getTag() {
        return tag;
    }
    public void setTag(int tag) {
        this.tag = tag;
    }
    public int getMonat() {
        return monat;
    }
    public void setMonat(int monat) {
        this.monat = monat;
    }
    public int getJahr() {
        return jahr;
    }
    public void setJahr(int jahr) {
        this.jahr = jahr;
    }

    public static Datum heute(){
        Calendar c = Calendar.getInstance();
        return new Datum(c.get(Calendar.DAY_OF_MONTH),(c.get(Calendar.MONTH)+1),c.get(Calendar.YEAR));
    }


}

以下是我尝试获取当前日期的方式:

public class Aufgabe3 {

    public static void main(String[] args) {
        Datum.heute();
        System.out.println(Datum.getTag());


    }

}

当我尝试运行代码时,它说“无法从类型Datum中对非静态方法getTag()进行静态引用”。如何在不更改类Datum的情况下访问日期?

10 个答案:

答案 0 :(得分:1)

我尝试通过解释您的代码实际执行的操作来回答这个问题。

通过执行Datum.heute();,您可以调用heute()课程的静态方法Datum。静态方法独立于实际实例,即该类的对象。

heute()返回一个Datum实例,但你从不将它存储在任何地方。

然后在第二行中,您尝试拨打Datum.getTag()。由于您调用了Datum类而不是对象(例如someDatumObject.getTag()),因此java编译器会尝试查找静态方法。

所以要解决你的Aufgabe 3,你需要:

  • 通过heute()
  • 创建实例
  • 在该对象上调用getTag()

答案 1 :(得分:0)

您的getTag()方法不是静态的,因此如果没有对象,则无法调用/调用该方法,这就是您收到该错误的原因。

您可以做的是为Datum.heute()返回的对象分配一个变量,然后在该对象上调用getTag()

你应该这样做:

Datum d  = Datum.heute();
System.out.println(d.getTag());

答案 2 :(得分:0)

代码中的这一行导致了问题:

  

的System.out.println(Datum.getTag());

getTag()方法是非静态的,如果不创建main的对象,则无法在Datum方法中直接引用。

解决方案:

System.out.println(Datum.heute().getTag());

答案 3 :(得分:0)

您的heute()方法为static,因此使用正确,但要调用getTag(),您需要使用从heute()方法返回的对象。

Datum date = Datum.heute();
System.out.println(date.getTag());

答案 4 :(得分:0)

因为getTag()不是静态方法。

试试这个

Datum dt = Datum.heute();
System.out.println(dt.getTag());

答案 5 :(得分:0)

如果您想打印今天的日期,可以

public static void main(String[] args) {
    System.out.println( Datum.heute().getTag() );
}

Datum.heute()是一个静态(类)方法,它返回一个Datum(对象),您可以在其上调用非静态Datum方法。说得通? 欢呼声,

答案 6 :(得分:0)

您的Datum类方法getTag()是一个实例方法,您尝试使用类名调用它,这是不可能的,因为在创建对象后实例化实例方法,并且只有在类加载后实例化的静态成员。 / p>

因此,您必须创建一个Datum类的对象来调用getTag()方法:

Datum d = Datum.heute();;
System.out.println(d.getTag());

答案 7 :(得分:0)

您可以创建Class Datum的Object以获得非静态访问:

public class Aufgabe3 {

    public static void main(String[] args) {

        Datum datum = new Datum()
        System.out.println(datum.getTag());
    }
}

答案 8 :(得分:0)

制作基准类的对象。像这样在主方法中。 Datum datum = new Datum(); 然后尝试使用 datum.getTag();

注意: - 这只是因为你已经宣布所有变量都是非静态的,如果没有对象直接使用类名,你就无法访问它们(正如你现在所做的那样,因为它们不是声明为静态。)

答案 9 :(得分:0)

从Exception Cannot make a static reference to the non-static method getTag() from the type Datum中的行开始,它自己说不能直接通过类名访问非静态方法(比如直接通过类名访问任何静态方法),以访问您需要的非静态方法该类的参考/对象。

使用该对象创建类Datum的对象和访问方法getTag()

public static void main(String[] args) {
    Datum obj = Datum.heute();
    System.out.println(obj.getTag());
}  

愿这对你有所帮助。