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

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

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

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

オブジェクト指向

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

継承

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

Q&A

解決済

2回答

5897閲覧

継承及びgetter,setter

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

オブジェクト指向

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

継承

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

0グッド

0クリップ

投稿2017/06/21 10:47

よろしくお願いします。
簡単なコードから

java

1 2public class A{ 3 4protected int a; 5protected int a2; 6 7 8public void setA(int a){ 9 10 this.a= a; 11 12 } 13public void setAa(int aa){ 14 15this.aa = aa; 16 17 } 18} 19 20 21//Aを継承 22public class B extends A { 23 24protected int b; 25 26super.setA(b); 27 28} 29 30//Aを継承 31public class C extends A { 32 33protected int c; 34 35super.setAa(c); 36} 37

という感じでB,CともにAを継承しています。

まずは、継承について質問させていただきます。
継承は、派生(能力の付加等)で使われていることはわかりました。
しかし、使うとprotectedは便利で、メインとサブの情報のやり取りが自由なのでどちらかというと接続といった感じだと捉えていましたが、最近、やはり派生か・・と。というのも

上記のコードで言えば
B←A→C という考えだったものが結局は__new__ で作るインスタンスとほぼ変わらず、Aの初期クラスを個々に派生する
A→B A→C という考えに至りました。
この認識で合っていますかというのが一つ。

この考えに至った経緯とともにセッターについての質問をさせていただきます。
簡単に言えばA経由でCからBの変数にアクセスしよう思ったがAの変数int a値が初期値だったため、派生元は同じだが別々に存在すると考えました。つまり、私の考えている
セッターで受け取った値の変数aと変数aaを派生元で比較しbooleanで結果を返すことは不可能かというのが二つ。

最後はゲッターのタイミングです。
セッターとゲッターが存在しますが、例えば

java

1private int y; 2 3public int getY(){return y;} 4 5public void setY(int y){this.y =y;} 6

と単純なものがあったとして、セッターが値を受け取ったときのゲッターはその値を返してくれるのでしょうか、それとも初期値を返しますかというのが三つ目です。

お手数お掛けします。

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

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

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

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

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

guest

回答2

0

A→B A→C という考えに至りました。

この認識で合っていますかというのが一つ。

語弊を恐れずに書けば、まずはA,B,Cであるという解釈をしたほうが良いかと思います。

正確には、クラス設計的に考えるとA→B A→Cという図式で仰りたいことは伝わらなくもありませんが、恐らく実行時はインスタンス化しますよね?
A,B,Cをインスタンス化したa,b,cがあったとして、それらの存在はクラスの関係性とは関係がなく、a,b,cが正しい認識だと思います。
基本的にはAとBとCに関係はないという解釈をしたほうがより良い設計ができると思います。

セッターで受け取った値の変数aと変数aaを派生元で比較しbooleanで結果を返すことは不可能かというのが二つ。

上記で記載した通りA,B,Cに基本的に関係はないと思ってください。
その間で値のやり取りをしようという発想と設計自体に疑問を感じるべきかと考えます。
不可能かと問われれば不可能ではないのだろうと思いますが、とても良い設計とは言えないことになりそうです。(私はやりません)

無理なくやれることは、継承先であるB,Cで継承元であるAの値を利用する、ということです。

もしくは、インスタンスの持つメソッドとして、A,B,Cを意識せずにインスタンス同士での値のやり取りをするための処理を記述することです。

セッターが値を受け取ったときのゲッターはその値を返してくれるのでしょうか、それとも初期値を返しますかというのが三つ目です。

a,b,c(A,B,Cではなく)のゲッターは、セッターで値を設定した値を必ず返します。
「A経由でCからBの変数にアクセスしよう思ったがAの変数int a値が初期値だった」ということからのご質問かと思います。なぜそういうことになるのかは実際のコードを見なければ分かりませんが、多少無理のあることを実行しようとした結果ではないかと予想します。

恐らくですが、クラスとインスタンス化に関する基礎知識がちょっと足りていないのではないかなと思います。こちらなど、参考になるのではないでしょうか?

投稿2017/06/21 12:29

akabee

