정적 메서드 내에서 비 정적 내부 클래스를 인스턴스화하려면 어떻게 해야 합니까?
다음과 같은 코드가 있습니다.
public class MyClass {
class Inner {
int s, e, p;
}
public static void main(String args[]) {
Inner in;
}
}
이 부분까지는 코드는 괜찮지만 다음과 같은 메인 메서드에서는 'in'을 인스턴스화할 수 없습니다.in = new Inner()
보이는 바와 같이non static field cannot be referenced in static context
.
어떻게 하면 좋을까요?나는 나의 것을 만들고 싶지 않다.Inner
클래스 스태틱
다른 외부 클래스도 참조해야 합니다.
Inner inner = new MyClass().new Inner();
만약 이너가 정적이면
Inner inner = new MyClass.Inner();
"일반" 내부 클래스에는 외부 클래스 인스턴스에 대한 숨겨진(암시적인) 포인터가 있습니다.이를 통해 컴파일러는 사용자가 포인터를 입력할 필요 없이 포인터를 추적하기 위한 코드를 생성할 수 있습니다.예를 들어 외부 클래스에 변수 "a"가 있는 경우, 내부 클래스의 코드는 "a=0"을 수행할 수 있지만 컴파일러는 커버 아래에 숨겨진 포인터를 유지하는 "outerPointer.a=0"을 위한 코드를 생성합니다.
즉, 내부 클래스의 인스턴스를 만들 때는 링크할 외부 클래스의 인스턴스가 있어야 합니다.외부 클래스의 메서드 내에서 이 작성을 수행하면 컴파일러는 "this"를 암시 포인터로 사용하는 것을 알고 있습니다.다른 외부 인스턴스에 링크하려면 특별한 "새로운" 구문을 사용합니다(아래 코드 스니펫 참조).
내부 클래스를 "static"으로 설정하면 숨겨진 포인터는 없으며 내부 클래스는 외부 클래스의 멤버를 참조할 수 없습니다.스태틱 내부 클래스는 일반 클래스와 동일하지만 이름은 부모 클래스에서 범위가 지정됩니다.
스태틱 및 비 스태틱 내부 클래스를 작성하기 위한 구문을 나타내는 코드 일부를 다음에 나타냅니다.
public class MyClass {
int a,b,c; // Some members for MyClass
static class InnerOne {
int s,e,p;
void clearA() {
//a = 0; Can't do this ... no outer pointer
}
}
class InnerTwo {
//MyClass parentPointer; Hidden pointer to outer instance
void clearA() {
a = 0;
//outerPointer.a = 0 The compiler generates this code
}
}
void myClassMember() {
// The compiler knows that "this" is the outer reference to give
// to the new "two" instance.
InnerTwo two = new InnerTwo(); //same as this.new InnerTwo()
}
public static void main(String args[]) {
MyClass outer = new MyClass();
InnerTwo x = outer.new InnerTwo(); // Have to set the hidden pointer
InnerOne y = new InnerOne(); // a "static" inner has no hidden pointer
InnerOne z = new MyClass.InnerOne(); // In other classes you have to spell out the scope
}
}
를 작성하려면new Inner()
메서드 내에서 클래스의 인스턴스 메서드에서 실행한다.MyClass
:
public void main(){
Inner inner = new Inner();
}
public static void main(String args[]){
new MyClass().main();
}
알렉세이 카이고로도프가 정답이야이 솔루션을 사용하면 같은 클래스의 main()과 같은 정적 메서드 내에서 내부 클래스를 인스턴스화할 수 있습니다.그렇지 않으면 정적 메서드 내에서 내부 클래스를 인스턴스화할 수 없습니다.컴파일되지 않는다.Alexei의 솔루션은 컴파일이 가능하며 정적 메서드에서 내부 클래스를 인스턴스화할 수 있습니다.다른 답변은 흥미로운 부주문이지만 실제 질문에 대한 답변을 찾을 수 없습니다.
import java.awt.Graphics;
import java.awt.Color;
import javax.swing.JPanel;
import javax.swing.JFrame;
public class Example {
public class InnerClass extends JPanel {
public void paint(Graphics g) {
g.setColor(Color.BLACK);
g.fillRect(getX(),getY(),getWidth(),getHeight());
g.setColor(Color.RED);
g.fillRect(5, 20, 195, 20);
g.setColor(Color.BLACK);
g.drawString("This was written by an inner class.", 10, 35);
}
}
public void demonstrate() {
InnerClass sc = new InnerClass();//<---this is key
JFrame jf = new JFrame();
jf.add(sc);
jf.setSize(220, 130);
jf.setLocation(450, 450);
jf.show();
}
public static void main(String[] params) {
Example e = new Example();//<---so is this
e.demonstrate();//<---and this is also key
}
}
언급URL : https://stackoverflow.com/questions/12690128/how-to-instantiate-non-static-inner-class-within-a-static-method
'sourcecode' 카테고리의 다른 글
TypeError: Vuex 4 및 Vue 3에서 사용할 때 정의되지 않은 속성 'getters'를 읽을 수 없습니다. (0) | 2022.09.05 |
---|---|
Cenum으로 인쇄하다. 값 대신 텍스트. (0) | 2022.09.05 |
java를 사용하여 mariadb에 접속하려면 어떻게 해야 하나요? (0) | 2022.09.05 |
로컬 시스템과 클라우드 인스턴스 간의 단방향 SymmetricDS 동기화 (0) | 2022.09.05 |
SQL 테이블 정의가 잘못되었습니다. 자동 열은 하나만 있을 수 있으며 키로 정의해야 합니다. (0) | 2022.09.05 |