ここから本文です

Humanクラスを作り、

gan********さん

2019/8/1214:56:01

Humanクラスを作り、

static int age;
String name;
static void Age(){
System.out.println(age + name<赤線>)
}

void Name(){
System.out.println(age + name)
}

としたところ、nameに赤線がでて"非staticフィールドnameをstatic参照出来ません"と出ました。

クラスフィールド変数はクラスメソッドとインスタンスクラスで使用できるが、インスタンスフィールドはインスタンスメソッド内でしか使えないってことですよね?

あと、先程クラスとインスタンスの違いを匿名で質問したのですが、どういう勉強をすればこのふたつの違いをよく理解できるのかが分かりません...

閲覧数:
13
回答数:
1

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

n2q********さん

2019/8/1215:14:39

~修正例~

static void Age(Human h){
System.out.println(h.age + h.name);
}

このように引数を追加すると上手く行きます。


【先程クラスとインスタンスの違いを匿名で質問したのですが、どういう勉強をすればこのふたつの違いをよく理解できるのかが分かりません...】

以下、ちょっとした喩え話です。


猫を飼っていましてね。ご近所にもやはり猫を飼ってる方がいらっしゃいます。

でも、うちの猫と、そのご近所のある方の猫とは別の猫です。

さて、「猫を飼っている。」は英語で I have a cat. といいますよね。この「a」って何でしょう。

これはインスタンス化の「a」ということが出来ます。猫クラス、猫概念を飼うことはできません。猫概念はどこにも居ないからです。ご近所も家も、それぞれ猫のインスタンスを飼っているわけです。

猫の特性というものがあります。肉食ですよね。あと、何だろう。よく昼寝します。そういった性質は猫クラスのクラスフィールドという風に言っても良いかもしれません。

けど、今日、朝からどういった行動をとったのか、いつどれだけ餌を食べたのか、これはうちの猫と、ご近所の猫とでは違います。これがインスタンスフィールド。


クラスは概念です。それはどこにも存在していません。
インスタンスは実在です。そこが両者の違いとなります。


クラスフィールドは、クラスに変数のインスタンスを持たせているのです。そう言ってしまうとややこしくなってしまうかもしれませんが、それが事実です。

インスタンスフィールドは、クラスにそのように規定しているだけで、そのクラスのオブジェクトを用意した(インスタンス化した)段階で用意されるものとなります。

メソッドについては初めから用意されています。インスタンスメソッドもです。インスタンスとは関係が無い存在とお考え下さい。

引数に違いがあります。自己クラスに関して隠し引数を持っているのがインスタンスメソッドです。それがあるから、インスタンスフィールドに黙ってアクセスできる。何も示さなくても、インスタンス内のフィールドであるということが分かる。

一方、クラスメソッドの方はそのような隠し引数が無い。だから、インスタンスフィールドのどれを指すものか分からないわけです。お隣の猫なのか、うちの猫なのかわからないのですよ。

なので、引数を追加してやれば良い。これが冒頭に掲げた修正例になります。

  • 質問者

    gan********さん

    2019/8/1215:46:26

    クラスが一般的なもので、インスタンスが具体的なもの。

    インスタンスはクラスのコピーではないというのはそういうことでしょうか?

    あとこういう考え方がオブジェクト思考っていうのですかね

  • その他の返信(4件)を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる