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

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

ただいまの
回答率

89.51%

継承及びgetter,setter

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,214
退会済みユーザー

退会済みユーザー

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

public class A{

protected int a;
protected int a2;


public void setA(int a){

 this.a= a;

  }
public void setAa(int aa){

this.aa = aa;

 }
}


//Aを継承
public class B extends A {

protected int b;

super.setA(b);

}

//Aを継承
public class C extends A {

protected int c;

super.setAa(c);
}


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

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

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

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

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

private int y;

public int getY(){return y;}

public void setY(int y){this.y =y;}


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

お手数お掛けします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

 質問1

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

B←A→C や A→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

private int y;
public int getY(){return y;}
public 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 22:16

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

    キャンセル

  • 2017/06/21 22:56

    すみません。書き間違えました。あとで書き換えますが、c の間違いでした。

    キャンセル

  • 2017/06/21 23:23

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

    キャンセル

+1

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 23:18

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

    キャンセル

  • 2017/06/21 23:27

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

    キャンセル

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

  • ただいまの回答率 89.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる