質問: オブジェクト指向が分からなくなってきました。 最初にオブジェクト指向を学んだとき、以下のような例がでてきました。 例)Hero(※簡単なRPGをプログラムする際の主人公を意味します) Heroクラス :ヒーローが備えるべき性質、行動をまとめたもの(設計図) Heroインスタンス:実際のヒーロー(人) これは理解できました。しかし、実際に存在しないものに関してはどうしても違和感があります。 例えば以下のクラスとインスタンス。 例)StringBuilder(文字連結) StringBuilderクラス :文字連結に必要な操作をまとめたもの StringBuilderインスタンス:??? なぜインスタンスをつくるのかわかりません。 Heroの例にたとえると、文字連結の実際の何か???(書いていてわからない) インスタンスを作らずStaticメソッドだけでいいのではと思ってしまいます。 なぜインスタンスを作るのか、そのインスタンスはどういう役割をしているのか、教えて頂きたいです。 追記 皆さん、回答ありがとうございます。 回答を読んでなるほどと思った反面、もう少し時間を置きたいと思いました。 というのも、いままでしっくり来ていなかったことなので、分かった気になっているだけかもしれないからです。 もう一度、自分の中で本当に理解できているのか、疑問点はないのか確かめたうえで回答およびベストアンサーを決めさせていただきます。
回答: > > なぜインスタンスを作るのか、そのインスタンスはどういう役割をしているのか > > > たとえば、 ``` String hero = "ヒーロ"; String villain = "悪役"; ``` というのがあったときに、hiroとvillainが異なるっていうのは、わかりますか? 当たり前じゃない って思うでしょ? そう、当たり前なので解説を見ないのですが、異なる変数に異なるインスタンスを作るって結構あたりまえなのです。 なんでか?っていうと変数は一時的なものが多く、どんどん変更されることが多いため 使い切りになるケースが少ないからです。 StringBuilderも文字列加工は途中の状態がいくつも続くor 続けられるように インスタンス化して別々の文字列を加工できるように設計されています。 以下のような場合に、複数インスタンスが作れないと面倒くさそうだなというのが、わかると思います。 ``` StringBuilder heroNames = new StringBuilder(); StringBuilder villainNames = new StringBuilder(); for(story : storys) { heroNames.append(story.getHero().name()); villainNames.append(story.getvillain().name()); } ``` 逆に状態を管理する必要がない。 または複数のインスタンスで共通にしたいものがスタティックで設計されます。 たとえば、String#join なんかは、加工するというか、ただ連結するだけですがスタティックなメソッド なので、インスタンス化せずに利用できます。 同じクラスでも個々に状態を**簡単**に管理したいというのがインスタンス化したい。 という理解でよいと思います。 ※既回答にありますが、インスタンス化しなくても、そのように設計/実装すれば複数の状態を管理することはできます。