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

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

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

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

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

2回答

666閲覧

Javaの簡単なコード添削をお願いします。(abstract & interfaceの使い方に関して)

chokokorone333

総合スコア32

Java

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

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2020/04/25 07:05

質問事項
abstractなクラスNormalHumanで定義されている変数nameを、サブクラスのコンストラクタで初期化をしています。
スーパークラスを継承しているので、this.name = nameで書き換えれば良いのかと考えました。
ですが、super.name = nameでも問題なく動いてしまいます。
自身の知識では、"thisはインスタンス自身を指す。"という認識です。
スーパークラスを継承しているので、NormalHumanクラスもnameは所持していることになるので、this.name = nameは動くのは理解できます。
そこで、疑問なのが、super.name = nameで動いた場合はどういった考えをモテが良いということです。

質問事項2
interfaceでメソッドを定義する場合のアクセルレベルは、なぜpublicなのでしょうか。
abstractクラスでは、protected abstractが可能です。
アクセルレベルがpublicでのみ実装できるということは、protected等で実装したい場合はinterfaceは使えないということだと思ってしまいました。
それは果たして不便では無いのだろうか?という疑問が残ります。

よろしくおねがいします
理解不足の質問かもしれませんが、ご回答をいただけますと幸いです。
よろしくおねがいします。

Java

1 2abstract class NormalHuman{ 3 String name; 4 5 void walk() { 6 System.out.println(name + " can walk."); 7 } 8 9 abstract void speak(); //abstractメソッドはabstractクラス内にしか書けない。 10} 11 12interface SuperHuman{ 13 void fly(); //interfaceでは抽象メソッドは自動でpublic abstract 14} 15 16class Human extends NormalHuman{ 17 18 Human(String name) { 19 this.name = name; //this.name = name でも実行可能。なぜ? 20 } 21 22 @Override 23 public void speak() { 24 System.out.println(name + " can Speak Japanese."); 25 } 26} 27 28class SuperMan extends NormalHuman implements SuperHuman{ 29 30 public SuperMan(String name) { 31 this.name = name; 32 } 33 34 @Override 35 public void speak() { 36 System.out.println(name + " can Speak All langage."); 37 } 38 39 @Override 40 public void fly() { 41 System.out.println(name + " can fly"); 42 } 43} 44 45public class Issue_6 { 46 public static void main(String[] arg) { 47 Human takeda = new Human("Takeda"); 48 takeda.walk(); 49 50 Human yoshida = new Human("Yoshida"); 51 yoshida.speak(); 52 53 SuperMan ikeda = new SuperMan("Ikeda"); 54 ikeda.walk(); 55 ikeda.speak(); 56 ikeda.fly(); 57 } 58}

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

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

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

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

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

guest

回答2

0

アクセルレベルがpublicでのみ実装できるということは、protected等で実装したい場合はinterfaceは使えないということだと思ってしまいました。

interfaceと無関係にprotectedメソッドを実装することは可能です。interfaceはあくまで外から見た形を決めるためのものですので、protectedを規定する必要は本質的にありません。

投稿2020/04/25 08:22

maisumakun

総合スコア145121

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

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

0

ベストアンサー

質問1

this.name = nameは動くのは理解できます。

そこで、疑問なのが、super.name = nameで動いた場合はどういった考えをモテが良いということです。

this.nameもsuper.nameも同じものを指します。
そもそも、仮引数の名前をname以外にした場合は、thisやsuperさえもいらずにname = nm;のよう設定できます。

仮引数と設定したいフィールドが同じ名前のため、修飾子が必要になっています。

ちなみに、サブクラス側(Human)で同名のフィールドnameを作成した場合にthis.nameとsuper.nameは参照先(設定先)が変わります。

java

1Human(String nm) { 2// 以下の3つは全て同じsuperクラスのnameに設定される) 3 this.name = nm; 4 super.name = nm; 5 name = nm; 6}

質問2

interfaceでメソッドを定義する場合のアクセルレベルは、なぜpublicなのでしょうか。

intefaceは、そもそもパッケージ外から呼ばれる/実装されることを前提としています。
オブジェクト指向プログラミングの特徴で”制御の反転”と呼ばれるものがあります。
アクセス制御のあるjavaの場合、メソッドを呼ぶ側(フレームワークなど)は、実装されるクラスとは
異なるパッケージ、継承関係でないのが普通であるためpublicにせざるを得ません。

投稿2020/04/25 21:56

momon-ga

総合スコア4820

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問