2013-04-20 2 views
2

프로그래밍이 처음 이시라면, java를 처음 사용하십시오. 나는 클래스와 그 컴포넌트, 메소드 등과 같은 기본적인 부분을 이해하는 것 같지만, 어떻게 조합 할지를 알 수 없다. 예를 들어, 튜토리얼을 따라하고 생성하는 동안 전달 된 args를 기반으로 모든 카드가 될 수있는 클래스 카드를 작성하려고합니다.주요 메소드 및 클래스, 선언 할 위치는 어디입니까?

제 첫 번째 문제는 클래스 공개 선언 (5 행)을 선언하면 컴파일러에서 불법적 인 표현 시작이라고 말합니다.

public을 제거하면 정적 환경에서 비 정적 변수를 참조 할 수 없다는 println 문이 계속됩니다. 그것은 항상 정적 인 메인 메소드 내부에서 작업하기 때문입니다. 그래서 Card에 내부 상태를 읽고 println 문에 줄 수있는 메소드를 추가해야합니다. 주요 방법은 카드 클래스의 일부가 지금

내 중괄호 균형

public class Card {

 //declare states 
     //rank 1-13 for ace-king 
     //suit 1-4 spade,heart,club,diamond 
     public int rank; 
     public int suit; 

     //constructor 
     public Card(int startSuit, int startRank) { 
      rank = startRank; 
      suit = startSuit; 

     } 

     //methods for Card 




     public static void main(String[] args) { 
      //call Card constructor 
      //make card ace of spades (1,1) 
      Card aceOfSpades = new Card(1,1); 

      //read internal state of new Card object 
      //what kind of card is it? 
      System.out.println("Card is ..." + rank + " of " + suit); 
     } 
} 

, 내 생각 :

public class Deck { 
    public static void main(String[] args) { 

    class Card { 
     public int rank; 
     public int suit; 

     public Card(int startSuit, int startRank) { 
      rank = startRank; 
      suit = startSuit; 
     } 
    } 

     Card aceOfSpades = new Card(1, 1); 
     System.out.println("Card is ..." + Card.rank + " of " + Card.suit); 
    } 
} 

여기 두 개의 새로운 코드 라운드, 파일은 Card.java입니다 그것의 더 나은보고. oney 컴파일 오류는 이제 println 문에있는 변수와 연관됩니다. (정적이 아닌 변수 수트는 정적 컨텍스트에서 참조 할 수 없습니다.) 변수 상태를 읽고 내 println의 메서드를 사용하는 getSuit() 및 getRank()와 같은 메서드를 작성해야한다는 것을 의미한다고 생각합니다. 변수 자체?

그 방법은 이렇게 생겼습니까?

public int getSuit() {

return suit; 

} 

수업의 이름은 해당 파일의 이름과 일치해야

+1

는'Card.java'라는 새로운 파일을 만들고 거기에 당신의'Card' 클래스를 넣어라고합니다. –

+0

또는 Deck 클래스에서 직접 만들면됩니다 (메서드가 아닙니다!). – ddmps

+0

좋아요, 알아 냈습니다. 나는 카드를 만들었지 만 그것을 사용하지는 않았다. 나는 Card.rank가 아니라 aceOfSpades.rank를 참조해야했습니다. 객체 지향 프로그래밍의 경우 실제로 객체를 만들고 사용하는 데 도움이됩니다. 미래의 Google 직원 - 저는 main 메소드 바로 위에있는 getSuit() 및 getRank() 메소드를 카드에 넣는 결과를 낳았습니다. –

답변

0

두 번째 코드가 거의 정확합니다. 당신은 그냥이 같은 주에있는 코드를 수정해야합니다 :

System.out.println("Card is ..." + aceOfSpades.rank + " of " + aceOfSpades.suit); 

당신은 정적에 대해 옳다, 주요 그가 정적 만 변수에 접근 할 수있는 정적이다. aceOfSpades를 추가하면 생성 한 개체를 지정할 수 있습니다. 당신은 참고가 있고 당신은 내부 가치 계급 및 한 벌을 읽을 수있다.

하지만 당신은 더 좋은 방법은 세터/getter 메소드를 만드는 것입니다 제안과 같이 setRank (int)를, getRank는(), .... 당신은 그래서 내부 값은 외부 보호

public int rank; 
by 
private int rank; 

을 대체 할 수 그 물체.
순위를 비공개로 설정하더라도 main() 메서드는 여전히 순위 값을 직접 읽을 수 있습니다. 왜냐하면 사적인 것은 수업 시간에 만 볼 수 있고 메인 수업은 학급의 일부이기 때문입니다.
그러나 Deck 오브젝트에서 Card 오브젝트를 인스턴스화하면 컨텐츠를 직접 읽을 수 없습니다.

객체의 내부 값을 숨기는 생각은 OO에 기초하고 캡슐화

+0

고마워요, 이건 정말 도움이되었습니다. 이제 제로가 아닌 2 가지 방법을 알았습니다. –

0

을 (PLS 나와 함께 곰, 내 서식을 정확히 올바른 나오고 있지 않습니다, 나는 그것을 작업 것이다). 빌 K의 대답에서 can I compile a java file with a different name than the class에 그러나

:

당신은 그들이 공개하지 않은 것과 같은 파일 내부에 보조 클래스를 가질 수 있습니다. 그것들은 여전히 ​​"default"일 수 있기 때문에 같은 패키지의 다른 클래스에서 을 사용할 수 있습니다.

대부분의 경우이 작업을 수행하면 안됩니다. 클래스 및 패키지에 관한 Java의 명명 패턴 은 의 큰 장점 중 하나입니다. 프로그래머의 부담을 덜어줍니다. 방법 main()의 몸에서

+0

간단히 말해서 그렇습니다. 그러나 궁극적으로 다양한 이유에서 사실이 아닙니다. * this * 케이스에서는 추천할만한 것이지만 클래스를 선언 할 수있는 유일한 방법이기 때문이 아닙니다. –

+0

유효하지 않은 표현이 공개되었으므로 내가 내부 클래스 카드를 비공개로 호출하면 작동했을 것입니까? –

+0

@ nexus_2006 아니요, 수식어를 사용할 수 없습니다. 왜 삶이 더 쉬워지지 않는지. –

0

이동 클래스 Card. 이 코드는 모두 외부 클래스 인 Deck.java과 같은 이름을 가진 파일에 있어야합니다.

+0

파일 이름은 Deck.java였습니다. 이제 Card 클래스만으로 Card.java라는 클래스를 제거했습니다. 감사합니다 –

관련 문제