2013-08-17 8 views
1

Java로 더 좋아지기 때문에 확장하려는 간단한 블랙 잭 프로그램을 작성 중입니다. 내 과정은 상속을 매우 잘 처리하지 못했고 하위 클래스를 전혀 다루지 않았습니다.하위 클래스의 인스턴스 메소드 호출 생성자

플레이어가 게임을 종료하기로 결정하면 플레이어의 총 칩 카운트를 인쇄하고 싶습니다. 내가 잘 알고 있어요 유일한 static 최상위 방법에 있기 때문에 내가, 이클립스 비 정적 필드에 의해 무엇을 의미하는지 아무 생각이

Cannot make a static reference to the non-static field alice.

: 나는 인쇄 명령문을 작성 할 때마다, 나는 오류가 발생합니다. 참조 용으로 완전히 별도의 클래스 Player을 만들어야합니까?

서브 클래스와 전체 main 메소드에 관한 스 니펫을 첨부했습니다. 또한, 이것은 내 포트폴리오를 구축하는 데 도움이되는 숙제가 아닌 개인 프로젝트이기 때문에 귀하가 합당하다고 생각하는 조언을 환영합니다. 도와 주셔서 감사합니다. 앨리스 내 변수는 비 정적 선언하지만 정적 주요 방법에서 사용되는

+0

'static Player alice = new Player (0, 250);' –

답변

2

귀하의 변수 alice 정적 main()에 사용되는, main() 객체의 내부에 "존재"하지 않는다, 그러나 당신의 변수 alice 한 안에 있어야합니다. 비 정적 메서드 run() "내부"객체를 실행하는 코드에이 변경 작업을 수행 (실행 메인과 같은 코드를 가지고, 그냥 비 정적 방법으로 변경되었다) :

public static void main(String[] args) { 
    new BlackJack().run(args); 
} 

public void run(String[] args) { 
    System.out.println("Welcome to Black Jack. Type begin to get started."); 

    String begin = "begin"; 
    String end = "end"; 
    Scanner keyboard = new Scanner(System.in); 

    while (!keyboard.equals(end)) 
    { 

    } 
    System.out.println("You walked away with $" + alice.getWallet() + ". Thanks for playing!"); 
} 
+0

와우. 나는 그 멋진 간계가 아니었다. 감사합니다! – rice2007

0

public class BlackJack 
{ 

public class Player extends BlackJack 
{ 
    public int wallet; 
    private int hand; 

    public Player(int playerHand, int playerWallet) 
    { 
     wallet = playerWallet; 
     hand = playerHand; 
    } 

    public int getWallet() 
    { return wallet; } 
} 

Player alice = new Player(0, 250); 

public static void main(String[] args) 
{ 
    System.out.println("Welcome to Black Jack. Type begin to get started."); 

    String begin = "begin"; 
    String end = "end"; 
    Scanner keyboard = new Scanner(System.in); 

    while (!keyboard.equals(end)) 
     { 

     } 
    System.out.println("You walked away with $" + alice.getWallet() + ". Thanks for playing!"); 
} 

} 노 NO. 없다 어떤 사람들은 앨리스를 정적 ​​변수로 만들 것을 제안 할지도 모르지만 나는 이것을 반대한다. 대신 프로그램을 실행하고 실행하기에 충분할 정도로 메인 메소드를 매우 짧게 만드십시오. 그리고 다른 클래스, 아마도 Game 클래스, 비 정적 메소드 및 필드를 가진 클래스가 실제로 게임을 실행하게하십시오. main 메소드는 Game 인스턴스를 생성 한 다음이 게임 인스턴스에 대한 메소드를 호출하여 전체 게임을 시작하게합니다.

플레이어의 개념이 무엇이든간에 "블랙 잭"의 더 전문화 된 개념이 아니기 때문에 플레이어가 블랙 잭 클래스를 확장하게하는 방법을 알 수 없습니다.

+0

'extends BlackJack'은 실수입니다. 나는 뭔가를 시도했고, 이클립스를 수정 사항으로 추가하기로 결정했다.나는 그것을 잊어 버리는 것을 잊었다. – rice2007

+0

@ rice2007 : BlackJack 클래스 내부에서 Player 클래스를 중첩하는 것처럼 보이기도합니다. –

+0

@ Hovercraft : 다른 클래스를 클래스 내부에 중첩시키는 것이 적절한 때는 언제입니까? 나는 그것이 일어난 것을 보았습니다, 그리고 이것은 문자 그대로 처음으로 중첩 된 클래스를 가졌습니다. – rice2007

0

귀하의 변수 alicestatic 수정 자없이 선언되었습니다. 즉,이 객체는 포함하는 클래스의 인스턴스가 인스턴스화되었을 때만 사용할 수 있습니다.

그러나 public static void main() 메서드에서 alice.getWallet()static을 사용하십시오. static은,이 메소드가 둘러싸는 클래스의 오브젝트를 작성하지 않아도 불려 갈 수있는 것을 의미하므로, 메소드는 액세스 할 수없는 비 정적 오브젝트 alice에 액세스하려고합니다.

alice을 정적으로 만들면 작동합니다.

더 좋은 방법은 당신의 프로그램이 main() 방법에 시작하고 비 정적 Game 클래스 또는 비슷한에 갈 수 있도록하는 것입니다. 정적 수정자를 사용하는 번거 로움이 없습니다.

0

주 방법으로 Player alice = new Player(0, 250);을 이동하십시오!

관련 문제