2017-08-02 10 views
1

私はアップキャストとダウンキャストのコンセプトをJavaで行いました。これは拡大と縮小とも呼ばれます。アップキャスティングはどのようにJavaで動作しますか?

  • UpCasting(拡大)は、派生クラスから基底クラスに自動的に行われます。それはis-a関係を有する場合である。
  • ランタイムチェックのためにダウンキャスティングを明示的に実行する必要があります。

私は概念とすべてを得ました。しかし、この場合、どのように動作していますか?

public class ObjPair { 
    Object first; 
    Object second; 

    public ObjPair(Object first, Object second) { 
     this.first = first; 
     this.second = second; 
    } 

    public Object getFirst() { 
     return first; 
    }  
    public Object getSecond() { 
     return second; 
    } 

    public static void main(String[] args) { 
     ObjPair objPair = new ObjPair("A",2.2); // Goes widning conversion 
     System.out.println(objPair.getFirst()); 
     System.out.println(objPair.getSecond()); 
    } 
} 

ObjPair objPair =新しいObjPair( "A"、2.2)。これは、アップキャストを通過している

  • 、文字列オブジェクトへとダブルオブジェクトにし、状態がobjPairでストアを取得します。すばらしいです..!!!さて、私はobjPair.getFirst()objPair.getSecond()を行う際

。それは私にA2.2を返します。

  • 文字列と倍精度をどのように覚えているのですか?拡大/上書きは、スーパークラスの状態とメソッドを覚えているはずです。
  • サブクラスの型と値はどのようにアクセスできますか?
+0

あなたの 'ObjPair'では、それは文字列とdoubleとして格納されます。 – Nathan

+0

アップキャスト後にObjectとして保存されていますか?それがアップキャストが起こっているところです。 – Ritesh

+3

また、Objectクラスにはprintln()が使用するtoString()メソッドがあります。 StringとDouble(autoboxからdouble)は、toString()をオーバーライドして値を正しく出力します。 –

答えて

3

オブジェクト参照のキャストはではありません。オブジェクトを変更します。それは単にそれを異なるタイプの参照に割り当てることができます。オブジェクト自体は変わりません。

2つのObject参照が必要で、互換性があるかどうかを確認し(問題ありません)、参照はタイプObjectの変数に設定されています。インスタンス自体は変更されません。それらにObjectのメソッドをオーバーライドするメソッドがある場合は、オーバーライドされたメソッドが呼び出されます。

したがって、オブジェクトを印刷する部分については、オブジェクトのtoString()メソッドを呼び出すString.valueOfを単に使用します。Object変数からアクセスされるインスタンスは実際にはStringオブジェクトで、StringtoString()をオーバーライドして自身を返します。 DoubletoStringを上書きします。これらのオーバーライドは、インスタンスがまだStringのインスタンスであり、インスタンスがDoubleであるため呼び出されます。参照のみがObjectです。

また、doubleからDoubleまでのキャストがあります。この暗黙のボクシングはオブジェクトを変更します - それはプリミティブを取り、そこから新しいDoubleを作成します。

+0

あなたは、私の視覚的な例をあなたの答えに加えることができます。 – Nathan

1

は覚えておいてください:メモリ内オブジェクトは、それが何であるかです。 Doubleオブジェクトを作成すると、数値に似たDoubleオブジェクトになります。参照を保持する変数スーパータイプを使用していることを

事実は全くを基準オブジェクトには影響しません!

あなたの例では、自動ボクシングは、カバーの下にDoubleオブジェクトを作成し、は、Doubleオブジェクトへの参照を返します。

これがすべてです。

0

さて、ここでは、例を挙げてみましょう。あなたは、大きな正方形のボックス、オブジェクトと別の小さなボックスを持っています。この小さな箱を大きな箱の中に入れておくと、小さな箱と大きな箱のすべての特性が大きな箱に入っています。 小さな箱の中には、2本の棒があります。最初の棒を「A」、2番目を「2.2」としています。 大きな箱は、小さな箱の中身を見ることができます。その瞬間のために、小さな箱には2本の棒があり、それはそのままの形になっています。 (Objectクラスは常にjavaのすべてのクラスのスーパークラス/親であることを思い出してください)。

+0

大丈夫です。プロパティが同じでない限り、ビッグボックスは小さなボックス内に実装されているものを見ることができません。私の場合、小さなボックス(doubleとstring)のtoString()実装が必要です。 – Ritesh

0

あなたは、単にこのコードをテストする場合:

public class Main { 

    public Object first; 
    public Object second; 


    public static void main (String[] args){ 
     Main a = new Main(); 
     a.first = new String("foo"); 
     a.second = 5; 

     System.out.println(a.first.getClass().toString()); 
    } 
} 

それはclass java.lang.Stringを出力します。 Objectとして保存されていないことがわかります。これは、メタデータの使用によって実現されます。

関連する問題