内部类分为四种:this
调用方法: new 外部类().new 内部类()
code
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(); } }
调用方法: new 外部类.静态内部类();
对象
由于没有一个外部类的实例,因此在静态内部类里面不能够访问外部类的实例属性和方法
除了能够访问外部类的私有静态成员外,静态内部类和普通类没什么大的区别。it
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循环里等等地方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(); } }