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

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

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

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

Q&A

解決済

4回答

12102閲覧

クラス型変数とは?オブジェクト?

Java_Test2019

総合スコア27

Java

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

1グッド

3クリップ

投稿2019/04/25 07:48

クラス型変数を理解しようと思って調べたら、下記のサイトに当たりました。
https://nobuo-create.net/java-beginner-17/

ここの解説についてお聞きしたいと思います。
わからない事だらけなので、とりあえずわからない所を少しずつ質問したいと思います。

まず、オブジェクトというものは物。ある、よく聞くオブジェクトは何かというサイトで、プログラミングで扱うもの全てがオブジェクトと言っていました。という事はクラスも変数もプロジェクトもEclipseという開発環境もオブジェクトですよね。定義が広すぎるのでそこまで深く理解せず解説の続きに進みました。

次には、Humanオブジェクトを作ろうと書いています。よくわからないのですがHumanと名のついた何かをどこかに作るという事なのでしょうか。どんなもので何のためなのかわかりませんが、深く解説がない事からそこまで意識しないで良いのだろうと解説の続きに進みました。

次には、Humanオブジェクトを作るためにHumanクラスを書くとありますね。Humanオブジェクトというものが何のためにどこに作られるどんなものを指すのかわかりませんが、Humanクラスを書く必要があるという文章だと判断しました。

ここから、mainメソッドは手続き、といいますか処理を書くメソッドだという話まではおそらく理解しております。

オブジェクトというどこかで作られる何かという正体のわからないものが、何のためかに必要で、作るにはそのためのクラスが要る、そしてそのクラスはmainメソッドがクラスのブロック内にあるそのクラスとは別物のクラスである必要がある。
こう理解したつもりだったのですが、次の文章で、同じクラスのくくりですがとあり、別に書く(作る)必要があるけれど同じクラスのくくり??と混乱しております。

とりあえずここまでの解説の意味を知る事から始めたく、わかる方、ぜひご教授お願い致します。

退会済みユーザー👍を押しています

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

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

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

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

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

cateye

2019/04/25 08:16 編集

質問者さんは、他の言語(Cとかpythonとかいろいろ)をご存知でしょうか? 前出の質問からそうではない気はしますが・・・
moredeep

2019/04/25 08:22

参考サイトのしょっぱな辺りに > とりあえず難しいことは考えずにオブジェクトを作ってみましょう。 と書いてあるんですから、そもそも解説をしていないと思います。別のサイトを探しては如何でしょうか。
Java_Test2019

2019/04/25 08:23

Cは大学のカリキュラムで、と言っても基礎だけ。C++やC#ではないです。 pythonはとある機会があって入門書でちょっと。と言ってもPCに手書きの文字を理解させる程度で。
wtokuno

2019/04/25 09:56

自分の経験上「クラス型変数」ってあんま見ないけどちゃんと定義された用語なんだろうか。 「クラス変数」の書き間違いか?とおもったが、そこのサイトの説明だと「クラス変数」という意味じゃなくて「クラス型の変数」の意味で使ってるようだ。
guest

回答4

0

以前も同じような回答した憶えがありますが、改めて。
「オブジェクト指向神話」はじまりはじまりー。
(※イメージとして捉えてください。Javaは詳しくないので間違いあったらご指摘お願いします)


あなたは神様です。
あなたはJavaという言語を駆使して、この世界にモノを作ることが出来ます。
(逆に言えば、あなたが何もしなければ世界に何も生まれません)

そのモノとは、「何か数字1つ」かもしれませんし、「何かの数字を2つ渡したら足し算して返してくれるヤツ」かもしれませんし、「人」であるかもしれません。
この「モノ」、この「何か」を**「オブジェクト」**と言います。
(これはJavaそのものを作った、あなたよりもっと上位の神様がそう決めました/実際は更に昔の別の言語を作った神様かもしれませんが詳細割愛)
(ちなみに「この世界にあるモノ」がオブジェクトなので、クラスと変数はオブジェクトですが、プロジェクトや開発環境は「この世界自身」と言えるのでオブジェクトじゃないです。多分。)


さて、ある日あなたは「Human(人)」というオブジェクトを作りたいと思いました。
これはあなたが仕事でそう言われたからかもしれないし、参考書にそう書いてあったからもしれないし、あなた自身が必要としていたからかもしれません。
理由はどうあれ、あなたは世界に「Human」を作る必要があったのです。

