Javaインタフェースと継承ノート

7604 ワード


1.Objectクラスはすべてのクラスの親です.クラスを宣言する場合、デフォルトではObjectが継承されます.
2.ObjectクラスはtoStringメソッドを提供しているので、すべてのクラスにtoStringメソッドがあります.
  • toString()は、現在のオブジェクトの文字列表現を返すことを意味します.
  • はSystemを通過する.out.println印刷オブジェクトは、そのオブジェクトを印刷するtoString()戻り値
  • である.
    3. finalize() 
  • オブジェクトに参照がない場合、ゴミ回収の条件を満たす.
  • ゴミ回収されるとfinalize()メソッドが呼び出されます.
  • finalize()は、開発者がアクティブに呼び出す方法ではなく、仮想マシンJVMによって呼び出されます.

  • 4. equals() 
    equals()は、2つのオブジェクトの内容が同じかどうかを判断するために使用されます.
    2人の英雄のhpが同じとき、私たちはこの2人の英雄が同じだと思っています.
    public class Hero {
        public String name;
        protected float hp;
          
        public boolean equals(Object o){
            if(o instanceof Hero){
                Hero h = (Hero) o;
                return this.hp == h.hp;
            }
            return false;
        }
          
        public static void main(String[] args) {
            Hero h1= new Hero();
            h1.hp = 300;
            Hero h2= new Hero();
            h2.hp = 400;
            Hero h3= new Hero();
            h3.hp = 300;
             
            System.out.println(h1.equals(h2)); //false
            System.out.println(h1.equals(h3)); //true
        }
    }

    5.==とhashCode()
    これはObjectのメソッドではありませんが、2つのオブジェクトが同じかどうかを判断するために使用されます.
    より正確には、2つの参照が同じオブジェクトを指しているかどうかを判断するために使用されます.
    hashCodeメソッドは、オブジェクトのハッシュ値を返します.デフォルトでは、ObjectクラスのhashCore()メソッドは、そのオブジェクトのアドレスに基づいて計算されます.
    しかし、多くのクラスはObjectクラスのhashCode()メソッドを書き換え、アドレスに基づいてhashCode()メソッド値を計算しない.
    public class Hero {
        public String name;
        protected float hp;
          
        public boolean equals(Object o){
            if(o instanceof Hero){
                Hero h = (Hero) o;
                return this.hp == h.hp;
            }
            return false;
        }
          
        public static void main(String[] args) {
            Hero h1= new Hero();
            h1.hp = 300;
            Hero h2= new Hero();
            h2.hp = 400;
            Hero h3= new Hero();
            h3.hp = 300;
            Hero h4 = h1;
             
            System.out.println(h1==h2); //false
            System.out.println(h1==h3); //false
            System.out.println(h1==h4); //true
            System.out.println("h1.hashCode:"+h1.hashCode()); //h1.hashCode:2018699554
            System.out.println("h2.hashCode:"+h2.hashCode()); //h2.hashCode:1311053135
            System.out.println("h3.hashCode:"+h3.hashCode()); //h3.hashCode:118352462
            System.out.println("h4.hashCode:"+h4.hashCode()); //h4.hashCode:2018699554
    
        }
    }

    final
    final修飾クラス、メソッド、基本タイプ変数、引用時にそれぞれ異なる意味があります.
    1.final修飾クラス
    Heroがfinalに修飾されると、Heroが継承できないことを示す.
    2.final修飾方法
    HeroのuseItemメソッドがfinalに修飾されるとgiantメソッドはADHeroでは書き換えられない.
    3.final修飾基本変数
    finalは基本変数を修飾し、この変数が1回の付与機会しかないことを示す.
    4.final修飾参照
    この参照がオブジェクトを指す機会が1回しかないことを示します.
    抽象クラス
    クラスにメソッドを宣言します.このメソッドは実装体ではなく、「空」メソッドです.
    このような方法を抽象的な方法と呼び,修飾子「abstract」を用いる.
    クラスに抽象メソッドがある場合は、クラスを抽象クラスとして宣言する必要があります.
    1.抽象クラス
    Heroに抽象メソッドattackを追加し,Heroをabstractと宣言した.
    APHero,ADHero,ADAPHeroはHeroのサブクラスであり,Heroの属性と方法を継承している.
    しかし、それぞれの合計手段は異なり、Heroクラスを継承すると、これらのサブクラスは異なるattackメソッドを提供して実現しなければならない.
    2.抽象クラスは抽象的な方法がなくてもよい
    Heroクラスは抽象メソッドを提供しない前提で抽象クラスとして宣言することができる.
    クラスが抽象クラスとして宣言されると、直接インスタンス化することはできません.
    package charactor;
       
    public abstract class Hero {
        String name;
              
        float hp;
              
        float armor;
              
        int moveSpeed;
           
        public static void main(String[] args) {
            //        ,            ,          
            Hero h= new Hero(); //error
        }
              
    }

    3.抽象クラスとインタフェースの違い
    区別1:
  • サブクラスは1つの抽象クラスしか継承できず、複数の
  • を継承できない.
  • サブクラスは、複数のインタフェース
  • を実装することができる.
    違い2:
  • 抽象クラスは、public、protected、package、privateを定義することができる.静的属性と非静的属性;finalプロパティと非finalプロパティ.
  • インタフェースで宣言されるプロパティは、public、静的、finalのみです.

  • 内部クラス
    内部クラスは4つに分けられます.
  • 非静的内部クラス
  • 静的内部クラス
  • 匿名クラス
  • ローカルクラス
  • 1.非静的内部クラス
    非静的内部類BattleScore「戦闘成績」
    非静的内部クラスは、1つのクラスで直接定義できます.例:
  • 戦闘成績は1人の英雄が存在する時だけ意味がある
  • だからBattleScoreを実例化するときは、存在する英雄に基づいて
  • を構築しなければならない.
  • 文法:new外部クラス()New内部クラス()
  • は、Heroの非静的内部クラスとして、外部クラスのprivateインスタンス属性nameに直接アクセス可能な
  • である.
    public class Hero {
        private String name; //   
        float hp; //   
        float armor; //   
        int moveSpeed; //     
     
        //       ,              ,    
        //                       
        class BattleScore {
            int kill;
            int die;
            int assit;
     
            public void legendary() {
                if (kill >= 8)
                    System.out.println(name + "  !");
                else
                    System.out.println(name + "    !");
            }
        }
     
        public static void main(String[] args) {
            Hero garen = new Hero();
            garen.name = "  ";
            //       
            // BattleScore                    
            //                        
            BattleScore score = garen.new BattleScore();
            score.kill = 9;
            score.legendary();
        }
     
    }

    2.静的内部クラス
    1つのクラスに静的内部クラスが宣言されます
  • 例えば敵の水晶、敵の水晶が血がない時、自分のすべての英雄はすべて勝利を獲得して、ある具体的な英雄だけが勝利を獲得するのではありません.
  • は非静的内部クラスとは異なり、静的内部クラス水晶クラスのインスタンス化には外部クラスのインスタンスを必要とせず、直接インスタンス化することができる.
  • 文法:new外部クラス.静的内部クラス()
  • 外部クラスのインスタンスが1つもないため、静的内部クラスでは外部クラスのインスタンス属性とメソッドにアクセスできません.
  • 外部クラスにアクセスできるプライベート静的メンバーを除き、静的内部クラスと通常クラスには大きな違いはありません.
  • public class Hero {
        public String name;
        protected float hp;
      
        private static void battleWin(){
            System.out.println("battle win");
        }
        
        //     
        static class EnemyCrystal{
            int hp=5000;
            //        0,     
            public void checkIfVictory(){
                if(hp==0){
                    Hero.battleWin();
                     
                    //                   
                    System.out.println(name + " win this game"); //error
                }
            }
        }
         
        public static void main(String[] args) {
            //        
            Hero.EnemyCrystal crystal = new Hero.EnemyCrystal();
            crystal.checkIfVictory();
        }
    }

    3.匿名クラス
    匿名クラスとは、クラスを宣言しながらインスタンス化し、コードをより簡潔に精製することです.
  • 通常、インタフェースまたは抽象クラスを使用するには、サブクラスを作成する必要があります.
  • では、迅速に使用するために抽象クラスを直接インスタンス化し、その抽象メソッドをその場で実装する場合があります.
  • 抽象的な方法が実現された以上、新しいクラスであり、このクラスだけであり、名前は付けられていない.

  • このようなクラスを匿名クラスと呼ぶ.
    public abstract class Hero {
    	String name; //  
    	float hp; //  
    	float armor; //  
    	int moveSpeed; //    
    	
    	public abstract void attack();
    	
    	public static void main(String[] args) {
    		ADHero adh = new ADHero();
    		//    adh,    adh       ADHero 
    		adh.attack();
    		System.out.println(adh);
    		
    		Hero h = new Hero() {
    			//    attack  
    			public void attack() {
    				System.out.println("      ");
    			}
    		};
    		h.attack();
    		//    h,    h      Hero$1             
    		System.out.println(h);
    	}
    }

    4.ローカルクラス
  • ローカルクラスは名前付き匿名クラス
  • と理解できる.
  • 内部クラスが匿名クラスと異なるのは、内部クラスがメンバーの位置、すなわち属性およびメソッドと平等な位置に宣言しなければならないことである.
  • ローカルクラスは匿名クラスと同様に、コードブロックに直接宣言され、メインメソッド、forループなどの場所であってもよい.
  • public abstract class Hero {
        String name; //    
        float hp; //    
        float armor; //     
        int moveSpeed; //    
          
        public abstract void attack();
          
        public static void main(String[] args) {
              
            //         ,           
            class SomeHero extends Hero{
                public void attack() {
                    System.out.println( name+ "       ");
                }
            }
             
            SomeHero h  =new SomeHero();
            h.name ="   ";
            h.attack();
        }   
    }