Используйте функцию из другого класса, не изменяя ее (статическая ссылка на нестатический метод)
У меня есть класс в 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());
}
}
Когда я пытаюсь запустить код, он говорит: "Невозможно сделать статическую ссылку на нестатический метод getTag() из типа Datum". Как я могу получить доступ к дате без изменения класса Datum?
10 ответов
Это потому что getTag()
это не статический метод.
попробуй это
Datum dt = Datum.heute();
System.out.println(dt.getTag());
Я пытаюсь ответить на этот вопрос, объясняя, что на самом деле делает ваш код.
Выполняя Datum.heute();
вы делаете вызов статического метода heute()
вашей Datum
учебный класс. Статический метод не зависит от фактического экземпляра, то есть объекта этого класса.
heute()
возвращает экземпляр Datum, но вы никогда его не сохраните.
Затем во второй строке вы пытаетесь позвонить Datum.getTag()
, Так как вы делаете вызов классу Datum, а не объекту (который был бы someDatumObject.getTag()
например), компилятор Java пытается найти статический метод.
Итак, чтобы решить свой Aufgabe 3 вам нужно:
- создать экземпляр через
heute()
- вызов
getTag()
на этом объекте
Ваш heute()
метод static
и, следовательно, использование является правильным, но для вызова getTag()
вам нужно использовать объект, возвращенный из heute()
метод.
Datum date = Datum.heute();
System.out.println(date.getTag());
Эта строка в вашем коде вызывает проблему:
System.out.println (Datum.getTag ());
getTag()
метод не является статическим и не может быть указан непосредственно в main
метод без создания объекта Datum
,
Решение:
System.out.println(Datum.heute().getTag());
С вашей линии в Исключении 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());
}
Пусть это поможет вам.
Вы можете создать объект класса Datum для получения нестатического доступа:
public class Aufgabe3 {
public static void main(String[] args) {
Datum datum = new Datum()
System.out.println(datum.getTag());
}
}
Ваш метод класса Datum getTag()
является методом экземпляра, и вы пытаетесь вызвать его с именем класса, что невозможно, потому что методы экземпляра создаются после создания объекта и только статические члены создаются после загрузки класса.
Итак, вы должны создать объект вашего класса Datum для вызова getTag()
метод:
Datum d = Datum.heute();;
System.out.println(d.getTag());
Если вы хотите напечатать сегодняшнюю дату, вы можете
public static void main(String[] args) {
System.out.println( Datum.heute().getTag() );
}
Datum.heute()
статический (класс) метод, который возвращает Datum
(объект), по которому вы, в свою очередь, можете вызывать нестатический Datum
методы. Имеет смысл? Ура,
Создайте объект из вашего базового класса, как в методе main. Базовые данные = новые базовые данные (); а затем попробуйте использовать datum.getTag();
Примечание:- Просто потому, что вы объявили все свои переменные нестатическими, вы не можете получить к ним доступ без объекта, напрямую использующего имя класса (как вы делаете сейчас, потому что они не объявлены как статические.)
Ваш getTag()
Метод не является статическим, поэтому вы не можете вызывать / вызывать этот метод без объекта, поэтому вы получаете эту ошибку.
Что вы можете сделать, это присвоить переменную объекту, возвращаемому Datum.heute()
а затем вызвать getTag()
на этом объекте
Вы должны сделать это так:
Datum d = Datum.heute();
System.out.println(d.getTag());