「Human」とはどういうオブジェクトでしょうか。
とりあえずここでは以下の特徴を持っていることにします。
・好きな数だけ作れる
・固有の名前を持っている
・「お前の名は?」と聞いたら、「わたしの名前は〇〇です。」と自分の名を答える
(実際は、あなたが必要だと思う特徴を決めていいです。これを設計と言います)

Humanの特徴が決まりました。
神様はさっそくHumanオブジェクトを作ろうとしますが、前述の通り、この世界ではJavaという言語を使う必要があります。
Javaの創造神はこう言っています。
「オブジェクトを作りたいなら、まずはその特徴を書いたクラスを作りなさい。クラスは設計図のようなものです。クラスを元にオブジェクトは作られるのです」
創造神には逆らえないので、あなたはそれに従います。
「出でよ、Humanクラス」
public class Human{ }
出来ました。
Humanの特徴の内、「好きな数だけ作れる」は神様の能力なので一旦置いておきます。
あと必要なのは「固有の名前」です。なのでクラスにpublic String name;という変数を追加しました。
「名前を聞いたら〜」は「動作」なのでメソッドです。なのでクラスにpublic String TellName() { return "わたしの名前は" + name + "です。"; }というメソッドを追加しました。
何故か? それが必要だと決めたからです。


これでHumanクラスが作れました。
ではようやくHumanオブジェクトを作成します。
とりあえず「太郎」「花子」を作ることにしましょう。mainメソッドに以下を書いて実行です。
new Human();
new Human();
おめでとう、これでこの世界に2つのHumanオブジェクトが生まれました。

……でも待ってください、これではどちらが太郎でどちらが花子かわかりません。
なので神様にしか見えない箱に彼らを入れましょう。
Human taro = new Human();
Human hanako = new Human();
これでどちらか区別出来るようになりました。taroに入っているHumanが太郎、hanakoに入っているHumanが花子です。

では太郎に名前を聞いてみましょう。
あなたは太郎に「お前の名は?」と問いました。つまりtaro.TellName()を実行するということです。結果は……わたしの名前はです。です。おっと、名前部分が入っていませんね。
なぜなら太郎は変数taroに入っているだけで、まだ名前が与えられていない(=nameが"")なのです。

なのでtaro.name = "太郎";と太郎の名前を決めてやります。
その後改めてtaro.TellName()をすれば「自分のオブジェクトの固有の名前を返す=自分のクラスのnameの値を返す」となり、わたしの名前は太郎です。と無事に返って来るようになります。

花子でも同じことをすれば同じようになります。
太郎とは同じクラスを元に出来た同類ではありますが、tarohanakoは別のオブジェクトなので、hanako.name = "花子";としても、taro.nameは太郎のままです。

あなたは必要な分だけ、Humanオブジェクトを増やすことが出来ます。
要らなくなったら破棄することも出来ます。
hanako.name = "ジョセフィーヌ";とデータを変更することも出来ます。
そして「この機能を追加する必要があるな」と思ったら、クラスに追記すれば全てのHumanクラスがそれを持ちます。
名前を聞いた時の反応をMy name is 〇〇.にしたければ、HumanクラスのTellNameメソッドを修正するだけで済みます。

あなたの必要に応じて、必要な分だけオブジェクトと、その為のクラスを作ってください。
何はともあれ、こうしてあなたは当初の目標「Humanオブジェクトを作る」を達成したのでした。

なお、この「クラスから作ったオブジェクト」のことを**「インスタンス」**と呼びます。
これはJava神が決めた名前です。
「オブジェクト」は前述の通り範囲が広すぎるので、その中でもクラスから作成されたオブジェクトをインスタンスと呼ぶのです。


ちなみにmainメソッドですが、こいつはJava神によって「プログラムが起動したら、まず最初にpublic static void main(String args[])ってメソッドを呼ぶ」と決められているメソッドです。

手続きどうのこうのとありますが、とりあえず
『「Java神により勝手に呼び出されるメソッドを持ってるクラス」と「それ以外のクラス」があるんやで』
『どっちも「クラス」という意味では同じやで』という点だけ踏まえればいいかと思います。
(参考サイトの『同じクラスという括り』はそういうこと)


で、結論。
上記では目標を「Humanオブジェクトを作る」にしてましたが、実際のプログラムはそんなことはないでしょう。
電卓だったり、SNSだったり、RPGだったり、業務管理システムが最終的な完成目標だと思います。

一方、ここまでの文章で「あなたが決める」と「Java神が決めている」の2つが出て来たと思います。
つまりあなたはが行う「プログラム」とは

  • 最終目標(何を作るのか)を整理し
  • Javaの記述方法(=コード文法)とJava神の振る舞い(=実行仕様)を知り
  • 要件を実行するには何のオブジェクトを、どのような設計に基づいて作成し、どうを処理するか考え
  • バグや高負荷の無いように実装し
  • テストとデバッグを繰り返す

