5staticメソッドから普通のフィールドを使う......前ページで紹介したstaticメソッドには、実は制限があります。それは「staticじゃない普通のフィールドを直接使えない」というものです。staticメソッドと普通のメソッドを持つクラス。int型変数のstaticフィールドdataStaticを定義します。int型変数のフィールドdataNormalを定義します。フィールドを出力するstaticメソッドです。staticフィールドを出力します。普通のフィールドを出力します。コンテキストから参照することはできません。「わからない」ので出力できません。フィールドを出力する普通のメソッドです。staticフィールドを出力します。普通のフィールドを出力します。このクラスを実行してください。staticフィールドに数値を入れます。インスタンスを1つ作り数値を入れます。staticメソッドを使って出力します。「わからない」ので出力されません。普通のメソッドを使って出力します。staticメソッドと普通のメソッドを持つクラス。int型変数のstaticフィールドdataStaticを定義します。int型変数のフィールドdataNormalを定義します。フィールドを出力するstaticメソッドです。staticフィールドを出力します。普通のフィールドを出力します。コンテキストから参照することはできません。「わからない」ので出力できません。フィールドを出力する普通のメソッドです。staticフィールドを出力します。普通のフィールドを出力します。このクラスを実行してください。staticフィールドに数値を入れます。インスタンスを1つ作り数値を入れます。staticメソッドを使って出力します。「わからない」ので出力されません。普通のメソッドを使って出力します。100}}HasStaticAndNormalMethodクラスは、staticフィールドと普通のフィールド、staticメソッドと普通のメソッドを持っています。staticメソッドと普通のメソッドを持つクラス。int型変数のstaticフィールドdataStaticを定義します。int型変数のフィールドdataNormalを定義します。フィールドを出力するstaticメソッドです。staticフィールドを出力します。普通のフィールドを出力します。コンテキストから参照することはできません。「わからない」ので出力できません。フィールドを出力する普通のメソッドです。staticフィールドを出力します。普通のフィールドを出力します。staticメソッドと普通のメソッドを持つクラス。int型変数のstaticフィールドdataStaticを定義します。int型変数のフィールドdataNormalを定義します。フィールドを出力するstaticメソッドです。staticフィールドを出力します。普通のフィールドを出力します。コンテキストから参照することはできません。「わからない」ので出力できません。フィールドを出力する普通のメソッドです。staticフィールドを出力します。普通のフィールドを出力します。);}}ちょっと長いですが、よく見るとこれまで紹介してきたものを全部組み合わせただけです。このプログラムでは、次の4通りの組み合わせを試しています。1.staticメソッドからstaticフィールドを使う2.staticメソッドから普通のフィールドを使う3.普通のメソッドからstaticフィールドを使う4.普通のメソッドから普通のフィールドを使うこのうち、「2.staticメソッドから普通のフィールドを使う」だけができません。フィールドを出力するstaticメソッドです。staticフィールドを出力します。普通のフィールドを出力します。コンテキストから参照することはできません。フィールドを出力するstaticメソッドです。staticフィールドを出力します。普通のフィールドを出力します。コンテキストから参照することはできません。}staticPrintData()メソッドはstaticメソッドです。このメソッドから、普通のフィールドであるdataNormalフィールドを使うことができません。使うとコンパイルエラーになります。使えないかというと、それは「どのインスタンスのdataNormalフィールドかわからない」からです。インスタンスが見つからない!これは静的領域とインスタンスの関係を考えれば当然のことです。静的領域とインスタンスは別です。離ればなれになっています。静的領域はインスタンスを管理しているわけではありません。静的領域にとって、同じクラスのインスタンスはたくさんあって、静的領域はそれらインスタンスとまったく結びついていません。インスタンス内にあるフィールドやメソッドは、当然「どのインスタンスの」フィールド・メソッドか、ということを指定する必要があります。);}なんてしても、静的領域にあるstaticPrintData()メソッドから見て、dataNormalフィールドが「どのインスタンスのdataNormalフィールドか」ということが指定されていないわけですから、dataNormalフィールドを使えるわけがないのです。ちなみにこの逆、つまり「3.普通のメソッドからstaticフィールドを使う」は問題なく使えます。インスタンスは「自分のクラスが何クラスか」ということを知っています。いうことは「自クラスの静的領域」も見つけることができるということです。その中のstaticフィールドを使うことができるというわけです。イメージしよう!これらは、インスタンスと静的領域の図をイメージできれば分かることでしょう。重要なのは、HasStaticAndNormalMethodクラスのようなプログラムを見て、そのイメージができるかどうか、という点です。普通にHasStaticAndNormalMethodクラスを見ると、dataStaticフィールドとdataNormalフィールドを一緒に考えてしまうかもしれません。「static」の有無で「静的領域に置かれるかインスタンスに置かれるか」ということを区別できれば、別々なんだということをイメージできると思います。オブジェクト指向とJavaこのページは、Java言語を用いたオブジェクト指向プログラミングのチュートリアル解説を行う「Javaのオブジェクト指向入門」の一ページです。詳しい説明は「Javaのオブジェクト指向入門」目次をご覧ください。