JAVA-インターフェースと継承(10)内部クラス


内部クラスには、非静的内部クラス、
静的内部クラス、
匿名クラス、
ローカルクラスの4つのタイプがあります。

非静的内部クラス

非静的内部クラスBattleScore「バトルスコア」
非静的内部クラスは、クラスで直接定義できます。

たとえば、
バトルスコアは、ヒーローオブジェクトが存在する場合にのみ意味があります。
したがってBattleScoreをインスタンス化するときは、既存のヒーローに基づいている必要があります。
構文:新しい外部クラス()。新しい内部クラス()
非静的ヒーローとして内部クラスは、外部クラスのプライベートインスタンス属性名に直接アクセスできます

package 学习;


public class test {
    
    
	String name;
	public test(String name) {
    
    
		this.name = name;
	}
	
	class Battlescore{
    
    
		int kill;
		int die;
		int assit;
		public void legendary() {
    
    
			if(kill>7)
			System.out.println(name + "超神了");
			else
				System.out.println("还没有超神呢");
		}
	}
	
	public static void main(String args[]) {
    
    
		test a = new test("诺克萨斯之手");
		Battlescore b = a.new Battlescore();
		b.kill = 9;
		b.legendary();
	}
}

静的内部クラス

構文:新しい外部クラス。静的内部クラス();

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();
    }
  
}

匿名クラスとは、クラスを宣言しながらインスタンス化して、コードをより簡潔かつ簡潔にすることを指します
通常、インターフェイスまたは抽象クラスを使用するには、サブクラスを作成する必要があります。

場合によっては、すばやく使用するために、抽象クラスが直接インスタンス化され、その抽象メソッドが「その場で」実装されます。
抽象メソッドが実装されたので、それは新しいクラスですが、このクラスには名前が付けられていません。
このようなクラスは匿名クラスと呼ばれます

public abstract class test {
    
    
	String name;
	public abstract void utter();
	public static void main(String args[]) {
    
    
		test a = new test() {
    
    
			public void utter() {
    
    
				System.out.println("当场实现一个方法");
			}
		};
		a.utter();
	}
}

ローカルクラス

ローカルクラスは、名前付きの匿名クラスとして理解できます
。内部クラスと匿名クラスの違いは、内部クラスはメンバーの位置、つまり属性とメソッドに等しい位置で宣言する必要があることです。
ローカルクラスは匿名クラスと同じであり、コードブロックで直接宣言され、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として変更する必要があります

なぜ最終として宣言するのですか?そのメカニズムはより複雑です。2番目のヒーローコードの説明を参照してください。

注:jdk8では、finalに変更を強制する必要はありません。finalが書き込まれていない場合、コンパイラーが非表示のfinalを密かに追加したため、エラーは報告されません。

エクササイズ-内部クラス⭐⭐

public abstract class item {
    
    
	String name;
	int price;

	public abstract void disposiable();
	public static void main(String args[]) {
    
    
		item a = new item() {
    
    
			public void disposiable() {
    
    
				System.out.println("我叫做可以任意处理的");
			}
		};
		a.disposiable();
	}
}

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_17802895/article/details/108694428