という行為と言えます。
(※実務の場合は大体分業されているので実際に手掛けるのは一部分の可能性があります)

「オブジェクト指向」は神々(何なら別言語の神々も)の中での共通認識なので、頑張って理解してください。(ググればもっといい解説サイトがいっぱいあると思います)

投稿2019/04/25 10:21

編集2019/04/26 00:52
sakura_hana

総合スコア11427

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

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

Java_Test2019

2019/04/26 00:07

驚きました・・・大変わかりやすかったです。丁寧な説明本当に有難う御座います! と言っても、わかったつもりで他の方がおっしゃられるようにまた勘違いしている可能性もありますが・・・
Java_Test2019

2019/04/26 00:11

当方オブジェクトというものを深く考えすぎました。特別な隠語とかではなく、初学者用サイトに書いてある通り文字通り何かを行うための物という事なのですね。 できれば書いていただいたその回答一つ一つに返信して読んでいただきたいのですが丸投げでしょうしそちらの都合もあって迷惑かもしれないので少しだけにしようかと思います。
Java_Test2019

2019/04/26 00:23

その前に一つ、最初にHumanクラスに追加したpublic String TellName() { return name; }のメソッドを見て思った事がありました。 戻り値を返すメソッドにおけるreturnする変数(ここではname)、これって同じクラス(ここでは同じHumanクラス)内に定義した変数でも良いのですね。 戻り値について下記のサイトを見て勝手に戻り値を返すメソッドで定義する形式だと思っておりました。 https://nobuo-create.net/java-beginner-13/comment-page-3/#comment-4606
sakura_hana

2019/04/26 00:39

メソッドがreturnする値は何でもいいです。 今回のように「引数は何も受け取らず、自分のクラスの変数を何かしら処理した結果を返す」でも、 リンク先のように「引数を受け取り、それを何かしら処理した結果を返す」でもいいです。 何なら「結果を返さない(void型メソッド)」でも「変数を利用しない(いつも決まった値を直接返すとか)」でもいいです。 「そのメソッドは何をする為のものなのか?」を考えて、都合の良いように作ればいいです。 (その意味で言うと、今回のTellNameはnameを返すだけなのでメソッド化する意味が無いですね。存在意義が分かり辛いので後で直しておきます)
Java_Test2019

2019/04/26 01:31

ありがとうございます!なるほど、メソッドは処理の意味を考えて形式も決まる、決まったその形式で書くもの、ですね。 ところでHuman taro = new Human(); ※1 こちらの解釈が間違っていたら済みませんが、Humanオブジェクトの一つとしてtaroという変数で表現または利用するtaroというHumanオブジェクトを※1の式で作っているという事ですね。 この式がずっと前から違和感があってこのたびteratailで質問したとも言えて・・・ 変数の定義って例えば int number = 2; のように データ型 変数名 = 代入する整数 という形、 がありますけれど、※1の式ではHumanというクラス型の、taro という変数に、 new Human()を代入していますよね。 Human taro = まではわかるのですけれど new Human()を入れる、という形がいまいち脳内で形に出来なくて。 ・整数の変数を用意したい、なら整数型で定義する事、int number; ・int型で変数を定義できた、更に=2で初期化。 ・クラス型の変数(俗にいうクラス変数?)を用意したい、ならクラス型で定義する事 Human taro; (クラス型に使えるのは定義する場所を作っているクラス名なのでHuman) しかしクラス型変数は初期化も同時にやる形式でなければならないのでこれは間違い。クラス型変数定義は同時に初期化がいる。 整数型変数を初期化する場合、整数型変数という箱に代入するのは整数であるように、 クラス変数taroを初期化する場合、クラス変数という箱に入れるのはクラス。(クラスを入れるというのは変な言い方かもしれませんがintの話と比較のため) ちょっと前に書いたようにクラス型の名に使うのはその場所を提供しているクラス、しかし初期化で入れるクラスもまた同じ、だから 「Human」taro = new 「Human」()なのですね。 解釈の仕方が間違っていますでしょうか?また、間違っていなくてもとらえかたが変でしょうか?
Java_Test2019

2019/04/26 01:39

