私は次のコードを持っています:
public class MyClass{
class Inner{
int s,e,p;
}
public static void main(String args[]){
Inner in;
}
}
この部分まではコードは問題ありませんが、non static field cannot be referenced in static context
を表示しているため、in=new Inner()
のようなメインメソッド内で 'in'をインスタンス化することはできません。私にできる方法は何ですか? Innerクラスを静的にしたくありません。
他の外部クラスへの参照も必要です。
Inner inner = new MyClass().new Inner();
インナーが静的であれば、それは
Inner inner = new MyClass.Inner();
「通常の」内部クラスには、外部クラスインスタンスへの隠された(暗黙の)ポインターがあります。これにより、コンパイラーはコードを生成し、ユーザーが入力しなくてもポインターを追跡できます。たとえば、外部クラスに変数「a」がある場合、内部クラスのコードは「a = 0」を実行できますが、コンパイラは「outerPointer.a = 0」のコードを生成し、隠しポインターを維持しますカバー。
つまり、内部クラスのインスタンスを作成する場合、外部クラスのインスタンスをリンクする必要があります。外部クラスのメソッド内でこの作成を行うと、コンパイラは暗黙のポインタとして「this」を使用することを認識します。他の外部インスタンスにリンクする場合は、特別な「新しい」構文を使用します(以下のコードスニペットを参照)。
内部クラスを「静的」にすると、非表示のポインターはなくなり、内部クラスは外部クラスのメンバーを参照できなくなります。静的な内部クラスは通常のクラスと同じですが、その名前の範囲は親の内部です。
以下は、静的および非静的内部クラスを作成するための構文を示すコードの抜粋です。
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
}
}