Как преодолеть ограничения Java-метода Static Main () - PullRequest
0 голосов
/ 04 января 2009

Я пытаюсь решить это.

В моем проекте у меня есть файл с именем 'Hello.java', который является файлом с аргументом main () и который вызывается при компиляции программы. И у меня есть еще один файл с именем MyObj.java, в котором есть только случайный класс, который я создал для тестирования возможностей Java-ов. Я пытаюсь сделать это:

class Hello
{
    public MyObj an_obj;
    public static void main(String[] args)
    { 
        setObj();
    }       

    public void setObj()
    {
        this.an_obj.set_size(7);
        say("size is " + this.an_obj.get_size());
    }    
}

В классе MyObj.java у меня есть этот код:

public class MyObj
{
    private int size;

    public MyObj()
    {
        //do nothing
    }

    public void set_size(int new_size)
    {
        this.size=new_size;
    }

    public int get_size()
    {
        return this.size;
    }   
}

Это, однако, дает ошибку:

"Невозможно сделать статическую ссылку на нестатический метод setObj () из введите Hello ".

Если я добавлю 'static' к объявлению setObj, то есть

public static void setObj()

Тогда я получаю:

Невозможно сделать статическую ссылку на нестатическое поле an_obj.

У меня вопрос: как мне выполнить то, что я делаю, то есть установить и получить поле объекта, если единственный способ запустить программу - это метод Main, а метод main может вызывать только статические методы? Что, как я могу сделать что-либо вообще с этим ограничением возможности вызывать только статические методы ?????

Ответы [ 6 ]

14 голосов
/ 04 января 2009

Вы можете либо добавить «static» к переменной-члену, либо создать экземпляр класса из основного метода. Вот пример кода для обоих подходов:

/* Static */
class Hello {
    public static MyObj an_obj;
    public static void main(String[] args) { 
        setObj();
    }           

    public static void setObj() {
        this.an_obj.set_size(7);
        say("size is " + this.an_obj.get_size());
    }
}

/* Non-Static */
class Hello {
    public MyObj an_obj;
    public static void main(String[] args) {
        Hello hello = new Hello(); 
        hello.setObj();
    }           

    public void setObj() {
        this.an_obj.set_size(7);
        say("size is " + this.an_obj.get_size());
    }
}

Основное различие между этими двумя подходами состоит в том, что в первом случае «an_obj» является статическим, то есть существует только одна переменная для всей программы. Если бы вам нужно было создать несколько объектов Hello, все они имели бы одинаковую ссылку «obj». Во втором случае каждый объект Hello имеет собственную ссылку «obj», каждая из которых может указывать на отдельный экземпляр MyObj.

Очевидно, что в этой простой ситуации это не имеет никакого значения так или иначе, но, вообще говоря, статических членов и методов следует избегать, когда это возможно.

8 голосов
/ 04 января 2009

Создайте метод setObj() и переменную an_obj static или выполните что-то вроде:

public static void main(String[] args) {
    new Hello().setObj();
}
5 голосов
/ 04 января 2009

В дополнение ко всем предыдущим ответам я хотел бы упомянуть об этом только потому, что вы не понимаете концепцию языка, которая не обязательно представляет собой «ограничение».

2 голосов
/ 04 января 2009

Вы никогда не создавали экземпляр MyObj.

Есть два логических места для создания необходимого объекта.

  1. Привет инициализации.

    public MyObj an_obj= new MyObj();
    public static void main(String[] args)
    { 
        setObj();
    }       
    
  2. Внутри основной ()

    public MyObj an_obj;
    public static void main(String[] args)
    { 
        an_obj= new MyObj()
        setObj();
    }       
    

В любом случае, вам действительно нужно создать объект.

Кроме того, вы можете сделать setObj статическим. Однако это редко то, что вы намереваетесь.

Правильная вещь для главного: (1) создавать соответствующие объекты и (2) передавать управление этим объектам Это то, что вы должны сделать.

class Hello
{
    public MyObj an_obj= new MyObj();
    public static void main(String[] args)
    { 
        Hello aHelloObject= new Hello();
        aHelloOject.setObj();
    }       

    public void setObj()
    {
        this.an_obj.set_size(7);
        say("size is " + this.an_obj.get_size());
    }    
}
0 голосов
/ 04 января 2009

С простой точки зрения в Java есть две разные вещи:

  • объекты
  • статические переменные / функции

Объекты создаются во время выполнения, когда вы вызываете их создание. Статические вещи (все они) всегда есть и загружаются по мере необходимости.

Хотя вы можете смешивать и сочетать их в своих классах, вы должны быть осторожны с их использованием. Статическая вещь может вызывать объект, но она должна сначала создать его версию. Созданный объект может вызывать любую статическую вещь, которая ему нравится.

Мы склонны создавать классы, которые являются объектами И также имеют несколько статических битов, но вы можете иметь все статические вещи в классе, если хотите, или вы можете просто иметь все объекты на основе объектов.

Статические вещи обычно не одобряются, потому что они по сути глобальны, что открывает больше возможностей для странного поведения. Объекты без статических битов являются лучшими, и, как правило, являются поточно-ориентированными, если они не вызывают вещи вне своих внутренних данных (сделать 95% вашего кода простым и безопасным, а затем справиться со сложными 5% в некоторых специальных классах).

Paul.

0 голосов
/ 04 января 2009

Вы можете вызывать метод экземпляра (т. Е. Не static метод), когда у вас есть экземпляр класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...