いくつかの基礎的なJava問題についての解答(四)


前の文章の転送ドア:いくつかの基礎のJava問題についての解答(3)
16.Javaオブジェクト向けの3つの特徴と意味
JAvaのオブジェクト向けの3つの基本的な特徴は、パッケージ、継承、マルチステートです.
  • パッケージ:プロセスとデータを包囲し、データへのアクセスは定義されたインタフェースしか通過できず、主に便利なクラスの修正
  • である.
  • 継承:オブジェクトの新しいクラスは、既存のクラスから派生することができ、このプロセスをクラス継承と呼ぶ.通常、継承は共通性を親に、プロパティを子に配置します.継承性はソフトウェアの再利用性の問題をよく解決した
  • マルチステート:異なるクラスのオブジェクトが同じメッセージに応答することを許可し、マルチステート言語は柔軟、抽象、動作共有、コード共有の優位性を持ち、アプリケーション関数の同名問題
  • をよく解決した.
    17.OverrideとOverloadの意味と違い
    Overrideは書き換え、上書きとも呼ばれます.つまり、子クラスに親非privateメソッドと同じメソッド(戻り値、パラメータ、メソッド名が同じで、Java SE 5にコヒーレントタイプが導入され、コヒーレントタイプが上書きを許可するメソッドの戻り値が元の戻り値の子クラスタイプ)があり、子メソッドのアクセス修飾権限が親クラスより少なくてはなりません.サブクラスに対してメソッドを呼び出すと、親メソッドの代わりにサブクラスメソッドが呼び出されます.
    Overloadは、同じクラスに複数のメソッド名が同じで、パラメータが異なる(パラメータタイプまたは個数)、戻り値が同じで異なるメソッドを持つことを意味します.メソッドを呼び出すと、入力パラメータに基づいて適切なメソッドが選択されます.
    両者の違い:
  • Overrideはサブクラスと親メソッドの関係を記述し、Overloadは同じクラスのメソッドの関係
  • を記述する.
  • Overrideのメソッドは完全に同じでなければなりません.権限は親クラスより少なくありません.Overloadメソッド名は同じでなければなりません.パラメータは異なる必要があります.戻り値は
  • と異なることができます.
    18.Interfaceとabstractクラスの違い
    Interfaceはインタフェースであり、インタフェースには変数があるが、インタフェースの変数はpublic static finalのコンパイル期間定数であり、インタフェースの方法はpublic abstractの公開抽象方法であり、1つのクラスは複数のインタフェースを実現することができる.
    abstractクラスは抽象クラスであり、抽象クラスにはキーワードabstract修飾があり、抽象クラスはインスタンス化できず継承されるしかない.抽象クラスには一般的に抽象メソッド(publicまたはprotectedでprivateは継承できません)が含まれており、その他の点では一般クラスとあまり違いません.
    両者の違い:
  • インタフェースの変数はpublic static finalのコンパイル期間定数であり、抽象クラスの変数は
  • に制限されない.
  • インタフェースのメソッドはpublic abstractの公開抽象メソッドであり、抽象クラスの抽象メソッドはprivateでなく、一般的なメソッド
  • を許可する.
  • 1 1つのクラスは複数のインタフェースを実現することができ、1つのクラスは最大1つの抽象クラス
  • しか継承できない.
    19.Static classとnon static classの違い
    まず、トップクラス(top level class)は静的ではないため、ここでは内部クラス(nested class)について説明する.
    静的内部クラスと非静的内部クラスの違いは主に以下の点である.
  • 静的内部クラスは外部クラスへの参照を持つ必要はないが、非静的内部クラスは外部クラスへの参照
  • を持つ必要がある.
  • 静的内部クラスは外部クラスの非静的メンバーにアクセスすることができず、外部クラスの静的メンバーにアクセスすることしかできず、静的内部クラスではなく外部クラスのすべてのメンバー
  • にアクセスすることができる.
  • 静的内部クラスは、非静的内部クラスの作成方法とは異なり、1つの非静的内部クラスが外部クラスエンティティから離れることなく作成される
  • .
    静的内部クラスと非静的内部クラスのコードを作成します.
    public class Test {
    	public static void main(String[] args) {
    		//        
    		Test.staticClass class1 = new Test.staticClass();
    		//         
    		//      !
    //		Test.noStaticClass class2 = new Test.noStaticClass();
    		//             
    		Test.noStaticClass class2 = new Test().new noStaticClass();
    	}
    	
    	static class staticClass {};
    	class noStaticClass {};
    }
    

    20.javaマルチステートの実現原理
    動的バインディング、後期バインディング、または実行時バインディングとも呼ばれ、異なるクラスのオブジェクトが同じメッセージに応答することを許可することを意味します.次に、バインドに関する概念を説明します.
  • バインディング:メソッド呼び出しをメソッドボディに関連付けるプロセス
  • を指す.
  • 前期バインド:プログラム実行前にバインドする(一般的にコンパイラと接続プログラムによって実現され、C++デフォルトで前期バインドされる)
  • ポストバインディング:動的バインディングまたはランタイムバインディングとも呼ばれ、プログラムの実行時にオブジェクトのタイプを識別することによって適切なメソッドを呼び出す(Javaはstaticメソッドとfinalメソッドを除き、その他はポストバインディングである.C++はvirtualキーワードによって虚関数を実現し、ポストバインディングを実現する)
  • Javaコードを見てみましょう.
    public class Test {
    	static class A {
    		public void sayHi() {
    			System.out.println("Hi, I am A");
    		}
    	}
    	
    	static class B extends A {
    		@Override
    		public void sayHi() {
    			System.out.println("Hi, I am B");
    		}
    	}
    	
    	static class C extends A {
    		@Override
    		public void sayHi() {
    			System.out.println("Hi, I am C");
    		}
    	}
    	
    	public static void saySomething(A a) {
    		a.sayHi();
    	}
    	
    	public static void main(String[] args) {
    		saySomething(new A());
    		saySomething(new B());
    		saySomething(new C());
    	}
    	
    }
    

    23行目の方法を見ると、コンパイラから与えられた情報はaがAクラスの参照であることしか知られていないが、aがAクラスのインスタンスであるか、またはそのサブクラス(BまたはC)のインスタンスであるかを特定することはできない(エクスポートクラスはアップグレードによって、自身の参照をそのベースクラスの参照と見なすことができる)ため、前期バインドによってマルチステートを実現することはできない.しかし、ポストバインディングを使用する場合は、プログラムの実行時に受信インスタンスの特定のタイプを決定し、その特定のタイプに基づいて対応するメソッドを呼び出すことで、マルチステートを実現できます.