определяется как статический.

й день!

Я новичок в Java. Я не могу скомпилировать следующий код:

public class Test {
 public static void main (String [] args ){
  int a = calcArea(7, 12);
  System.out.println(a);
 }

 int calcArea(int height, int width) {
  return height * width;
 }
}

Появляется следующая ошибка:

Non-static method calcArea(int, int) cannot be referenced from static content

Что это значит? Как я могу решить эту проблему ..?

Ваш ответ будет высоко оценен. Спасибо

Основываясь на вашем совете, я сделал экземпляр, который является новым test () следующим образом:

public class Test {
    int num;
    public static void main (String [] args ){
        Test a = new Test();
        a.num = a.calcArea(7, 12);
        System.out.println(a.num);
    }

    int calcArea(int height, int width) {
            return height * width;
    }

}

Это верно? Какая разница, если я сделаю это ...

public class Test {
 public static void main (String [] args ){
  int a = calcArea(7, 12);
  System.out.println(a);
 }

 static int calcArea(int height, int width) {
  return height * width;
 }
}
 Sdaz MacSkibbons23 янв. 2011 г., 16:49
Относительно ваших правок: во-первых,calcArea является методом экземпляра, который вызывается для объекта и (как правило) выполняет действия, связанные с этим объектом. Вторая делаетcalcArea статический (класс) метод, который (обычно) обычно просто выполняет действия без какого-либо экземпляра объекта. Вот,calcArea работает над аргументами, возвращая результат, что прекрасно подходит для метода класса. Теперь в классе Rectangle с методом экземпляраcalcArea() (без параметров), вы можете увидеть, как он может вместо этого умножить свои собственные переменные-члены высоты и ширины, чтобы получить результат, специфичный для объекта.

Ответы на вопрос(5)

поэтому вы можете вызывать его без экземпляра класса test (new test()). Но это вызываетcalcArea который НЕ является статическим: ему нужен экземпляр класса

Вы могли бы переписать это так, я думаю:

public class Test {
 public static void main (String [] args ){
  int a = calcArea(7, 12);
  System.out.println(a);
 }

 static int calcArea(int height, int width) {
  return height * width;
 }
}

Как показывают комментарии и другие ответы, вы, возможно, не захотите идти этим путем навсегда: вы получите только статические функции. Выясните, какой на самом деле должна быть статика в вашем коде, и, возможно, сделайте себя объектом и вызовите функцию оттуда: D

 maaartinus23 янв. 2011 г., 16:07
Это правда, но так начинающий заканчивается тем, что все методы статичны. Плохо. Я бы посоветовал как можно скорее оставить статический контекстpublic static void main (String [] args) {new Test().go(args);}
 Nanne23 янв. 2011 г., 16:09
правда, @maaartinus, но без контекста программы трудно угадать, что и где и почему. Но @newbie действительно может это проверить.
Решение Вопроса

что предложила Нанн, определенно решит вашу проблему. Тем не менее, я думаю, что было бы разумно, если бы вы вошли в привычку прямо сейчас, пока вы находитесь на раннем этапе изучения Java, пытаться использовать как можно меньше статических методов, за исключением случаев, когда это применимо (например, служебные методы). , Вот ваш код, модифицированный для создания экземпляра Test и вызова метода calcArea для вашего объекта Test:

public class Test {
 public static void main (String [] args ){
  Test test = new Test();
  int a = test.calcArea(7, 12);
  System.out.println(a);
 }

 int calcArea(int height, int width) {
  return height * width;
 }
}

По мере того, как вы углубляетесь в кодирование с использованием Java и, предположительно, учитывая, что код, который вы только что написали, начинают работать с объектами, такими как объекты многоугольников, метод, подобный calcArea, принадлежит контексту экземпляра, а не статическому контексту, поэтому он может работать на внутреннее состояние ваших объектов. Это сделает ваш код более объектно-ориентированным и менее процедурным.

 newbie23 янв. 2011 г., 16:12
спасибо @whaley

это означает, что вы можете вызывать этот метод через имя класса, например:

int a = Test.calcArea(7, 12);

без создания объекта,

Вот;Контрольная работа это имя класса, но для этогоCalcarea () метод должен быть статическим, иначе вы можете вызывать нестатический метод над объектом; Вы создаете объект, создавая экземпляр класса, такого как:

Test a = new Test();

здесь «а» является объектом типа Test и

a.calcArea(7,12);

можно вызвать, если методне определяется как статический.

calcArea не должно быть статичным. Для использования других методов в главном классе вы должны создать экземпляр его.

 public static void main (String [] args ){
  Test obj = new Test();
  int a = obj.calcArea(7, 12);
  System.out.println(a);
 }

 int calcArea(int height, int width) {
  return height * width;
 }
}

Если нет, посмотрите, но краткий ответ заключается в том, что статический метод не может (не может) получить доступ к «this», потому что он не назначен ни одному конкретному экземпляру класса. Поэтому нельзя вызывать метод экземпляра (не статический) из статического, потому что как компьютер узнает, на каком экземпляре должен выполняться метод?

 newbie23 янв. 2011 г., 16:14
спасибо @sinelaw
 Rekin23 янв. 2011 г., 15:58
Довольно хороший ответ, не знаю, действительно ли это заслуживает понижения.

Ваш ответ на вопрос