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

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

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

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Java

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

1回答

534閲覧

Javaについて。インスタンス化したときの動きについての質問です。

Aya_nishimura

総合スコア16

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Java

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

0グッド

1クリップ

投稿2020/05/14 07:43

インスタンスを生成、インスタンス化するみたいな事を聞きますが、
以下の認識で大丈夫ですか?
動きがいまいち理解できていません。

(1)
newする事でClassSampleクラスのインスタンスを生成
これにより、ClassSampleにあるメソッドを扱える

new ClassSample();

(2)
newしてClassSampleのインスタンスを生成
また、ClassSample型に代入
ここで疑問なのが、なぜ型はClassSampleなんでしょうか?
とりあえず、型名を合わせるようにしてました。
改めて考えるとわかりません。
よく型とインスタンスの型が違っても代入することありますよね。。。

ClassSampe hoge = new ClassSample();

以上です。
ご回答のほどよろしくお願いいたします。

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

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

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

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

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

yoorwm

2020/05/14 07:49

> ここで疑問なのが、なぜ型はClassSampleなんでしょうか? では、何が正しい、と思っているのでしょうか? > よく型とインスタンスの型が違っても代入することありますよね。。。 「基本的には無い」ので、該当の箇所を引用してみてください。 (たぶん、ポリモーフィズムの箇所かとは思いますが。)
guest

回答1

0

Java

1class Main { 2 public static void main(String[] args) { 3 String str = new String("sss"); 4 Object obj = new String("ooo"); 5 CharSequence cs = new String("ccc"); 6 System.out.println("str = " + str); 7 System.out.println("obj = " + obj); 8 System.out.println("cs = " + cs); 9 obj = str; 10 System.out.println("obj = " + obj); 11 str = (String)cs; 12 System.out.println("str = " + str); 13 } 14}

new String("sss") でインスタンス化した String オブジェクトで、
String型の変数 str を初期化するのは分かるが、
new String("ooo") でインスタンス化した String オブジェクトで、
Object型の変数 obj を初期化できるのはなぜか、
という質問でしょうか?

それは、Stringクラスが Objectクラスを継承しているからです。
また、Stringクラスは CharSequenceインターフェイスを実装しているから、
CharSequence cs = new String("ccc"); も同様にできるのです。

obj = str; で Object型の変数 obj に String型の変数 str をなぜ代入できるのか?
という質問でしょうか?

実は obj も str も参照型といって、
その変数自身にオブジェクトを持っているのではありません。
オブジェクトを参照しているだけです。
代入前は、obj は "ooo" を値に持つ Stringオブジェクトを参照していましたが、
代入後は、obj は "sss" を値に持つ Stringオブジェクトを参照するようになります。

"ooo" を値に持つ Stringオブジェクトは誰も参照しなくなるので破棄されます。
"sss" を値に持つ Stringオブジェクトは 2つの変数 obj と str の両方から
参照されます。
"sss" を値に持つ Stringオブジェクト自身は 1つのままです。
オブジェクトがコピーされて 2つのオブジェクトになったわけではありません。

あるクラスをインスタンス化したオブジェクトは、その継承元の変数や
実装しているインターフェースの変数でも参照できます。

ただ、継承元の変数を継承先の変数に代入する場合はキャストが必要になります。
それが、str = (String)cs; です。

以上、理解できたかどうかコメントをお願いします。

投稿2020/05/14 09:29

kazuma-s

総合スコア8224

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問