内部类

一:分类

成员内部类:普通成员内部类,私有成员内部类,静态成员内部类

局部内部类

匿名内部类

二:普通成员内部类

可以被哪些修饰:private(私有成员内部类),default,protected,public

普通成员内部类

a.可以访问外部类的所有成员,包括私有的

b.外部类访问内部类成员需要先创建内部类对象

c.不能有静态资源

public class InnerClassTest {
    private int a=10;
    
    public void test(){
        System.out.println("外部类test");
        InnerClass innerClass=new InnerClass();
    }

    class InnerClass{
        private int a=20;
        
        public void test1(){

            test();
            System.out.println(a);
            InnerClassTest innerClassTest=new InnerClassTest();
            innerClassTest.test();

            System.out.println("内部类test");
        }
    }
}

class Test{
    public static void main(String[] args) {
        InnerClassTest.InnerClass innerClass=new InnerClassTest().new InnerClass();
        System.out.println(innerClass);
        innerClass.test1();
    }
}

私有成员内部类

a.若要访问只能提供一个公共的方法访问

public class PrivateClass {
    private int a=10;
    
    private void test(){
        System.out.println("outer class");
    }

    private class PrivateInnerClass{
        private int b=20;
        
        private void test1(){
            System.out.println("inner class");
        }
    }

    public void getPrivateInnerClass(){
        PrivateInnerClass privateInnerClass = new PrivateInnerClass();
        System.out.println(privateInnerClass.b);
    }
}

class Test{
    public static void main(String[] args) {
        PrivateClass privateClass=new PrivateClass();
        privateClass.getPrivateInnerClass();

    }
}

静态成员内部类

a.直接使用类名调用

public class StaticClassTest {

    public static void main(String[] args) {
        StaticClassTest.StaticInnerClass.print();
    }

    static class StaticInnerClass{
        
        public static void print(){
            System.out.println(123);
        }
    }
}

局部内部类

a.只能在方法体内实例化类

b.可以直接访问该类的私有属性,都属于该方法

public class JuBuClassTest {

    public static void main(String[] args) {
        test();
    }
    
    public static void test(){
        class JuBu{
            private int a=10;
            private void print(){
                System.out.println(a);
            }
        }

        JuBu juBu=new JuBu();
        juBu.print();
        System.out.println(juBu.a);
    }
}

匿名内部类

在多线程种使用较多

public class NoNameClass {
    public static void main(String[] args) {
     //相当于创建子类对象并调用方法
new Cat(){}.eat(); } } class Animal{ void eat(){ System.out.println("吃"); } } class Cat extends Animal{ @Override void eat() { System.out.println("猫吃鱼"); } }

 

posted @ 2019-08-09 15:40  沦为旧友  阅读(185)  评论(0编辑  收藏  举报