Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

instanceof 演算子について

はじめまして。
instanceof演算子についての質問です。
以下のソースで「aaa」と表示されるのですが、
「else if」がなぜ通らないのかがわかりません。

「class Child」は「class  Parent」を継承しているので、通ると思ったのですが・・・。


また「Parent p = new Child();」の意味がわかりません。インスタンス生成なら「Child p = new Child();」と書くのではないでしょうか。

問題集の問題ですが、解説があまりなく困っています。
どなたか教えてください。

class  Parent {}

class Child extends Parent{}

public class Test2_9 {
    
 public void Check(Parent p){

  if (p instanceof Child)
    System.out.println("aaa");
  else if (p instanceof Parent)
    System.out.println("bbb");
                
    }
  
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO 自動生成されたメソッド・スタブ
        
        Parent p = new Child();
        new Test2_9().Check(p);
        
        
    }

}

10

回答

81177

閲覧

10件の回答

評価

0

> else ifがとおらない理由
if文のお勉強をやり直してきなさい。
instanceofは何の関係もないわよ。


> Parent p = new Child();
Child c = new Child()
との違いは、具体的に言うと変数pの場合は、
キャストなしにはParentのメソッドしか使えない
変数cの場合はChildのメソッドも使える
てところね。
抽象的に言うと、変数cをChildクラスではなく
Parentクラスとして扱いたいから、
ということになるわ。
オブジェクト指向と、「継承」を再勉強するといいわ。

評価

0

早速のご返答ありがとうございます。
If文はどっちかしか通らないので、「p instanceof Parent」は「False」になると思い込んでいました。
「p instanceof Child」と「p instanceof Parent」を入替えてみたところ、「p instanceof Parent」でも通りました。


変数の使い方も大変参考になりました。
ありがとうございます。

評価

0

私は初心者、以下の認識は正しいかどうかわかりません。もし、違うことがあったら、ご指導してください。

instanceof について、戻る値 tureの条件、以下のいずれの場合。
例えば:
A  instanceof B

1. AはクラスBの対象
2. AはクラスBを引継ぎしたクラスの対象

あなたのソースにて。
「Parent p = new Child();」
 
 pはクラスChildの対象。

 「p instanceof Child」 の戻る値 true.(先ほどの場合 1 )


  「(p instanceof Parent」の戻る値 true.(先ほどの場合 2 )




評価

0

すみません、私の日本語。。最低です。
以下修正する

instanceof について、戻る値 tureの条件、以下のいずれの場合。
例えば:
A  instanceof B

1. AはクラスBのオブジェクト
2. AはクラスBを引継ぎしたクラスのオブジェクト

評価

0

以下の条件に当てはまる場合tureを返します。

【1】Aで指定されたオブジェクト変数がBで指定されたクラスのインスタンスである。

【2】Aの指定がインターフェイスだった場合、オブジェクトが指定インターフェイスを実装している

【3】オブジェクトが指定インターフェイスをインプリメントしている


いずれにも該当しない場合はfalseを返します。

「初心者」さんの1と2はこのいずれにあたるのか判断できないのですが、良かったら参考までに。

評価

0

私の日本語能力が低い。もし訳ございません。

私の1 は 貴方の【1】。

でも、私の2は貴方のいずれにも該当しない。

私の2について、例えば


class  Parent {}

class Child extends Parent{}

Child A = new Child ();

「A instanceof Parent」 

tureを返します
原因は「Child extends Parent」


評価

0

A  instanceof B

1. AはクラスBのオブジェクト
2. AはクラスBを引継ぎしたクラスのオブジェクト
このどちらもtrueを返すと思います。
初心者さんの言うとおり「Childクラス」が「Parentクラス」を継承しているからだと思います。

私のif分、どちらもtrueを返すのです。
【1】【2】【3】はインターネットで「instanceofとは」と検索した結果です。私にもなぜ【1】〜【3】の中に継承が書かれていないのかがわかりません。




評価

0

要するに、instanceofの仕様は理解できたが、各解説が継承に言及してないことが疑問ってこと?

評価

0

$さんのおっしゃるとおりです。

仕様は段々と理解できるようになりましたが、各解説がなぜ継承に言及していないのかが疑問です。

評価

0

俺にいわせれば、なんでいちいち言及せにゃならんのかわからん。

継承関係とか包含関係を理解できていればすむこと。
これについては、演算子の仕様だけじゃなくて、
オブジェクト指向に関する知識が必要。

逆に、いちいち端から端まで解説するとなると、
あちこちで同じことを繰り返し書かなきゃならない。
そんな参考書、読みたいか?

初心者の内は、理解が前後することもあるでしょ。
がんばってください。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。