Java四种内部类

成员
成员内部类
静态内部类
局部
方法内部类
匿名内部类

依赖外部类对象的:成员内部类,方法内部类,匿名内部类
静态内部类不依赖外部类的对象,所以,我们在项目中优先考虑选择静态内部类
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.
*/

  

posted @ 2019-07-20 21:28  三只坚果  阅读(991)  评论(0编辑  收藏  举报