質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

8823閲覧

クラスとインスタンス、static の話がイマイチ理解できない

former_neet_cat

総合スコア46

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2018/02/11 07:30

クラスとインスタンス、static、について混乱してるのでコードなどを使って分かりやすく説明していただけないでしょうか。

あるサイトで、クラスとインスタンスについての説明を見ていたのですが、
”追加したgrowOldメソッド内で「非 static フィールド age を static 参照できません」というコンパイルエラーになります。”
という説明で混乱しました。
そもそも、非 static フィールドってなんだろ、
staticクラスはインスタンス(人間なら年齢とか名前とか個人を特定するような情報?)を生成しないクラス??
以下のコードでは年齢も入ってるので非static?
classの下のコードにはstaticが入ってるのでstaticなクラスでは?
など、疑問に感じる部分が多いので、教えていただけないでしょうか?

java

1class Human { 2 static final String classification = "哺乳類"; 3 String name; 4 int age; 5 6 Human(String name, int age) { 7 this.name = name; 8 this.age = age; 9 } 10 11 static void growOld(){ 12 age++; // <- コンパイルエラー 13 } 14 15 /* 中略 */ 16}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

staticフィールドはクラス共通のフィールドです。つまり、オブジェクト(インスタンス)数が1であろうが2であろうが100であろうが0であろうが同一のもの(共有する変数)です。一方、非staticフィールドはオブジェクト(インスタンス)に紐づき、オブジェクト(インスタンス)毎に用意される変数です(共有しない変数)。

非staticメソッドはオブジェクト(インスタンス)に紐づいたメソッドです。非staticメソッドはstaticフィールドと、当該オブジェクト(インスタンス)に紐づいた非staticフィールドを参照できます。一方、staticメソッドはオブジェクト(インスタンス)に紐づかないため、staticフィールドのみしか参照できません。

**本件ではstaticメソッドで非staticフィールドを参照しようとしています。が、これは不可能です。**非staticフィールドはオブジェクト(インスタンス)の数だけある(そもそも0かもしれない)ので、どれを参照すればいいのか特定できません。

投稿2018/02/11 07:43

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

former_neet_cat

2018/02/11 09:39

理解するのに長い時間がかかりましたが、わかりやすい説明ありがとうございます。
guest

0

static属性があるからと言ってstaticクラスになるわけではありません。
abstractクラスと若干混同しているのでは?

JAVA インナークラス・メンバークラス

投稿2018/02/11 07:42

LouiS0616

総合スコア35658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

former_neet_cat

2018/02/11 09:41

若干どころかかなり混同してました。 サイトの紹介ありがとうございます。
guest

0

newなどでインスタンスを生成するものが動的となり、staticとは逆な意味の静的という意味です。静的でないクラスは記述されているだけで実体を持ちません。new クラス名()により実体を持つということになります。 static final String はこの文字列は静的であるという宣言であり、文字列のみにかかります。エラーはgrowOldメソッドにstatic修飾子がついているので発生しています。

投稿2018/02/11 07:41

unz.hori

総合スコア1057

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

former_neet_cat

2018/02/11 09:43

エラーの起こる場所まで指摘していただきありがとうございます。 実践ではかなり助かります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問