如何克服Java的Static Main()方法的局限性

时间:2009-01-03 21:49:27

标签: java

我正在努力解决这个问题。

在我的项目中,我有一个名为'Hello.java'的文件,它是带有main()参数的文件,在编译程序时会调用它。我有另一个名为MyObj.java的文件,它只是一个随机的类,我用来测试java的OO功能。我正在尝试这样做:

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“。

如果我在setObj的声明中添加'static',即

public static void setObj()

然后我得到:

  

无法进行静态引用   非静态字段an_obj。

我的问题是,如果启动程序的唯一方法是使用Main方法,并且main方法只能调用静态方法,那么如何完成我正在做的事情,即设置和检索对象的字段?在什么情况下,我怎么能做这个限制只能调用静态方法?????

6 个答案:

答案 0 :(得分:14)

您也可以向成员变量添加“static”,或者在main方法中实例化该类。以下是两种方法的示例代码:

/* 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实例。

显然,在这种简单的情况下,它不会以某种方式产生任何差异,但一般来说,应尽可能避免使用静态成员和方法。

答案 1 :(得分:8)

制作setObj()方法和an_obj变量static,或执行以下操作:

public static void main(String[] args) {
    new Hello().setObj();
}

答案 2 :(得分:5)

除了之前的所有答案之外,我想提及的只是因为你不理解一种语言概念并不一定构成“限制”。

答案 3 :(得分:2)

您从未创建过MyObj

的实例

创建必要的对象有两个合理的位置。

  1. Hello的初始化。

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

    public MyObj an_obj;
    public static void main(String[] args)
    { 
        an_obj= new MyObj()
        setObj();
    }       
    
  3. 无论哪种方式,您都必须实际创建一个对象。

    此外,您可以将setObj设为静态。但是,这很少是你想要的。

    正确的是main(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());
        }    
    }
    

答案 4 :(得分:0)

当您拥有类的实例时,您只能调用实例方法(即非static方法)。

答案 5 :(得分:0)

从简单的角度来看,Java中有两个不同的东西:

  • 物体
  • 静态变量/函数

当您创建对象时,会在运行时创建对象。静态的东西(所有这些东西)总是存在,并根据需要加载。

虽然您可以在课程中混合使用这些内容,但您必须小心使用它们。静态事物可以调用一个对象,但它必须首先创建它的一个版本。一个对象一旦创建就可以调用它喜欢的任何静态的东西。

我们倾向于创建作为对象的类并且还有一些静态位,但是如果需要,您可以在类中包含所有静态内容,或者您​​可以只拥有所有基于对象的内容。

静态的东西通常不受欢迎,因为它本质上是全局的,这为奇怪的行为开辟了更多的可能性。没有静态位的对象是最好的,如果它们没有调用自己内部数据之外的东西,通常是线程安全的(使95%的代码简单安全,然后在一些特殊类中处理复杂的5%)。

保罗。