Java内部类的分类

内部类分类:

  • 成员内部类
  • 匿名内部类
  • 局部内部类

一、成员内部类

是指可以用private protect default public任意一个进行修饰的,类文件名:外部类$内部类.class
a)非静态内部类
外部类可以使用内部类和我们平时使用其它的类没什么区别。
1)非静态内部类必须寄存在。因此如果有一个非静态内部类对象被创建,那么它的外部类对象一定会被创建,非静态内部类对象单独属于外部类的某个对象。
2)非静态内部类对象可以单独访问外部类成员,但外部类对象不能直接访问非静态内部类的成员。
3)非静态内部类是属于外部类的某个对象,因此不能有静态方法,属性,静态初始化块。
4)外部类的静态方法不能使用非静态内部类(因为非静态内部类是属于对象的,外部类的静态方法是属于外部类的,外部类对象还未被创建,因此不能用),包括不能使用非静态内部类定义变量,创建实例,但非静态内部类可以使用外部类的属性及方法。
内部类的成员变量访问要点
1)内部类方法的局部变量:直接访问。
2)内部类属性:this.属性名
3)内部类访问外部类属性:外部类.this.属性名
例子:

package com.liuzeyu12a.OOT;

public class TestInnerClass { 
    public static void main(String[] args) { 
        //生成内部类对象
        Outer.inner inner = new Outer().new inner();
        inner.show();

    }
}

class Outer{ 
    public  int age = 100;
    void testOuter(){ 
        System.out.println("外部类对象");
    }
    class inner{ 
        int ageInner = 80;
        public void show(){ 
            int ageFun = 300;
            System.out.println("外部类成员变量:"+Outer.this.age);
            System.out.println("内部类成员变量:"+this.ageInner);
            System.out.println("内部类成员变量:"+ageFun);
        }

    }
}

b)静态内部类

static  class   ClassName { 
//类体
}

静态内部类使用要点
1)当一个静态内部类存在时并不一定存在外部类对象,内部类属于外部类,不属于外部类对象,因此,静态内部类的实例方法不能直接访问外部类的实例和方法。
2)静态内部类属于外部类的一个静态成员,因此外部类可以通过 “静态内部类.名字”的方式访问静态内部类的静态成员,通过new静态内部类访问静态内部类的实例。
例子:

package com.liuzeyu12a.OOT;

public class TestInnerClass02 { 
    public static void main(String[] args) { 
        //创建静态内部类对象
        Outer2.Inner2 inner2 = new Outer2.Inner2();
        inner2.show();

        //执行外部了的方法
        new Outer2().show();
    }
}

class Outer2{ 

    String name;
    int age;
    public void show(){ 
        System.out.println("外部类访问内部类成员"+new Inner2().age);
    }
    //静态内部类
    static class Inner2{ 

        int age = 100;
        public void show(){ 
            /** * 当一个静态内部类对象存在,并不一定存在对应的外部类对象。 * 因此,静态内部类的实例方法不能直接访问外部类的实例方法。 */
            //System.out.println(Outer2.this.age);
            System.out.println("staic inner2");
        }
    }
}

二、匿名内部类

匿名内部类使用要点
1)匿名内部类没有访问修饰符
2)匿名内部类没有构造方法,因为它连名字都没有哪来的构造器

package com.liuzeyu12a.OOT;

public class TestAnonymousInner { 

    public static void main(String[] args) { 
        /** * 这里说明一下为什么System.out.println("测试匿名内部类"); * 没有被实现,因为这个是new 接口实现类的时候必须实现的方法 * 但是这个方法并没有被调用,所以并不会被运行 */
        TestAnonymousInner.test(new AA() { 
            @Override
            public void aa() { 
                System.out.println("测试匿名内部类");
            }
        });
    }

    static void test(AA aa){ 
        System.out.println("test AA ==>" + AA.aa);
    }
}
//接口AA
interface AA{ 
    int aa = 100;
    void aa();
}

二、局部内部类

还有一种内部类,它是定义在方法内部的,作用域只限于本方法,称为局部内部类。

  局部内部类的的使用主要是用来解决比较复杂的问题,想创建一个类来辅助我们的解决方案,到那时又不希望这个类是公共可用的,所以就产生了局部内部类。局部内部类和成员内部类一样被编译,只是它的作用域发生了改变,它只能在该方法中被使用,出了该方法就会失效。

  局部内部类在实际开发中应用很少。
public class Test2 { 
    public void show() { 
        //作用域仅限于该方法
        class Inner { 
            public void fun() { 
                System.out.println("helloworld");
            }
        }
        new Inner().fun();
    }
    public static void main(String[] args) { 
        new Test2().show();		//输出helloworld
    }
}