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

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

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

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

Q&A

解決済

4回答

209閲覧

java入門 インスタンス

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

1クリップ

投稿2019/06/13 06:27

前提・実現したいこと

Javaの入門書を読んでいます。その中で、クラス型変数はインスタンスを代入して用いると習いました。
例えば、
Hero h = new Hero();
//Heroはクラス型変数
のように書くということです。

質問

int型であればnew以降を書く必要がないのは、構造体変数が予めメモリ領域を持っているためでしょうか? またそうであるならば、Hero型に予めメモリ領域を持たせないのは何故でしょうか?

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

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

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

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

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

m.ts10806

2019/06/13 06:42

>int型であればnew以降を書く必要がないのは、構造体変数が予めメモリ領域を持っているためでしょうか? ちょっと何を言いたいのか分かりません。具体的なコードを例示してください。
quickquip

2019/06/13 06:45

どちらかというと謎の用語が登場しているのが問題かと。(自分だけに通じる用語で質問しても自分にしか通じない)
guest

回答4

0

疑問を持つのはもっともですがまだ理解には早い段階でしょう。その疑問は抱えたまま先に進むべきです。端的には

Hero型の変数が指す(参照する)のはHero型のインスタンスとは限らないから、変数の宣言でメモリを確保するわけにはいかない

と言っちゃっていいと思います。

そんなことをこの段階で言われても、Hero型の変数がHero型じゃないインスタンスを指すってなんだよ? ってなるだけじゃないでしょうか?
質問を書いたり回答を読んだりする時間がもったいないです。先に進みましょう。

投稿2019/06/13 07:03

編集2019/06/13 07:15
quickquip

総合スコア11038

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

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

0

ベストアンサー

int型であればnew以降を書く必要がないのは、構造体変数が予めメモリ領域を持っているためでしょうか?

int 型(プリミティブ型)も Hero 型(参照型)も基本的に予めメモリを確保していません。

「Java でクラスのインスタンス生成するには、new を使う文法になっている」という理解で良いと思います。

なぜそのような文法になったのかハッキリとは分かりませんが、Java が C++ を参考に作られたので、C++ の文法がそのまま引き継がれたんだと思います。

投稿2019/06/14 00:34

nskydiving

総合スコア6500

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

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

0

int型であればnew以降を書く必要がないのは、構造体変数が予めメモリ領域を持っているためでしょうか?

「構造体」という用語は、Javaの用語ではありません。intなどはプリミティブ型、オブジェクトは参照型と区分されます。

投稿2019/06/13 06:52

maisumakun

総合スコア145184

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

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

0

前提が違います。

まず、メモリは何種類かあるようです。

私が知っているやつは、スタック領域ヒープ領域です。

他にもあるらしいですが、詳しくはわかりません。

スタック領域は、自動的に確保されるエリア。ですが、このエリアは意外と狭い。

なので、動的に確保できるエリア、ヒープ領域も用意されています。

ヒープ領域ではnewで確保して、C++でいうdeleteで破棄...と自分で後片付けもしないといけません。

Javaなんかではガーベージコレクタとかそういう、Java側のやつで「不必要になったら削除」してくれる機能があるので、そこまで問題ではないですが。

int型変数やlong型変数, double型変数...といったプリミティブ型と呼ばれる型の変数は、動的確保をしなくてもスタック領域で事足りるのでふつうは newしない。
(場合にもよりますが)

なので、

Java

1int a = 100;

とかみたいに書ける。

でも、クラスなんかはメンバ( フィールドやメソッド ) の分もかかってくるので、
2~4バイトだけ...ってことはなく、実際にはもっとかかるかもしれません。

なので、new で確保する方法になっているっぽいです。

C++では、プリミティブ型みたいに生成することは可能です。

C++

1// Testっていうクラスがあるとして 2Test test(100); 3test.method1();

ですが、これはメンバの分は確実に重くなります。

なので、動的確保を用いて、

C++

1// Testっていうクラスがあるとして 2Test* test = new Test(100); 3test->method1(); 4delete test;

みたいにすれば、重さは少しマシになる。

このnew/deleteをする方法をJavaは取り入れられているのだと思います。

また、前提が違う...っていうのは intはあくまで型。
構造体じゃないです。


[追記1]

maisumakunさんからご指摘を受けました。

えーっと、私が言いたかったのは、C++で説明しますが、

(サイズが環境によって異なることと、私自身が完全には試していないことから)

【C言語/C++】データ型のサイズ・範囲の一覧【32bit/64bit環境】を例にとると、

char : 1
int : 4
long long : 8
double : 8

となっています。

仮に、クラス(構造体でもいいですが) のメンバとして、
(あくまで例)

  • 名前 : 文字列 // 要素数30 + 1 = 31
  • number : int // 学籍番号とか
  • 体温 : double

と考えたとき、単純に計算しても、

char : 1
int : 4
double : 8

なので、

名前のサイズ = 1 * 31 = 31
学籍番号系のサイズ = 4
体温のサイズ = 8

すべて合わせると、31 + 4 + 8 = 43 はかかる。

でも動的確保だとC++ではポインタで表されるため、容量が少なく済む。

っていうことです。

(もしかして、私の解釈、間違ってます? )

投稿2019/06/13 06:48

編集2019/06/13 07:10
BeatStar

総合スコア4958

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

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

maisumakun

2019/06/13 06:57

本題ではないのですが、「Test test(100);」という宣言がnew-deleteに対して重い、というのは、どのようなオーバーヘッドがあるということでしょうか?
maisumakun

2019/06/13 07:14

結局newをするのであればその分のメモリ容量は確保する必要があるわけで、差にはならないかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問