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



我在Java中有一个用于获取Date的类。我想知道如何在不更改它的情况下访问这个类。(德语中的代码i,但只是几个单词)

这是我无法更改的类:

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

    }
}

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

我试图通过解释你的代码实际做什么来回答这个问题。

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

heute()返回基准面的实例,但您永远不会将其存储在任何位置。

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

因此,要解决您的Aufgabe 3问题,您需要:

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

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

试试这个

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

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

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

你应该这样做:

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

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

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

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

溶液:

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

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

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

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

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

Datum.heute() 是一个静态(类)方法,它返回一个 Datum(对象),而您又可以在该上调用非静态 Datum 方法。意义?干杯,

你的 Datum 类方法getTag()是一个实例方法,你试图用类名调用它,这是不可能的,因为实例方法是在对象创建后实例化的,而只有静态成员在类加载后实例化。

因此,您必须创建基准类的对象才能调用getTag()方法:

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

您可以创建类基准的对象以获得非静态访问:

public class Aufgabe3 {
    public static void main(String[] args) {
        Datum datum = new Datum()
        System.out.println(datum.getTag());
    }
}

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

注意:- 这只是因为您已经将所有变量声明为非静态,如果没有直接使用类名的 Object,您就无法访问它们(就像您现在所做的那样,因为它们没有声明为静态。

从您在异常中的行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());
}  

愿这对你有所帮助。

最新更新