2010-11-19 5 views

답변

10

에서 참조 할 수 없다는 내가 오류를 발견하고이 코드를 실행하면 때문에 변수 이름과 앨범은 기본 절차에 존재하지 않습니다. 정적이어서 인스턴스 수준 멤버에 액세스 할 수 없습니다. 공용 액세스 한정자로 이름/앨범 멤버를 선언하지 않는 한, 위의 코드를 컴파일 할 수 없게됩니다, 그러나

public static void main(String[] args) { 
Singer s = new Singer(); 
System.out.println("Name of the singer is " + s.name); 
System.out.println("Album information stored for " + s.album); 
} 

:이 같은 가수 클래스의 인스턴스가 필요합니다. 캡슐화의 이점을 얻기 위해 각 멤버 (getName(), getAlbum() 등)에 대한 getter 작성을 권장했습니다. 이처럼 :

class Singer { 
private String name; 
private String album; 

public Singer() { 
    this.name = "Whitney Houston"; 
    this.album = "Latest Releases"; 
} 

public String getName() { 
    return this.name; 
} 

public String getAlbum() { 
    return this.album; 
} 

public static void main(String[] args) { 
    Singer s = new Singer(); 
    System.out.println("Name of the singer is " + s.getName()); 
    System.out.println("Album information stored for " + s.getAlbum()); 

} 

} 

또 다른 대안은 당신이 원래 의도 한 방식으로 참조 할 수 있습니다, 이름과 앨범 정적으로 선언하는 것입니다.

+0

'... + s.name); ... + s.album);' – khachik

+0

BTW, 위의 코드는'main'이'Singer'에 속하기 때문에 이름이 private 인 경우 컴파일되고 잘 실행됩니다. – khachik

0

한 가지 옵션은 Chris Hutchinson이 언급 한 것입니다. 다른 하나는 정적이라고 선언하는 것입니다.

main은 정적 방법입니다. 따라서 이름과 앨범을 정적으로 선언해야합니다.

private static String name; 
private static String album; 
1

메인은 정적 방법입니다. 인스턴스 변수 (클래스에서 정의되었지만 정적으로 표시되지 않은 변수)는 클래스의 인스턴스를 참조하지 않고 정적 메소드에서 액세스 할 수 없습니다. 크리스 '대답에 더 확장하기

public static void main(String[] args) 
{ 
    Singer singer = new Singer(); 
    System.out.println("Name of the singer is " + singer.name); 
    System.out.println("Album Information stored for " + singer.album); 
} 
+0

이 코드를 컴파일 할 때 오류가 발생하지 않았지만이 코드를 실행할 때 스레드 "main"의 Exception과 같은 오류가 발생합니다 java.lang.NoClassDefFoundError : Singer –

0

, 당신은 기술적으로 지원할 수있는 메모리로 가수 클래스의 많은 인스턴스를 가질 수 있지만, 주요 기능 실행의 오직 하나의 인스턴스가있다. 즉, 정적 함수에서 변수에 액세스하려고하면 액세스해야하는 변수의 인스턴스가 무엇인지 모르기 때문에 오류가 있음을 의미합니다.

변수를 주 기능에 국지적으로 만들 수는 있지만 로직이 하나 이상의 가수가 될 수 있기 때문에 프로그램의 목적을 상실 할 수 있습니다. 더 나은 공격 계획은 main 함수를 포함하는 제네릭 클래스를 생성 한 다음 그 안에 (또는 다른 곳에서) Singer 클래스를 생성하고 주 함수에서 해당 클래스의 X 인스턴스를 인스턴스화하고 거기에서부터 시작하는 것입니다.

2

비 정적 멤버 또는 클래스를 인스턴스화하여 존재해야합니다. 그런 다음 정적 멤버에서 정적이 아닌 멤버 또는 개체에 액세스한다고해서이 멤버 또는 개체가 인스턴스화되는 것을 보장하지는 못하며 액세스가 불가능합니다.

정적 컨텍스트 내에 비 정적 개체의 인스턴스를 만들어야 만듭니다.

class Singer { 
    String name; 
    String album; 

    // You will need the following to make your code compile, 
    // and the call to these getters within your 'main' function. 
    public getName() { 
     return name; 
    } 

    public getAlbum() { 
     return album; 
    } 

    public Singer() { 
     name="Whitney Houson"; 
     album="Latest Releases"; 
    } 

} 

public static void main(String[] args) { 
    Singer singer = new Singer(); 
    System.out.println("Name of the singer is " + singer.getName()); 
    System.out.println("Album Information stored for " + singer.getAlbum()); 
} 

이 방법을 사용하면 thuis가 접근하기 전에 제대로 인스턴스화 보장, 정적 객체로 Singer 개체의 인스턴스를 포함한다.

관련 문제