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

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

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

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

Q&A

2回答

2565閲覧

has-aの関係が分かりません

gondawara_mari

総合スコア6

Java

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

0グッド

0クリップ

投稿2017/10/13 00:17

Main.Javaの最後の文にあるh.sword.nameの意味が分かりません。参考書にメモリをイメージするようにとありますが、イメージすることが難しいです。

// まずSwordクラスを定義しておく
public class Sword {
String name;
int damage;

}

// 次にHeroクラスを定義する
public class Hero {

String name; int hp; Sword sword; void attack() { System.out.println(this.name + "は攻撃した!"); System.out.println("敵に5ポイントのダメージをあたえた!") }

}

public class Main {

public static void main(String[] args) { Sword s = new Sword(); s.name = "炎の剣"; s.damage = 10; Hero h = new Hero(); h.name = "ミナト"; h.hp = 100; h.sword = s; System.out.println("現在の武器は" + h.sword.name); }

}

出力結果 現在の武器は炎の剣

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

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

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

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

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

guest

回答2

0

Java

1// Swordを作成 2Sword s = new Sword(); 3// このSwordの名前は「炎の剣」である 4s.name = "炎の剣"; 5// 「炎の剣」の攻撃力は「10」である 6s.damage = 10; 7// Heroを作成 8Hero h = new Hero(); 9// このHeroの名前は「ミナト」である 10h.name = "ミナト"; 11// 「ミナト」のヒットポイントは「100」である 12h.hp = 100; 13// 「ミナト」に「炎の剣」を装備させる(has) 14h.sword = s; 15// 「ミナト」が持っている剣の名前を出力。つまり「炎の剣」となる 16System.out.println("現在の武器は" + h.sword.name);

投稿2017/10/13 00:37

編集2017/10/13 00:48
root_jp

総合スコア4666

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

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

0

「has-a」のhasは「持っている」という意味の英語の動詞 have の3人称単数形です。
("I have a pen","He has a pen"なんていう例題があったでしょ?)

クラスAにクラスBの変数が含まれている場合、クラスAはクラスB(の変数)を持っている(has-a)事になります。
質問のコードだと、Heroクラスは、Swordクラスの変数swordを持っていますから、"クラスHeroはクラスSwordを持っている"となる訳です。("クラスHeroはクラスSwordを包含している(含んでいる)"というような表現が使われることもありますが、意味するところは同じです)

HeroクラスはSwordクラスの変数swordを持っていますから、Heroクラスのインスタンス(オブジェクト)からswordの値を取り出したり、値を変更したりする事ができます。その際、どの変数なのかは変数名で指定します。

このぐらいまで理解していると、Mainクラスのコードの意味が判ると思います。
以下、Mainクラスの各行の下にコメントでコード意味を書いてみますので、ゆっくりと読んでください。
そんなに苦労せずに意味が判るのではないかと思います。

public class Main { public static void main(String[] args) { Sword s = new Sword(); // mainメソッドは、Swordクラスの変数sを持っています。 // そこに、Swordクラスのインスタンスを設定(代入)します。 // これ以降、sという変数はSwordクラスのインスタンスなのだと思ってコードを読んでください。 s.name = "炎の剣"; // Swordクラスは、Stringクラスの変数nameを持っています。(class Swordのコードを見てください) // そこに、"炎の剣"という値(文字列)を代入します。 s.damage = 10; // Swordクラスは、整数型の変数damageを持っています。 // そこに、10という値を代入します。 Hero h = new Hero(); // mainメソッドは、Heroクラスの変数hを持っています。 // そこに、Heroクラスのインスタンスを設定(代入)します。 h.name = "ミナト"; h.hp = 100; // Heroクラスのインスタンス h が持つStringクラスの変数nameと、整数型の変数hpに、"ミナト"と10を代入します。 h.sword = s; // Heroクラスのインスタンス h が持つSwordクラスの変数 swordに、このクラス(Main)で生成・設定したSwordクラスの変数sを代入します。 // h.swordとsが同じ値になったことを覚えておいてください。 System.out.println("現在の武器は" + h.sword.name); // h.swordとsは同じ値なのですから、h.sword.nameとs.nameも同じになります。 // ここで、mainメソッドのコードを見直してみると「s.name = "炎の剣";」と設定されています。 // "現在の武器は"に続けて(+)、h.sword.nameの値("炎の剣")を画面に表示(System.out.println)すれば、『出力結果 現在の武器は炎の剣』となる訳です。 } }

投稿2017/10/13 01:29

coco_bauer

総合スコア6915

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問