クラス型変数を理解しようと思って調べたら、下記のサイトに当たりました。
https://nobuo-create.net/java-beginner-17/
ここの解説についてお聞きしたいと思います。
わからない事だらけなので、とりあえずわからない所を少しずつ質問したいと思います。
まず、オブジェクトというものは物。ある、よく聞くオブジェクトは何かというサイトで、プログラミングで扱うもの全てがオブジェクトと言っていました。という事はクラスも変数もプロジェクトもEclipseという開発環境もオブジェクトですよね。定義が広すぎるのでそこまで深く理解せず解説の続きに進みました。
次には、Humanオブジェクトを作ろうと書いています。よくわからないのですがHumanと名のついた何かをどこかに作るという事なのでしょうか。どんなもので何のためなのかわかりませんが、深く解説がない事からそこまで意識しないで良いのだろうと解説の続きに進みました。
次には、Humanオブジェクトを作るためにHumanクラスを書くとありますね。Humanオブジェクトというものが何のためにどこに作られるどんなものを指すのかわかりませんが、Humanクラスを書く必要があるという文章だと判断しました。
ここから、mainメソッドは手続き、といいますか処理を書くメソッドだという話まではおそらく理解しております。
オブジェクトというどこかで作られる何かという正体のわからないものが、何のためかに必要で、作るにはそのためのクラスが要る、そしてそのクラスはmainメソッドがクラスのブロック内にあるそのクラスとは別物のクラスである必要がある。
こう理解したつもりだったのですが、次の文章で、同じクラスのくくりですがとあり、別に書く(作る)必要があるけれど同じクラスのくくり??と混乱しております。
とりあえずここまでの解説の意味を知る事から始めたく、わかる方、ぜひご教授お願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/25 08:22
2019/04/25 08:23
2019/04/25 09:56
回答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の値を返す」となり、わたしの名前は太郎です。
と無事に返って来るようになります。
花子でも同じことをすれば同じようになります。
太郎とは同じクラスを元に出来た同類ではありますが、taro
とhanako
は別のオブジェクトなので、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総合スコア11427
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/26 00:07
2019/04/26 00:11
2019/04/26 00:23
2019/04/26 00:39
2019/04/26 01:31
2019/04/26 01:39
2019/04/26 08:25 編集
2019/04/26 05:06
2019/04/26 06:24
2019/04/26 08:10
2019/04/26 08:38
2019/04/26 14:35
0
投稿2019/04/25 08:22
編集2019/04/25 08:27総合スコア6851
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/25 08:53
2019/04/25 09:06
0
ベストアンサー
基本的には、いわゆるオレオレ解説は気にしない方がよくて
公式ドキュメント読むほうがいいですよ。
英語ですが、chromeとかgoogleの翻訳使えば、そこそこ読めます。
※ちなみに、リンク先は読んでないので的はずれだったら、ごめんなさい。
そもそも、書いた本人でない人に解説求めても仕方ないでしょ。。。
以下、引用がくっついてるけど章節(4.3とか8.1)の先にある文言をくっつけただえです
Javaプログラミング言語には、2種類の型があります。プリミティブ型(4.2)と参照型(4.3)です。
参照型には、クラス型(8.1)、インタフェース型(9.1)、型変数(4.4)、配列型(10.1)の 4種類があります。
クラス宣言は新しい参照型を定義し、それらがどのように実装されるかを記述する
すごーーーく、雑に説明すると
Javaの変数は、プリミティブってよばれる、単純に値しか保持しないものと
参照型とよばれる値そのものを持つのでなく構造を持ったもの(構造への参照)がある。
参照型の代表的なものはプログラマが定義するクラス型で。
プリミティブ型や、参照型を組み合わせて定義する。
参照型はフィールドのほかに、メソッドが持てる(構造体との違いは、メソッド有無かなぁ)
オブジェクトについては、書く人の認識や文脈によって本当に解釈が多用なので、触れません。
いちおう、java言語仕様では、
オブジェクトは、あるクラスのインスタンスまたは配列。
参照値(多くの場合単に参照)は、これらのオブジェクトへのポインタと、オブジェクトを参照しない特別なnull参照です。
と、いってます。
Humanオブジェクトを作るというのは、
Humanクラスとは何かを設計・定義して
そのインスタンスを作る。
ということです。
投稿2019/04/26 02:00
総合スコア4820
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/26 02:16
0
定義が広すぎるのでそこまで深く理解せず解説の続きに進みました。
いや、理解してから進んでください。
前の質問も「解決済み」になってる割りに回答内容すらもあまり理解されてない状態で会話が成り立っていないところも散見されます。
一行でもコード打って実行したんですか?
投稿2019/04/25 08:21
総合スコア80850
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/25 08:42
2019/04/25 08:45
2019/04/25 08:53
2019/04/25 08:56
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。