java基础——————内部类 静态内部类、成员内部类、匿名内部类

内部类包括四种类型:静态内部类,实例(成员)内部类,匿名内部类,本地内部类(不多用)
主要分析前三种内部类的创建以及对象的创建和方法的如何调用

一、静态内部类

1)访问内部类的数据成员和方法

访问内部类数据成员方法: 内部类对象直接调用
内部类对象调用外部类非静态数据成员和方法内部类对象 . 外部类对象. 方法或者变量
在内部类调用外部类静态数据成员或方法: 外部类名直接调用

1)) 通过在内部类中写入一个传入外部类对象的构造函数,以此建立内部类的对象,通过内部类对象调用内部类的数据成员和方法

//   此代码处于内部类中
  OuterClass outer;  // 创建一个外部类类型的成员变量
        public InnerClass(OuterClass outer) {       //  静态内部类构造方法(传入的是外部类的对象)
            this.outer = outer;
        }
2))    **创建内部类对象,  内部类对象可以调用内部类对象,此外也可以调用外部类对象和方法**;  	  	
public static void  main{
 //  创建静态内部类的对象,首先要创建一个外部类对象,把外部类对象传给静态内部类
        OuterClass outer=new OuterClass();
        OuterClass.InnerClass inner =new OuterClass.InnerClass(outer);   //   >>>>>创建了静态内部类对象 inner
	        inner.fun();         // 通过静态内部类对象调用内部类的成员方法
            inner.outer.eat();//  **通过静态内部类对象调用外部类的成员方法** 
}

二、实例内部类(成员内部类)

1:实例内部类中可以可以定义静态变量,但是必须由final 修饰
2:实例内部类不可以定义静态方法;
3: 实例内部类的对象创建方法:
外部类名 .实例内部类名 对象名 =new 外部类名(). new 内部类名();
如果已经有外部对象,则可以写成:
外部类名 .实例内部类名 对象名 =外部类对象 . new 内部类名();

4:在外部类中调用内部类的方法: !!!!外部类不能调用内部类封装的数据或者方法
定义一个内部类类型的变量,然后在外部类中构造方法,new出一个实例,

	 InnerClass2 in;  //  在外部类定义一个内部类类型的变量
    public  OuterClass() {
        in= new InnerClass2();    //在外部类中构造方法,new出一个实例,	
    }
    void fun() {  
        System.out.println(in.data5);  // 调用实例内部类的数据  !!!注意,外部类不能调用内部类封装的数据或者方法
    }

4: 在内部类中调用外部类的方法: 使用this关键字: 外部类名.this.外部类变量或方法

 System.out.println(OuterClass.this.data1); //  内部类调用外部类的数据成员或方法要使用this关键字

三、 匿名内部类

1:使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一 个接口。
2:匿名内部类中不能存在任何的静态成员变量和静态方法。
3:当所在的方法的形参需要被内部类里面使用时,该形参必须为final。
格式:
new 外部类名 ( ) {
… 里面可以写方法
} . 外部类里面的方法;

class outer{
        void fly() {
            System.out.println(" fly ");
        }
}

public class testDemo9 {
    static void fun(outer chicken){
        chicken.fly();
    }
    public  static void main(String [] args){
        new outer(){
            void fly() { 				  //重写了父类的方法  此处可不写代码
                System.out.println("fly!!!")
            }
        }.fly();

    }
}

测试代码:(成员内部类和静态内部类)

public class OuterClass {
    public int data1;
    private int data2;
    private static int data3;

    {
        data1 = 999;
        data2 = 888;
        data3 = 777;
    }

    // 外部类调用实例内部类的数据成员需要有实例
    InnerClass2 in;
    public  OuterClass() {
        in= new InnerClass2();
    }
    void fun() {
        System.out.println(in.data5);  // 调用实例内部类的数据  !!!注意,外部类不能调用内部类封装的数据或者方法
    }

    public void eat() {
        System.out.println("  eatting  ");
    }

    //*****************************************静态内部类***********************************************
    static class InnerClass {
        public int data4;
        public int data5;
        OuterClass outer;  // 创建一个外部类类型的成员变量

        public InnerClass(OuterClass outer) {  //  静态内部类构造方法(传入的是外部类的对象)
            this.outer = outer;
        }

        public void fun() {   // 静态内部类的方法
            System.out.println("this is innerclass");
            System.out.println(outer.data1); //使用静态内部类调用外部类的非静态数据成员或者方法
            outer.eat();                    //必须使用传入进来的外部类对象来调用
            System.out.println(OuterClass.data3);   //  直接用外部类名调用外部类的静态变量

        }

    }

    // ***********************************实例内部类**************************************************************
    public class InnerClass2 {
        private int data3 = 100;
        public int data5 = 10;
        //private static  int DATA4 = 1000;error
        private static final int DATA4 = 1000;    // 静态变量必须要拿final修饰
        //private static final int DATA5 = data5; error,静态变量必须给实体数据值;

        public void InnerClass2() {    //  实例内部类的方法
            System.out.println("InnerClass2().init");
            System.out.println(OuterClass.this.data1); //  内部类调用外部类的数据成员或方法要使用this关键字
        }
    }


    public static void main(String[] args) {
        //*************静态内部类相关***************************************
        //  创建静态内部类的对象,首先要创建一个外部类对象,把外部类对象传给静态内部类
        OuterClass outer = new OuterClass();
        OuterClass.InnerClass inner = new OuterClass.InnerClass(outer);   //   >>>>>创建了静态内部类对象 inner
        inner.fun();  // 通过静态内部类对象调用内部类的成员方法
        inner.outer.eat();//  通过静态内部类对象调用外部类的成员方法
        //***************实例内部类相关*********************************************
            // 创建实例内部类的对象
        //  外部类名 .实例内部类名 对象名 =new 外部类名(). new  内部类名();
        // 如果已经有外部对象,可以直接
        //  外部类名 .实例内部类名 对象名 =外部对象. new  内部类名();
          OuterClass.InnerClass2 inner2 = outer.new InnerClass2();


    }
}

测试代码: 匿名内部类

class brid{
        void fly() {
            System.out.println(" fly ");
        }
}

public class testDemo9 {
    static void fun(brid chicken){
        chicken.fly();
    }
    public  static void main(String [] args){
        new brid(){
            void fly() {   //重写了父类的方法
                System.out.println("fly!!!");
            }
        }.fly();

    }
}

猜你喜欢

转载自blog.csdn.net/qq_41884976/article/details/83512999