2013-05-03 73 views
1

我被下面的代码卡住了一个问题。当我尝试调用setFavoritePicture方法时,我不断收到主方法中的编译器错误。它表示非静态变量favPic不能从静态上下文中引用。我相对较新的Java,所以任何帮助,将不胜感激!非常感谢!非静态变量favPic不能从静态上下文中引用

public class House 
{ 
    String owner; 
    Picture pRef; 
    Picture [] picArray; 
    Picture favPic; 

    public void setFavoritePicture (Picture pRef) 
    { 

    Picture favPic = new Picture (FileChooser.pickAFile()); 
    pRef = favPic ; 


    } 



    public static void main (String [] args) 
    { 
    House PhDsHouse = new House ("Mad PH.D."); 
    PhDsHouse.setFavoritePicture (favPic); 


    } 


} 

回答

1

favPicHouse类的非静态实例成员,你正试图从你的静态main方法中引用它。您需要创建的Picture一个实例,并把它传递代替:

Picture pic = new Picture(FileChooser.pickAFile()); 
PhDsHouse.setFavouritePicture(pic); 

但是,似乎有与此代码稍微更深层次的问题,如根据传递的参数你setFavoritePicture方法并不实际设置favPic,它会根据FileChooser.pickAFile进行设置,然后将该值分配给传递的参数(不会实现任何内容)。

也许你想要做这样的事情,而不是:

public void setFavoritePicture (Picture pRef) 
{ 
    favPic = pRef; 
} 

更新:关于你的评论:

我需要的 'setFavoritePicture' 的方法中,使用选择一个图片, 'FileChooser.pickAFile()'。这就是这个 方法的全部意义。

在这种情况下,为什么你需要一个参数?也许这样?

public class House 
{ 
    String owner; 
    Picture [] picArray; 
    Picture favPic; 

    public void setFavoritePicture() 
    { 
     Picture pic = new Picture (FileChooser.pickAFile()); 
     this.favPic = pic; 
    } 

    ... /* Rest of your class here */ 

    public static void main (String [] args) 
    { 
     House PhDsHouse = new House ("Mad PH.D."); 
     PhDsHouse.setFavoritePicture(); 
    } 
} 

在上面的代码,您实例化你House,然后调用其setFavoritePicture方法。如果创建新图片后的所有逻辑都通过该方法处理,包括对FileChooser.pickAFile的调用,则不需要传递任何内容。

话虽如此,但在我看来,的setFavoritePicture的责任应该是设置对象的喜欢的图片,并在处理文件选择和用户输入应该在其他地方(如我在前面的例子中,pRef被外界实例化完成的方法并通过)。

+0

Hes这样做setFavouritePicture里面。我不认为他理解OOP。他需要摆脱变种并使用它。 – Nix 2013-05-03 21:53:07

+0

然后注意''setFavouritePicture'方法实际上没有做任何事情......设置参数的值不会改变对象的状态。 – 2013-05-03 21:53:16

+0

我没有那样做吗? – Alex 2013-05-03 21:54:42

相关问题