XXX型を囲むインスタンスがJavaでアクセスできない
Javaコード作成時に、mainメソッドで内部クラスのインスタンスを作成する際に、コンパイル段階でエラーが発生する問題が発生しましたので、エラー解説をご覧ください。
この行に複数のマーカーがある
- ローカル変数testの値は使用されていない
- StaticCallDynamic 型の包含するインスタンスにアクセスできない。StaticCallDynamic 型の包含インスタンスで割り当てを修飾する必要があります (例 : .
x.new A() は、x が StaticCallDynamic のインスタンスである場合)。
確認したところ、インナークラスは dynamic(staticキーワード修飾子なし)、mainメソッドは static なので、通常のインナークラスオブジェクトはそれを生成したアウタークラスオブジェクトへの参照を暗黙的に保持しており、staticメソッド(クラスのロード時に初期化)でインナークラスを呼び出すには、まずアウタークラスを生成する必要があることがわかりました。つまり、次のように作成します。 "DanymicTest test = new StaticCallDynamic().new DanymicTest();" ここでStaticCallDynamicは外部クラス、DanymicTestは内部動的クラスです。 内部を静的クラスに変更すれば、mainで直接内部クラスのインスタンスを作成することができます。
ところで、スタティックメソッドからダイナミックメソッドの呼び出しについて見てみると、print()がクラス内のダイナミックメソッドであるところ、スタティックメソッドを直接呼び出した場合、次のような問題が発生します。
StaticCallDynamic型から非静的メソッドprint()への静的参照はできません。
これは、javaのメモリの仕組みの観点から分析する必要があります。まずオブジェクトをNewするとき、ヒープにオブジェクト用のメモリ空間を確保するのではなく、クラスのスタティックメソッド(static修飾子をつけたスタティック関数)のコードをメソッド領域というところにロードして、ヒープメモリにオブジェクトを生成します。つまり、クラスの読み込みと同時にスタティックメソッドも読み込まれるということですね。オブジェクトをnewすると、そのオブジェクトはメモリの対に存在し、thisキーワードはそのオブジェクトを指すのが一般的ですが、オブジェクトをnewせず、クラス名でそのクラスのスタティックメソッドを呼び出しても問題ないでしょう。
クラスの静的メンバ(変態やメソッド)はクラスそのものに属し、クラスのロード時にメモリが確保され、クラス名で直接アクセスできますが、非静的メンバ(変数やメソッド)はクラスのオブジェクトに属し、クラスのオブジェクトの生成時(インスタンス生成時)だけメモリを確保し、クラスのオブジェクトでアクセスすることができます。クラスの静的メンバの中にある非静的メンバにアクセスすると間違うことがあるのは、クラスの非静的メンバが存在しないのに静的メンバが既に存在するため、メモリ上に存在しないものにアクセスすると間違うことがあるからです。
そのため、メソッドもスタティックメソッドに変更するか、メソッドが存在するインスタンスを生成してインスタンス経由で呼び出すかのどちらかになります。
関連
-
mvn' は、内部または外部のコマンド、操作可能なプログラムまたはバッチファイルとして認識されません。
-
アクセス制限です。タイプ 'JPEGCodec' は API ではない ☞My Blog Github ☜ ホームページを見る
-
Javaでよくある構文エラー
-
Javaクラスが "Error occurred during initialization of boot layer "というエラーで実行される。
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException:5 エラー
-
SpringBoot 起動エラー java.nio.charset.MalformedInputException: 入力長 = 2 解決
-
コンストラクタDate()が未定義である問題
-
org.xml.sax.SAXParseExceptionのエラー解決方法
-
swagger2 モデルが表示されない モデルが見つからない @ApiModel アノテーションが表示されない問題
-
FTPサーバ機能のJava実装
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
スレッド "main "での例外 java.util.NoSuchElementException in Java 問題解決済み
-
ブートレイヤーの初期化中にエラーが発生しました java.lang.module.FindException: モジュールが見つかりません
-
Java Notes 005_この行に複数のマーカーがある - キーを変数に解決できない - シンタックスエラー、ins
-
java send https request prompt java.security.cert.について。
-
Web Project JavaでPropertiesファイルを読み込むと、「指定されたファイルがシステムで見つかりません」というソリューションが表示されます。
-
git pull appears現在のブランチに対するトラッキング情報がありません。
-
htmlとwordの相互変換の実装(画像あり)
-
MyBatisカスタムタイプハンドラ TypeHandler
-
コレクション - PriorityQueueソースコード解析
-
javaの継承の基本的な実装