我正在努力解决这个问题。
在我的项目中,我有一个名为'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方法只能调用静态方法,那么如何完成我正在做的事情,即设置和检索对象的字段?在什么情况下,我怎么能做这个限制只能调用静态方法?????
答案 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
。
创建必要的对象有两个合理的位置。
Hello的初始化。
public MyObj an_obj= new MyObj();
public static void main(String[] args)
{
setObj();
}
在main()
中public MyObj an_obj;
public static void main(String[] args)
{
an_obj= new MyObj()
setObj();
}
无论哪种方式,您都必须实际创建一个对象。
此外,您可以将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%)。
保罗。