Java内部クラス再温


大学に行った时、プログラミングの授业でいつも先生が「疲れていない」と言っていたのを覚えています.私も「疲れていない」と思っています.私は授业でも疲れていません.後に本を読むのはもともと「内部類」という概念を言っていたが、今考えてみると本当に面白い.
一、内部クラスとは
Javaでは、あるクラスを別のクラスまたはメソッドに定義することができます.このようなクラスを内部クラスと呼びます.
内部クラスは4つに分けられます.
  • 非静的内部クラス
  • 静的内部クラス
  • 匿名クラス
  • ローカルクラス
  • 二、非静的内部クラス
    非静的内部クラスBattleScore「戦闘成績」非静的内部クラスは直接1つのクラスで定義できます
    例えば、戦闘成績は1人のヒーローが存在する場合にのみ意味があるのでBattleScoreを実例化する場合は、1人のヒーローに基づいて文法を確立しなければならない:new ().new () はHeroの非静的内部クラスとして、外部クラスのprivateインスタンス属性nameに直接アクセスできる
    package charactor;
     
    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();
        }
     
    }

    三、静的内部クラス
    1つのクラスの中で1つの静的な内部クラスを宣言して例えば敵の水晶、敵の水晶が血がない時、自分のすべての英雄はすべて勝利を得て、ある具体的な英雄だけが勝利を得たわけではありません.非静的内部クラスとは異なり、 水晶クラスのインスタンス化には外部クラスのインスタンスを1つ必要とせず、直接インスタンス化文法を用いることができる:new . (); 外部クラスのインスタンスが1つもないため、静的内部クラスでは外部クラスのインスタンス属性と方法にアクセスできない外部クラスの を除き、静的内部クラスと一般クラスには大きな違いはありません.
    package charactor;
      
    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");
                }
            }
        }
         
        public static void main(String[] args) {
            //        
            Hero.EnemyCrystal crystal = new Hero.EnemyCrystal();
            crystal.checkIfVictory();
        }
      
    }

    四、匿名内
    匿名クラスとは、 でコードをより簡潔にすることを意味します.通常、インタフェースまたは抽象クラスを使用するには、サブクラスを作成する必要があります.
    場合によっては,迅速に使用するために抽象クラスを直接インスタンス化し,「 」で抽象メソッドを実現する.抽象的な方法が実現された以上、新しいクラスであり、このクラスだけで、名前が付いていない.このようなクラスを匿名クラスと呼ぶ
    package charactor;
       
    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);
        }
          
    }

    五、ローカルクラス
    ローカルクラスは、名前のある匿名クラスの内部クラスと匿名クラスが異なると理解できます.内部クラスは、属性とメソッドと同等の位置でメンバーの位置を宣言する必要があります.ローカルクラスは匿名クラスと同様に、コードブロックに直接宣言され、メインメソッド、forループなどの場所で使用できます.
    package charactor;
       
    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();
        }
          
    }

    六、匿名クラスで外部のローカル変数を使用する
    匿名クラスで外部のローカル変数を使用するには、外部のローカル変数をfinalに修飾する必要があります.
    なぜfinalと宣言するのか、そのメカニズムが複雑なので、2番目のHeroコードの説明を参照してください.
    注:jdk 8では、finalに強制的に修飾する必要はありません.finalを書かなければ、間違いはありません.コンパイラがこっそり見えないfinalを加えてくれたからです.
    Hero.java
    package charactor;
       
    public abstract class Hero {
     
        public abstract void attack();
          
        public static void main(String[] args) {
     
            //              ,            final
            final int damage = 5;
             
            Hero h = new Hero(){
                public void attack() {
                    System.out.printf("      ,  %d   ",damage );
                }
            };
     
        }
          
    }

    Hero.java
    package charactor;
       
    public abstract class Hero {
     
        public abstract void attack();
          
        public static void main(String[] args) {
     
            //              damage      final
            int damage = 5;
             
            //       AnonymousHero             
             
            //       ,          damage  ,                
            // attack    damage,          damage,    damage
             
            //            final
            //   attack   damage  ,             damage  
             
            //           ,          damage 
            //          ,   damage     final,"   "      
            class AnonymousHero extends Hero{
                int damage;
                public AnonymousHero(int damage){
                    this.damage = damage;
                }
                public void attack() {
                    damage = 10;
                    System.out.printf("      ,  %d   ",this.damage );
                }
            }
             
            Hero h = new AnonymousHero(damage);
             
        }
          
    }

    関連記事:Java内部クラスの詳細 Java内部クラスHow 2 J.cnチュートリアル