Java中内部类

1 非静态内部类

1.1 定义

非静态内部类可以直接在一个类里面定义,只有在外部对象存在时才有意义

1.2 语法

new 外部类().new 内部类()

2 静态内部类

2.1 定义

静态内部类的实例化 不需要一个外部类的实例为基础,可以直接实例化

2.2 语法

new 外部类.静态内部类();

2.3 使用注意

1 因为没有一个外部类的实例,所以在静态内部类里面不可以访问外部类的实例属性和方法

2 除了可以访问外部类的私有静态成员外,静态内部类和普通类没什么大的区别

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

}

3 匿名类

1 定义

声明一个类的同时实例化它

2 使用说明

通常情况下,要使用一个接口或者抽象类,都必须创建一个子类

有的时候,为了快速使用,直接实例化一个抽象类,并“当场”实现其抽象方法。
既然实现了抽象方法,那么就是一个新的类,只是这个类,没有命名。
这样的类,叫做匿名类

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

}

上面h只是作为引用!匿名类是类名藏匿,不是引用藏匿,不然怎么使用呢

4 本地类

本地类可以理解为有名字的匿名类
内部类与匿名类不一样的是,内部类必须声明在成员的位置,即与属性和方法平等的位置。
本地类和匿名类一样,直接声明在代码块里面,可以是主方法,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

你可能感兴趣的:(Java,java,开发语言)