返信は本当に出来たらでいいです。ある意味、解釈があっているかわかりませんがとりあえずの私自身の解釈として私が現時点での把握の形の確認のため書きました。 ここまででも助かりました。 訂正:20行目 (クラス型に使えるのは → (クラス型の名前に使えるのは taroの左のHumanの事を指すためなのに変数の事を指すように聞こえるため
sakura_hana

2019/04/26 08:25 編集

言語による差異があるかもなので、実際のところは公式リファレンス見てもらった方が確実ですが…… 「new AAA()」はそれだけで「AAAってクラスのインスタンスを作るよ」って意味です。 だから「Human taro = new Human();」は 「Human型の変数taroを作るよ。Humanクラスのインスタンスを作るよ。作ったインスタンスを変数taroに入れるよ」って意味です。 (「変数に入れる」が具体的に何を指すかは今は割愛) 別に初期化必須ではなく、「Human taro;」だけだとtaroにはnullが入るようです。 だから「Human型の変数を初期化する場合、箱に入れるのはHumanクラス」ではなく「箱に入れるのはHuman型のインスタンス」が正しいです。 そもそもクラスは変数に入れられない……んじゃないかなぁと思います(うろ覚え)。そうする理由が無い気がしますし。 intについてはmomon-gaさんの回答及びリファレンス等参照してください。 ちなみに「参照型変数の型とそこに入るインスタンスの型は、必ずしも同じではない(大体は同じだが、場合によっては違うことがある)」です。 例えば「Humanクラスを継承したProgrammerというクラス」がある場合は、Human taro = new Programmer(); と書けます。 こちらについてはオブジェクト指向の「継承」「ポリフォーリズム」を調べてもらうといいかと思います。
ngsvx

2019/04/26 05:06

横から失礼します。 質問者さんが使用している、「クラス型の変数」「クラス変数」は、別の意味で一般的に使われています。 混乱を避けるために、その言い方はやめたほうがいいでしょう。 質問者さんが使いたいのは、「参照型変数」だと思います。 ちなみに、 クラス型の変数・・・・Classクラスの型を持つ変数 クラス変数・・・・クラスのフィールドで、staticが付けられているもの 参照型変数・・・byte、short、int、long、float、double、char等のプリミティブ型以外の変数
Java_Test2019

2019/04/26 06:24

なるほど、インスタンスと表現するべきでした。 ngsvxさんも有難う御座います。 各所で言われるクラス型変数とクラス変数は異なっているんですね。またそれぞれ参照型変数とも違うのですね。3つとも同じ参照型変数だと思っていました。 クラス変数はクラスにつける修飾子の事ですね。 クラス型の変数についてはまずClassクラスというものがあるという事ですか。Classクラスはクラスのクラスという事でしょうか。ちょっと調べます。
ngsvx

2019/04/26 08:10

>クラス変数はクラスにつける修飾子の事ですね。 勘違いだといけないので指摘しておきますが、 修飾子のことではなく、staticという修飾子がついたフィールド(変数)です。 そうそう、細かいことですが、プリミティブ型の中にbooleanを忘れてました(^^;
sakura_hana

2019/04/26 08:38

補足ありがとうございます。1つ前のコメントで深く考えず書いてた部分を修正しました。 クラス変数ってstaticなヤツのみだったんですね……私も超誤解してました。 (本来の意味でのクラス変数とインスタンス変数を引っくるめたヤツが「クラス変数」だと思ってました) public class Human{ public static God god; //クラス変数かつ参照型変数(God型の変数) public Animal pet; //インスタンス変数かつ参照型変数(Animal型の変数) public String name; //インスタンス変数かつ参照型変数(String型の変数) private int age; //インスタンス変数かつプリミティブ型変数(int型の変数) //どれも「フィールド」 } こんな感じですかね。(Stringをプリミティブ型って書きそうになったのは秘密)
ngsvx

2019/04/26 14:35

そんな感じですね。 調べていないので、多分ということになり確信はないですが、「クラス変数」という用語は、 javaの用語ではないと思います。javaでは「staticな」という言い方をするのではないかと。 「クラス変数」というのは、オブジェクト指向の方法論なんかで出てくる用語だと思います。 ちなみに「オブジェクト」という用語も同じではないかと。 javaではあくまでも「インスタンス」だったかと思います。 蛇足ですが、「オブジェクト」という用語は、いろいろな方法論で使い方が違っていたりしたため、 いろいろな意味を持つようになってしまったのではないかというのが、個人的な意見です。 現在は、「インスタンス」という言葉に近い使い方が多い気がします。 自動車オブジェクト → 自動車「クラス」の「インスタンス」 という具合。
guest

0

オブジェクト云々より前の質問でも言われていますが、javaの文法をまず覚えましょう。例えば、お決まりの「Hello, World!」とか「2つの数字を入力させて合計を表示する」とか・・・ゆっくり確実に、プログラミングに“銀の弾丸はない”(人月の神話)です。

投稿2019/04/25 08:22

編集2019/04/25 08:27
cateye

総合スコア6851

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

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

Java_Test2019

2019/04/25 08:53

回答有難う御座います。 済みません、ちょっと質問内容が伝わりにくかったみたいで・・・。 ちゃんとお聞きしたい部分が伝わるよう新しく質問作り直します。
cateye

2019/04/25 09:06

>質問内容が伝わりにくかった・・・ではなくて、言語の基礎が出来てない状態で聞くことではない・・・気がします。 他のオブジェクト指向言語(古くはSmalltalk,Objective-C、新しくはRuby,Swift,pythonなど)の設計思想とか考えましたか?
guest

0

ベストアンサー

基本的には、いわゆるオレオレ解説は気にしない方がよくて
公式ドキュメント読むほうがいいですよ。
英語ですが、chromeとかgoogleの翻訳使えば、そこそこ読めます。
※ちなみに、リンク先は読んでないので的はずれだったら、ごめんなさい。

Java言語、JavaVM仕様

そもそも、書いた本人でない人に解説求めても仕方ないでしょ。。。
以下、引用がくっついてるけど章節(4.3とか8.1)の先にある文言をくっつけただえです

Javaプログラミング言語には、2種類の型があります。プリミティブ型(4.2)と参照型(4.3)です。

参照型には、クラス型(8.1)、インタフェース型(9.1)、型変数(4.4)、配列型(10.1)の 4種類があります。

クラス宣言は新しい参照型を定義し、それらがどのように実装されるかを記述する

すごーーーく、雑に説明すると
Javaの変数は、プリミティブってよばれる、単純に値しか保持しないものと
参照型とよばれる値そのものを持つのでなく構造を持ったもの(構造への参照)がある。

参照型の代表的なものはプログラマが定義するクラス型で。
プリミティブ型や、参照型を組み合わせて定義する。
参照型はフィールドのほかに、メソッドが持てる(構造体との違いは、メソッド有無かなぁ)

オブジェクトについては、書く人の認識や文脈によって本当に解釈が多用なので、触れません。
いちおう、java言語仕様では、

4.3.1 オブジェクト

オブジェクトは、あるクラスのインスタンスまたは配列。
参照値(多くの場合単に参照)は、これらのオブジェクトへのポインタと、オブジェクトを参照しない特別なnull参照です。

と、いってます。

Humanオブジェクトを作るというのは、

Humanクラスとは何かを設計・定義して
そのインスタンスを作る。

ということです。

投稿2019/04/26 02:00

momon-ga

総合スコア4820

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

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

Java_Test2019

2019/04/26 02:16

回答有難う御座います。 他の皆さんの説明とも組み合わせてですがその説明で一気にわかった気がします。 その引用でどうしても少しも崩れない今までの悩みが一気にすっきりしました。本当にわかった気になっているだけかもしれませんが・・・もしそうなら、今回の話は基礎、つまり知識の土台なので今後の勉強でぶつかるはずです。ぶつからなければ大丈夫だと思います。 皆さん本当に有難うございました。
guest

0

定義が広すぎるのでそこまで深く理解せず解説の続きに進みました。

いや、理解してから進んでください。
前の質問も「解決済み」になってる割りに回答内容すらもあまり理解されてない状態で会話が成り立っていないところも散見されます。

一行でもコード打って実行したんですか?

投稿2019/04/25 08:21

m.ts10806

総合スコア80850

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

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

Java_Test2019

2019/04/25 08:42

入門書のサンプルコードは試しました。 周りや専門家に聞く、ネットで調べる等試した結果それでもわからない時皆さんはどのような対策を取られているのか気になります。ルール的に違反だと思うのでここでは聞きませんが。難しいものです;
m.ts10806

2019/04/25 08:45

上記「ルール的に違反」であれば最初の質問はご自身の理解されたルールでは違反になりますね。 質問の仕方次第です。理解しないまま進むのが一番マズイ。 「体系的学習」をしてください。 書籍のサンプルコードを試すのはあくまで「写経」の範疇を越えていません。
Java_Test2019

2019/04/25 08:53

返信ありがとうございます。 済みません、ちょっと質問内容が伝わりにくかったみたいで・・・。 ちゃんとお聞きしたい部分が伝わるよう新しく質問作り直します。
m.ts10806

2019/04/25 08:56

ん?質問内容はちゃんと伝わってますよ? もし当質問のことを仰っているのでしたら新しく質問たてるのではなく当質問を編集してください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問