Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.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_Eclipse_Static_Non Static - Fatal编程技术网

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

Java 使用其他类中的函数而不修改它(对非静态方法的静态引用),java,eclipse,static,non-static,Java,Eclipse,Static,Non Static,我有一个Java类,用于获取日期。我想知道如何访问这个类而不改变它。(我用德语写的代码,但只有几个字) 这是我不能改变的课程: import java.util.Calendar; public class Datum { private int tag; private int monat; private int jahr; /** * Standard Datum 1.1.1970 */ public Datum() {

我有一个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));
    }


}
当我尝试运行代码时,它会说“无法从类型数据对非静态方法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()
方法是
静态的,因此使用是正确的,但是要调用
getTag()
您需要使用从
heute()
方法返回的对象

Datum date = Datum.heute();
System.out.println(date.getTag());
这是因为
getTag()
不是静态方法

试试这个

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

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

public static void main(String[] args) {
    System.out.println( Datum.heute().getTag() );
}
Datum.heute()
是一个静态(类)方法,它返回一个
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()


注意:-这只是因为您已将所有变量声明为非静态变量,您无法在没有对象的情况下直接使用类名访问它们(正如您现在所做的那样,因为它们未声明为静态变量)。

从您的异常行
无法对非静态方法getTag()进行静态引用从类型数据中可以看出,您不能直接通过类名访问非静态方法(就像直接通过类名访问任何静态方法一样),要访问非静态方法,您需要该类的引用/对象

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

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

希望这对您有所帮助。

我试图通过解释您的代码的实际功能来回答这个问题

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

heute()
返回一个数据实例,但您从不将其存储在任何地方

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

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

  • 通过
    heute()
  • 对该对象调用
    getTag()
System.out.println(Datum.heute().getTag());
public static void main(String[] args) {
    Datum obj = Datum.heute();
    System.out.println(obj.getTag());
}