成员
成员内部类
静态内部类
局部
方法内部类
匿名内部类
依赖外部类对象的:成员内部类,方法内部类,匿名内部类
静态内部类不依赖外部类的对象,所以,我们在项目中优先考虑选择静态内部类
package QianFeng02; //内部类 public class InnerTest { public static void main(String[] args){ //在外部创建成员内部类实例, Outer outer=new Outer(); // 因为成员内部类需要依赖外部类的对象,不建议这样创建 // Outer.Inner2 inner2=outer.new Inner2(); // inner2.print(); outer.innerPrint();//通过innerPrint访问内部类 outer.show();//方法内部类 Outer.Inner3 inner3=new Outer.Inner3(); //静态类直接:类名.内部静态类名 inner3.print(); outer.print11();//(1.继承式) outer.print2();//(2.匿名类的 接口式) outer.print3(new Eat(){//(匿名内部类 3.参数式) public void eat() { System.out.println("匿名内部类 3.参数式"); } });//(3.参数式匿名类) } } class Outer{ private String name="除了静态内部类,内部类成可以很方便使用成员变量"; //----------------1.成员内部类---------------- public void innerPrint(){//建议在外部类中定义一个方法,对外提供访问内部类接口 Inner2 inner2=new Inner2(); inner2.print(); } //内部类(封装性) class Inner2{//1.成员内部类 private void print(){ System.out.println("{成员内部类}"+name); } } // ----------------2.方法内部类---- ---------- public void show(){ final int x=10; //方法内部类的引用的变量 必须是常量(final),不写声明默认final class Inner2{ public void print(){ System.out.println("{方法内部类}"+x+name);//为什么用final呢? } } Inner2 inner2=new Inner2();//调用方法内部类(在方法里面调用实例化)不能在方法外实例化 inner2.print(); } //----------------3.静态内部类---------------- /* 在一个类内部定义一个静态内部类: 静态的含义是该内部类可以像其它静态成员一样,没有外部类对象时,可以直接访问 静态嵌套仅能访问外部类的静态成员和方法 */ static class Inner3{ public void print(){ System.out.println("静态内部类"); } } //----------------4.匿名内部类---------------- /*1.不能有构造方法 2.不能定义任何静态成员,方法 3.不能是public.protected,private,static 4.一定是在new的后面,用其隐含一个接口或者实现一个类 5.匿名内部类为局部的,所以局部内部类的所有限制都对其生效 * */ //(1.继承式) public void print11(){ CatGame cat=new CatGame(){ public void game(){ System.out.println("猫玩"); } }; cat.game(); } //*(2.接口式) public void print2(){ Eat e=new Eat(){ @Override public void eat() { System.out.println("匿名类的 接口式"); } }; e.eat(); } //(3.参数式) public void print3(Eat eat){//传入接口 eat.eat(); } } interface Eat{ public void eat(); } abstract class CatGame{ public abstract void game(); } /* 方法内部类的引用的变量 必须是常量(final) 为什么用final呢? final 修饰变量是 常量,会把变量进入到常量池,延长生命周期,以免被销毁 jdk1.8 可以不写final ,系统会默认 final. */