C:\ Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeApplet> dir ドライブCのボリュームにはラベルがありません。 ボリュームシリアル番号は2041-64E7 C:\ Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeApplet 2009-07-02 23:54。[。のディレクトリ。 ____。] 2009-07-02 23:54 .. 2004-09-06 14:57 582 WelcomeApplet.html 2004-09-06 15:04 1,402 WelcomeApplet.Java 2ファイル1,984バイト 2 Dir 2,557,210,624バイト空き C:\ Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeApplet> javac WelcomeApplet.Java C:\ Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeApplet> dir ドライブCのボリュームには何もありませんlabel。 ボリュームシリアル番号は2041-64E7 C:\ Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeApplet [.____。のディレクトリです。 ] 2009-07-02 23:54。 2009-0 7-02 23:54 .. 2009-07-02 23:54 975 WelcomeApplet $ 1.class 2009-07-02 23:54 1,379 WelcomeApplet.class 2004- 09-06 14:57 582 WelcomeApplet.html 2004-09-06 15:04 1,402 WelcomeApplet.Java 4ファイル4,338バイト 2 Dir 2,557,202,432バイトフリー C:\ Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeApplet>
Javaファイルの内容は次のとおりです。
/**
@version 1.21 2002-06-19
@author Cay Horstmann
*/
import javax.swing.*;
import Java.awt.*;
import Java.awt.event.*;
import Java.net.*;
public class WelcomeApplet extends JApplet
{
public void init()
{
setLayout(new BorderLayout());
JLabel label = new JLabel(getParameter("greeting"), SwingConstants.CENTER);
label.setFont(new Font("Serif", Font.BOLD, 18));
add(label, BorderLayout.CENTER);
JPanel panel = new JPanel();
JButton cayButton = new JButton("Cay Horstmann");
cayButton.addActionListener(makeURLActionListener(
"http://www.horstmann.com"));
panel.add(cayButton);
JButton garyButton = new JButton("Gary Cornell");
garyButton.addActionListener(makeURLActionListener(
"mailto:[email protected]"));
panel.add(garyButton);
add(panel, BorderLayout.SOUTH);
}
private ActionListener makeURLActionListener(final String u)
{
return new
ActionListener()
{
public void actionPerformed(ActionEvent event)
{
try
{
getAppletContext().showDocument(new URL(u));
}
catch(MalformedURLException e)
{
e.printStackTrace();
}
}
};
}
}
それらは.class
ファイルを保持する 匿名の内部クラス 。
あなたの例ではWelcomeApplet.Java
には、最上位クラス(WelcomeApplet
と呼ばれる)と匿名の内部クラスが含まれ、WelcomeApplet$1.class
。
匿名内部クラスを保持するファイルの正確な名前は標準化されておらず、異なる場合があることに注意してください。しかし実際には、ここで説明した以外のスキームはまだ見ていません。
enum
の値固有のボディ 匿名の内部クラスでもあります :
列挙型定数のオプションのクラス本体は、すぐに囲む列挙型を拡張する匿名クラス宣言( §15.9.5 )を暗黙的に定義します。
$ 1は、WelcomeApplet.Java
ファイルで定義した匿名の内部クラスです。
例えばコンパイル
public class Run {
public static void main(String[] args) {
System.out.println(new Object() {
public String toString() {
return "77";
}
});
}
private class innerNamed {
}
}
Run.class
、Run$1.class
、およびRun$innerNamed.class
が生成されます
これらは、Javaコンパイラーにより、WelcomeApplet.Javaファイルのネストされた内部クラスおよび静的クラスから生成されます。
こちらもご覧ください 同様の質問と回答 。
次のコードの「行」からです。
return new
ActionListener()
{
public void actionPerformed(ActionEvent event)
{
try
{
getAppletContext().showDocument(new URL(u));
}
catch(MalformedURLException e)
{
e.printStackTrace();
}
}
};
ActionListener
を宣言する方法では、そのメソッドが呼び出されるたびに匿名内部クラスのインスタンスを作成しています。
メソッドが呼び出されなくても、上記の行は何であれ匿名の内部クラスにコンパイルされます。
WelcomeApplet$1.class
ファイルは、WelcomeApplet.Javaソース内の匿名クラスに対して生成されます(匿名クラスは、new new ActionListener() {...}
を呼び出すことにより、メソッド呼び出しmakeURLActionListenerで生成されます)
より明確に説明するために、匿名クラスは、次のようにインラインで具象クラス(またはインターフェース)の動作の一部またはすべてをオーバーライドする具象名前付きクラスのインスタンス化があるたびに、コンパイル時に生成されます。
class HelloInternalClass {
public static final void main(String[] args) {
// print in another thread
new Thread(new Runnable() {
public void run() {
System.out.println("Printed from another thread");
}
}).start();
}
}
上記のサンプルコードでは、javacコンパイラはHelloInternalClass.class
とHelloInternalClass$1.class
のように2つのクラスファイルを生成します。
このインスタンスの匿名クラスはRunnableのサブクラスであり、HelloInternalClass$1.class
にコンパイルされます。ちなみに、上記のサンプルの実行可能なインスタンスからクラス名を(getClass().getName()
を呼び出すことで)求めると、「HelloInternalClass $ 1」と見なされることがわかります。
作成:
_public class A {
public static void main(String[] args) {
X x=new X();
X x2=new X(){
};
Class<? extends Object>c2=x2.getClass();
Class<? extends Object>s2=x2.getClass().getSuperclass();
boolean b=false;
}
private static class X{
}
}
_
コードから見るのは困難です(new X{}()
はnew X(){}
より優れていたはずですが、_x2
_は_A$X
_のサブクラスのインスタンスです。このサブクラスは_A$1
_です。