我正在努力解决这个问题.
在我的项目中,我有一个名为'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());
}
}
Run Code Online (Sandbox Code Playgroud)
在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;
}
}
Run Code Online (Sandbox Code Playgroud)
然而,这给出了错误:
"无法从类型Hello"对静态方法setObj()进行静态引用.
如果我在setObj的声明中添加'static',即
public static void setObj()
Run Code Online (Sandbox Code Playgroud)
然后我得到:
无法对非静态字段an_obj进行静态引用.
我的问题是,如果启动程序的唯一方法是使用Main方法,并且main方法只能调用静态方法,我怎样才能完成我正在做的事情,即设置和检索对象的字段?在什么,我怎么能做这个限制只能调用静态方法?????
Ros*_*oss 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());
}
}
Run Code Online (Sandbox Code Playgroud)
这两种方法的主要区别在于,在第一种方法中,"an_obj"是静态的 - 也就是说,整个程序只有一个变量.如果要实例化多个Hello对象,它们都将具有相同的"obj"引用.在第二个中,每个Hello对象都有自己的"obj"引用,每个引用都可以指向不同的MyObj实例.
显然,在这种简单的情况下,它不会以某种方式产生任何差异,但一般来说,应尽可能避免使用静态成员和方法.
同时制作setObj()
方法和an_obj
变量static
,或者执行以下操作:
public static void main(String[] args) {
new Hello().setObj();
}
Run Code Online (Sandbox Code Playgroud)