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

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

ただいまの
回答率

90.48%

  • Java

    16124questions

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

java入門 インスタンス

解決済

回答 4

投稿

  • 評価
  • クリップ 1
  • VIEW 156

dn106278a

score 1

前提・実現したいこと

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

質問

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

またそうであるならば、Hero型に予めメモリ領域を持たせないのは何故でしょうか?
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mts10806

    2019/06/13 15:42

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

    キャンセル

  • quiqui

    2019/06/13 15:45

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

    キャンセル

回答 4

+1

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

前提が違います。

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

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

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

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

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

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

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

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

なので、

int a = 100;

とかみたいに書ける。

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

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

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

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

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

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

// Testっていうクラスがあるとして
Test* test = new Test(100);
test->method1();
delete 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 15:57

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

    キャンセル

  • 2019/06/13 16:14

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

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Java

    16124questions

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