3、継承とインタフェース

5541 ワード

  • 例1:次のどの説が正しいですか.
  • A.      ,      public       
    B.                          
    C.                       
    D.                、        
    

    答えはCです.同じアクセス可能領域で宣言されたいくつかの異なるパラメータ列(パラメータのタイプ、個数、順序が異なる)を持つ同名関数について、プログラムは異なるパラメータ列に基づいてどの関数を呼び出すかを決定し、このメカニズムは、リロードしても関数の戻り値に関心を持たない.オーバーライドとは、生クラスに再定義された関数を割り当てます.その関数名、パラメータ列、戻り値のタイプは、親クラスのオーバーライドに対応する関数と厳密に一致する必要があります.オーバーライド関数とオーバーライドされた関数は、関数体のみが異なり、派生クラスオブジェクトが子クラスの同名関数を呼び出すと、親クラスのオーバーライドされた関数バージョンではなく、子クラスのオーバーライドされた関数バージョンが自動的に呼び出されます.
  • リロードの特徴:(1)同じ範囲(同じクラスで)(2)関数名が同じ(3)パラメータが異なる
  • で上書きされたフィーチャー:(1)親クラスと子クラスにそれぞれ異なる範囲(2)関数名が同じ(3)パラメータが同じ
  • 例2:関数のリロードについて、以下の言い方が間違っているのは?
  • A.            
    B.                   
    C.            
    D.              
    

    答えはCです.リロードとは、既存の関数と同名であるがパラメータテーブルが異なる関数を記述することであり、関数のリロードは関数の戻り値とは無関係である.
  • 例3:次の言い方の中でどれが正しいですか.
  • A.                
    B.             
    C.          
    D.                     
    

    この問題はAを選びます.静的メソッドは上書きできません.
  • 例4:継承記述の誤りについては?
  • A.                  ,            
    B.                  ;                    
    C.        ,              
    D.      “    ”,             
    

    答え:この問題はDを選びます.継承とは、子クラスのオブジェクトが親クラスのオブジェクトにのみ有効なメソッドまたはプロパティを使用できることを意味し、これらのメソッドとプロパティが子クラスによって独自に定義されているようにします.継承構造では、親クラスの内部詳細が子クラスに表示されます.したがって,継承されたコード多重化は「ホワイトボックス多重化」である.
  • 例5:次のコード出力?
  • public class B extends A {
        public static void prt() {
            System.out.println("2");
        }
    
        public B() {
            System.out.println("B");
        }
    
        public static void main(String[] args) {
            A a = new B();
            a = new A();
        }
    }
    
    class A {
        public static void prt() {
            System.out.println("1");
        }
    
        public A() {
            System.out.println("A");
        }
    }
    

    説明:ここで注意しなければならないのは、静的メソッドを呼び出す必要があることです.一方、Bオブジェクトを構築する場合、BAを継承するので、まずAの構築方法を実行する必要がある.
  • 例6:次のコードの出力結果は?
  • class ClassA {
        public void printValue(){
            System.out.println("classA");
        }
    }
    class ClassB extends ClassA{
        public void printValue(){
            System.out.println("classB");
        }
    }
    public class Test{
        public static void main(String[] args) {
            ClassB objectB = new ClassB();
            objectB.printValue();//     objectB     ,     classB
            ClassA as = (ClassA) objectB;
            as.printValue();//  as    ClassB     ,      ClassB
            as = new ClassA();
            as.printValue();//    ClassA    ,  classA
        }
    }
    

    説明:関連する説明はコードに明記されています.
  • 例7:次のコード出力は?
  • public class Test{
        public static void main(String[] args) {
            Father father = new Father();
            Father child = new Child();
            System.out.println(father.getName());
            System.out.println(child.getName());
        }
    }
    
    class Father{
        public static String getName(){
            return "Father";
        }
    }
    class Child extends Father{
        public static String getName(){
            return "Child";
        }
    }
    

    答え:ここでFather Fatherを出力します.ここで、静的メソッドは上書きできないが、メモリ内のアドレス空間は固定されているが、ここでの2つの静的メソッドはメモリ内で異なる空間を占有している.具体的にどのクラスが呼び出されるかは、静的メソッドであり、2つの参照はfatherオブジェクトであるため、Father Fatherが出力される.
    例8:次のコードの実行結果?
    public class Tester{
        public static void main(String[] args) {
            go(new MyBase());
        }
        public static void go(Base b){
            b.add(8);
        }
    }
    
    class Base{
        int i ;
        Base(){
            add(1);
            System.out.println(i);
        }
        void add(int v){
            i += v;
            System.out.println(i);
        }
        void print(){
            System.out.println(i);
        }
    }
    
    class MyBase extends Base{
        public MyBase() {
            add(2);
        }
        void add(int v){
            i += v * 2;
            System.out.println(i);
        }
    }
    

    説明:まずオブジェクトMyBaseをインスタンス化し、このオブジェクトはBaseオブジェクトを継承するので、まず方法MyBase()を実行し、先に方法addを実行するが、この方法はMyBaseオブジェクトを新規作成する際に呼び出され、まずMyBaseクラスにこの方法があるかどうかを検索するので、まず2,2を印刷する.このとき親クラスのコンストラクション関数が実行され、子クラスのコンストラクション関数が実行され、i=6となる.その後addメソッドが実行されるので、出力22.
  • 例9:匿名内部クラス(Anonymous Inner Class)はextends他のクラスが可能かどうか、implements他のインタフェースが可能かどうか.答え:匿名の内部クラスは名前のない内部クラスであり、他のクラスを継承することはできませんが、1つの内部クラスは1つのインタフェースとして、別の内部クラスによって実現することができます.
  • 例10:抽象類について以下の言い方が間違っているのは?
  • A.                
    B.            ,        
    C.            
    D.               ,                  
    E.        
    

    説明:抽象クラスはいくつかの点に注意してください.
  • (1)抽象クラスは他のクラスの親としてのみ使用でき、インスタンス化できず、抽象クラスに対してnewオペレータは使用できません.抽象クラスが抽象的な変数または値を含む場合、それらはnullタイプであるか、または非抽象クラスのインスタンスへの参照を含む.
  • (2)抽象クラスは抽象メンバーを含むことを許可するが、これは必須ではない(抽象クラスに抽象メンバーがいないことを許可することができる).抽象クラスには非抽象的な方法があります.抽象クラスでは、すべての方法が実装されても、クラスの前にabstractを付けるだけで、抽象クラスです.
  • (3)抽象クラスは同時に閉鎖的ではない(final).抽象クラスは親として継承されるため、finalであれば継承されない.
  • (4)非抽象クラスが抽象クラスから派生した場合、継承されたすべての抽象メンバーを上書きする必要があります.同時に抽象的な方法を実現しなければならない.
  • (5)抽象クラスは抽象クラスに継承され、結果は依然として抽象クラスである.同時に非抽象クラス継承抽象クラスとは異なり,継承した抽象クラスの抽象メソッドを実現しなくてもよい.
  • (6)抽象クラスは宣言を許可する.
  • 例11:インタフェースの概念インタフェースには定数と抽象的な方法しかなく、定数は常にpublic static finalであり、書くも書かないもである.その方法はprivateではなく、public abstractでなければならず、書くか書かないかはpublic abstractであり、マルチ継承をサポートしている.