Java・減エントロピー成長(第3編)

8894 ワード

Summary
Javaはオブジェクト向けの言語であり、Javaを適用するにはJavaにおけるクラスの定義、継承、アクセス制御、修飾子、インタフェースなどのオブジェクト向けの内容を深く理解し、把握しなければならない.
  • クラスの構成、初期化、および呼び出し
  • クラスの継承
  • パック
  • 修飾子
  • インタフェース
  • クラスの構成、初期化、呼び出し
    オブジェクト向け言語といえば,直接思いつくのはクラスの概念であり,クラスはオブジェクトを抽象化してオブジェクトの想像を形成し,クラスはオブジェクトの状態と方法をカプセル化している.クラスにはfieldとmethodが含まれます.field中国語はフィールド、ドメイン、ドメイン変数、属性、メンバー変数などと呼ばれ、クラスの属性であり、変数によって表される.methodは中国語で方法と呼ばれ、クラスの機能と操作であり、関数で表される.
    類は現実の物品の1つの分類のようで、例えば靴、服、それは私達にもっと効率的な疎通をさせることができて、現実生活の対話の中でだけではなくて、プログラミングのコードの間で.私たちの現実生活での会話は「あちらの赤い足を履いて歩くためのものを持ってきてください」(あちらの赤い靴を取ってください)と想像しにくいので、プログラムを書くには良い概念を使います.
    クラスはインスタンス化できます.つまり、特定のオブジェクトを作成します.この場合、初期化(通常はキーワードnew)が必要です.Javaは構築方法constructorによって完了します.コンストラクションメソッドとクラス名は同じ名前で、戻り値は書かれません.
    class Person{
      String name;
      int age;
      Person(String name, int age){
        this.name = name;
        this.age = age;
      }
    }
    

    クラスにライトコンストラクションメソッドがない場合、システムはデフォルトコンストラクションメソッド(default constructor)を生成します.
    class Person{
      String name;
      int age;
      //Person(){},             ,      。
    }
    

    オブジェクトを初期化して使用し、Personクラスにオブジェクトpを新規作成し、以下のようにpの名前を出力します.
    Person p = new Person();
    System.out.println(p.name);
    

    拡張:1.複数のメソッドに同じ名前がある場合、コンパイル時にメソッドの署名signature(パラメータタイプと個数)に基づいて識別できます.すなわち、Javaはoverloadingを再ロードする方法があり、オブジェクト言語向けのマルチステートpolymorphismを体現しています.次のプログラムsayHelloには2つの方法があります.実行結果は:Hello!My name is Xiaoming Hello Xiaohong! My name is Xiaoming
    public class Example{
      public static void main(String[] argv){
        Person p1 = new Person("Xiaoming", 18);
        Person p2 = new Person("Xiaohong", 14);
        p1.sayHello();
        p1.sayHello(p2);
      }
    }
    class Person{
      String name;
      int age;
      Person(String name, int age){
        this.name = name;
        this.age = age;
      }
      void sayHello(){
        System.out.println("Hello! My name is " + name);
      }
      void sayHello(Person another){
        System.out.println("Hello " + another.name + "! My name is " + name);
      }
    }
    

    2.上記のプログラムの構築方法にキーワードthisが現れ、フィールドfieldを参照し、フィールドとローカル変数を区別するために追加する役割を果たす.たとえば、最初のプログラム構築関数には、this.name=nameというコードがあります.this.nameはPersonのフィールドnameを表し、等号の後ろのnameは構築方法のパラメータ変数nameである.
    クラスの継承
    オブジェクト向けの3つのコアフィーチャーは、パッケージング、マルチステート、継承です.前のセクションでは、パッケージングとマルチステートについて説明しました.このセクションでは、継承について説明します.継承といえば、少なくとも2つのオブジェクトに関連し、サブクラスsubclassと親クラスsuperclassと呼ばれます.Javaでは継承のみが規定されており、1つのクラスには直接的な親しかいません.継承はDRY(Don't repeat yourself)の原則に合致し、子クラスに親クラスと一致するフィールドまたはメソッドがある場合は、重複するコードを書かないで直接継承します.Javaの継承はキーワードextendsによって実現され,上記Personのコードに沿って以下のようになる.
    class Student extends Person{
      String teacher;
      int grades;
      Student(String teacher, int grades, String name, int age){
        super(name, age);
        this.teacher = teacher;
        this.grades = grades;
      }
      boolean isGood(){return grades > 80;}
    }
    

    subclassはsuperclassのすべてのフィールドと非privateメソッドを継承できますが、superclassの構築メソッドは継承できません.JDK 1.5以降は@Overrideタグでsubclass対superclass同名メソッドのオーバーライドoverrideを表すことができます.上記のプログラムの構築方法にはキーワードsuperが現れ,親クラスのフィールドと方法を参照する役割を果たす.
    継承は対象言語の中で混乱しやすい部分であり,特に多重継承の場合,AがB,BがCに継承され,CがAに継承されると仮定すると死のループである.Javaシングル継承の規定は、セキュリティをある程度強化しています.
    パッケージ
    パッケージパッケージパッケージの登場は、名前空間と名前の衝突を解決するためであり、一方のパンは名前空間とストレージパスであり、一方では同じパッケージのデフォルトで相互にアクセスできるなどのアクセス性も規定されている.注意:パケットは継承とは関係ありません.superclassはpublicであれば、サブクラスは異なるpackageでsuperclassを継承できます.import文はパッケージをインポートできます.基本構文は、import package 1[.package 2...].classnameです.例:import java.util.Date;
    パッケージはOS内のフォルダとして理解できます.
    修飾子
    修飾子modifierには、アクセス修飾子access modifierとその他の修飾子の2種類があります.modiferはクラスとクラスのメンバー(fieldとmethod)を修飾することができる.
    1.アクセス修飾子
    ||同一クラス中|同一クラス中|同一パッケージ中(サブクラスを含む)|異なるパッケージ中子クラス|異なるパッケージ中非サブクラス|異なるパッケージ中非サブクラス|:::::::-------::::::::::::::::||private|Yes|||||デフォルト(パッケージアクセス可能)|Yes|Yes|Yes|Yes|||protected|Yes|Yes|Yes|Yes|Yes|Yes|Yes|Yes|public|Yes|Yes|Yes|Yes|Yes|Yes
    privateは同じクラスでしかアクセスできず、情報をよりよくカプセル化して隠すことができ、アクセス時にsetとgetメソッドを使用することができます.
    public class Person2{
      private int age;
      public void setAge(int age){
        if(age>0 && age <150){
          this.age = age;
        }
      }
      public int getAge(){
        return age;
      }
    }
    

    デフォルトはclassの前に修飾子を付けず、同じパケットとクラスにアクセスできることをデフォルトとします.protectedは、異なるパケット内の非サブクラスアクセスを許可しないだけです.publicの役割は、どのパケットでも呼び出すことができます.
    著者語:アクセス権限は厳格から緩和までの一般的な流れであり、最も厳格で同じクラスでしかアクセスできないprivateから始まり、同じパケットでアクセスできるデフォルトの修飾、さらに異なるパケットのサブクラスで呼び出せるprotected修飾、最後にどのパケットでも呼び出せるpublic修飾まで緩和される.
    2.その他の修飾子
    基本的な意味
    修飾クラス
    修飾メンバー
    修飾ローカル変数
    static
    スタティック、非インスタンス、クラス
    内部クラスを修飾可能
    Yes
    final
    変えられない
    Yes
    Yes
    Yes
    abstract
    抽象的、非インスタンス的
    Yes
    Yes
    staticフィールドはクラスにのみ属し、オブジェクトインスタンスには属しません.たとえば、Personクラスを定義し、統計人数のパラメータを定義し、オブジェクトインスタンスには属しません.
    class Person{
      static int totalNumber;
      String name;
      int age;
      Person(String n, int a){
        name = n;
        age = a;
      }
    }
    

    staticメソッドはクラス全体に属するメソッドであり、あるインスタンスに属さず、あるインスタンスを処理するメンバー変数を操作できない;final修飾のクラスは継承できない、すなわちサブクラスが存在できない、final修飾のメソッドはクラスに上書きできないメソッドであり、final修飾のフィールドは読み取り専用で修正できない;abstract修飾のクラスはインスタンス化できない、abstract修飾のメソッドはすべてのサブクラスに統合インタフェースを定義する抽象メソッド.宣言するだけで、フォーマットは次のとおりです.
    abstarct returnType abstractMethod([paramlist]);
    

    インタフェース
    インタフェースinterfaceはある特徴の約束であり、オブジェクト向けプログラミング思想の核心構成部分でもある.
    例えば、我々は現実の飛行機を一つの種類に書き、その中の戦闘機、輸送機はすべて飛行機という種類のサブクラスであり、独自の特徴を持っている.戦闘機の中で、殲撃機10は殲撃機9の新世代であり、我々は殲撃機10が殲撃機9を継承したと言っている.殲撃機9の動力システムの基礎の上で、殲撃機10は応急状況のもう一つの加速システムを開発した.2つの動力システムの方法があり、1つは殲撃機9を継承することであり、もう1つは応急時に新たに増加した動力システムである.この2つは多態の応用である.飛行機のほか、空には鳥がいる.鳥と飛行機の2つの種類はいずれも特徴を書く--それらは地上XXメートルを離れることができ、自主制御能力がある......DRYの原則に基づいて、ここは最適化が必要であり、インターフェースは非常に優れているこの問題を解決するには、特徴的な「飛ぶ」インタフェースを書くことができ、飛行機や鳥、その他の飛ぶことができる物体がこのインタフェースを使用することができます.
    インタフェースの定義によると、modifierのデフォルトはpublic+abstarctであり、インタフェースの出現は他のクラスに使用させるため、デフォルトはpublicである.インタフェース自体は特徴的な約束であり、インスタンス化されていないため、デフォルトはabstractである.また、インタフェースは多く継承することができ、クラスの継承とは異なり、オブジェクト向けのプログラミングは実質的に「インタフェース向けの変更」は、オブジェクト向け言語におけるインタフェースの重要性を示します.
    Javaはクラスが単一継承であることを規定しているが、インタフェースはある程度この制限を破ることができ、インタフェースはクラス間の階層に注目せず、ある特徴的なメソッド関数を直接使用することができる.
    インタフェースの定義は、一般的に次のとおりです.
    [public] interface InterfaceName [extends listOfSuperInterface]{
      returnType methodName([paramlist]);
    }
    

    定義にpublic宣言がない場合、同じパッケージ内のクラスのみがアクセスできます.extends継承部分はクラスの継承構文と一致しています.インタフェースは多重継承でき、カンマで区切られています.インタフェースではメソッドの宣言のみが行われ、具体的な実装は提供されません.メソッドのみが使用されます.最後に、ここでの方法はpublicとabstract属性を有する.インタフェースの実装はimplements句である.
    class className implements interfaceName{
      returnType methodName([paramlist]){
        //            
      }
    }
    

    インタフェースで定義される定数には、public、static、finalのプロパティ、一般的な大文字の名前があります.
    type NAME = value;
    

    次のコードはインタフェースで人を定義します.
    interface Runner(){public void run();}
    interface Swimmer(){public void swim();}
    interface Flyable(){
      abstract public void fly();
      public void land();
      public void takeoff();
    }
    abstract class Animal{
      int age;
      abstract public void eat();
    }
    class Person extends Animal implements Runner, Swimmer, Flyable{
      public void run(){System.out.println("run");}
      public void swim(){System.out.println("swim");}
      public void fly(){System.out.println("fly");}
      public void land(){System.out.println("land");}
      public void takeoff(){System.out.println("takeoff");}
      public void eat(){System.out.println("eat");}
    }
    public class Test{
      public static void main(String[] args){
        Test t = new Test();
        Person p =  new Person();
        t.m1(p);
        t.m2(p);
        t.m3(p);
        t.m4(p);
      }
      public void m1(Runner r){r.run();}
      public void m2(Swimmer s){s.swim();}
      public void m3(Flyable f){f.fly(); f.land(); f.takeoff();}
      public void m4(Animal a){a.eat();}
    }
    

    To be continued
    Javaの完全なソースファイルフォーマットは次のとおりです.
    package packageName//           ,0/1 
    import packageName.[className]; //      ,0/  
    public class classDefinition //   public    ,0/1 ,          
    {
      [public] interface InterfaceName [extends listOfSuperInterface]//     
      {
        type constantName = value; //      ,   public, static, final 
        returnType methodName([paramlist]); //      ,     
      }
      [public] [abstract|final] class className [extends superClassName] [implements InterfaceNameList] //    
      {
        [public|protected|private] [static] [final] type variableName; //      
        [public|protected|private] [static] [final] returnType methodName([paramlist]) [throws exceptionlist] //       
        {
          statement;
        }
      }
    }
    

    3つの方法で、固定的な宣言が必要です.
  • 構造方法
  • className([paramlist]){
      statements;
    }
    
  • mainメソッド
  • public static void main(String[] args){
      statements;
    }
    
  • finalizeメソッド
  • protected void finalize() throw throwable{
      statements;
    }