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