総合スコア1947

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

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

退会済みユーザー

退会済みユーザー

2017/06/21 14:18

サイトのご提示ありがとうございました。 やっぱり何となく合ってて、何となくズレた解釈みたいです。 回答ありがとうございます。 この根本的な部分が抜けているから、今つまずいているのかなと実感しました。 何回も読んで頭に叩き込みます。 回答の、無理なクラス設計をしているというのは妙に納得しました。確かにそんな気がします。 基礎をもう少し頑張ります。
akabee

2017/06/21 14:27

クラスとインスタンスの概念はけっこう難しく、理解せずにコードを書くと本当にわけがわからなくなります。 嫌味ではなく、一度しっかり基礎を学ばれたほうがよいかと思います。これから先の生産性がかなり違ってきます。 まずは動かしたい、ということであれば、使いこなせない機能(継承など)は極力使わないことをお勧めします。 Javaは全部使いこなそうとすると大変です。最近出てきたGo言語なんかも、「極力やれることが少ない」ことが売りになっていて一部で支持されています。 やれることが多いことが必ずしも良いとは言えない例ですね。
guest

0

ベストアンサー

質問1

B←A→C という考えだったものが結局はnew で作るインスタンスとほぼ変わらず、Aの初期クラスを個々に派生する
A→B A→C という考えに至りました。
この認識で合っていますかというのが一つ。

B←A→CA→B A→C が何を表しているのか良く分かりませんが、とりあえず A を主役として喋っておられる事は理解しました。

クラス A は、B および C が A から継承している事は知りません。
つまり A からすると B に b があり、C に c がある事など分かりません。(リフレクションを使うとかいうのは無しです)

質問2

以下のソースを見て下さい。

//Aを継承 class B extends A { } //Aを継承 class C extends A { } public class A{ protected int a; public void setA(int a) { this.a = a; } public int getA() { return this.a; } public static void main(String[] args) { B b = new B(); C c = new C(); b.setA(1); System.out.println(c.getA()); // 0 になります c.setA(2); System.out.println(b.getA()); // 1 になります System.out.println(c.getA()); // 2 になります } }

B のインスタンス b と、C のインスタンス c は、A のインスタンスを共通部分に持つわけではありません。

セッターで受け取った値の変数aと変数aaを派生元で比較しbooleanで結果を返すことは不可能かというのが二つ。

というのが良く意味が分かりませんが、このソースの通り、b の持つ A 部分、c の持つ A 部分は別で保持されると考えて下さい。

質問3

java

1private int y; 2public int getY(){return y;} 3public void setY(int y){this.y =y;}

インスタンス単位に y は保持されます。上記の例で、c から返る getA と b から返る getA が異なる事で理解いただけるかと思います。ですので

セッターが値を受け取ったときのゲッターはその値を返してくれるのでしょうか、それとも初期値を返しますかというのが三つ目です。

インスタンスが同じであればその値が返ります。

極端な例を言うと B のインスタンスを b1, b2, b3, b4, b5, b6... b100 という100個の変数で作った場合、それぞれ別の setA/getA を操作出来ます。

投稿2017/06/21 11:57

編集2017/06/21 13:56
mattn

総合スコア5030

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

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

退会済みユーザー

退会済みユーザー

2017/06/21 13:16

回答ありがとうございます。 A→B A→Cはインスタンスが違うという図解みたいなものでした。大体それで片が付きそうですね。 あとなんか根本が少し変なのかなと感じました。 質問を一つさせてください。 回答をいただいた質問2のコードの最後の2文なんですが、詳しくお願いします。 1文目はインスタンスが違うということで理解できます。 2文目が//1になりますとありますが、よくわかりません。私は2かと思ってしまいました。 仮にこの下に b.setA(4); System.out.println(b.getA()); とすると2が表示されるのでしょうか? もう少しだけご教授ください。
mattn

2017/06/21 13:56

すみません。書き間違えました。あとで書き換えますが、c の間違いでした。
退会済みユーザー

退会済みユーザー

2017/06/21 14:23

わざわざすみません。 とりあえず、課題はインスタンスの捉え方ですね。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問