Java内部类

Java允许把一个类定义在另一个类或者方法的内部,我们称为内部类,内部类一般分为四种:类中类,方法内部类,匿名内部类和静态内部类。下面就来了解一下这四种内部类的用法。

类中类

顾名思义,就是在一个类中又定义了一个类,就像这样:

public class OutterClass {
    private String name;
    
    public OutterClass(String name) {
        super();
        this.name = name;
    }

    class Inner{
        private int id;
        
        public void show(){
            System.out.println("我是内部类");
        }
    }
    
}

其实可以把Inner理解为Outter类中的一个成员变量,在Inner中可以访问Outter中的任意属性和方法(包括privatestatic)。需要注意的是,当内部类和外部类有一个同名的属性或者方法时,你在内部类中调用的话会优先调用内部类中的属性或方法,如果要访问外部类中的属性,可以用Outter.this.name来访问,上demo:

public class OutterClass {
    
    private String name = "out";
    
    public OutterClass(String name) {
        super();
        this.name = name;
    }

    class Inner{
        private String name = "in";
        public void show(){
            //访问外部类的name
            System.out.println(OutterClass.this.name);
        }
    }
}

内部类可以任意访问外部类,但是外部类要访问内部类就没有那么容易了,必须先创建一个内部类的对象,再通过这个对象来访问内部类中的属性或方法

public class OutterClass {
    
    private String name = "out";
    
    public OutterClass(String name) {
        super();
        this.name = name;
    }
    
    //创建一个内部类的对象来访问内部类的属性
    Inner in = new Inner();
    String str = in.name;

    class Inner{
        private String name = "in";
        
        public void show(){
            //访问外部类的name
            System.out.println(OutterClass.this.name);
        }
    }
}

同理也不能直接创建一个内部类的对象,必须通过外部类的对象来创建,因为内部类的存在是以外部类为基础的。

public static void main(String[] args) {
        //通过外部类的对象来创建内部类的对象
        OutterClass out = new OutterClass("hi");
        OutterClass.Inner in = out.new Inner();
    }

方法内部类

也很好理解,就是在一个方法中定义了一个类:

public class OutterClass {
    
    private String name = "out";
    
    public void test(){
        //内部类
        class Inner{
            String name = "inner";
        }
        
    }
}

可以把Inner理解为方法test中的一个属性,所以只能在这个方法中访问,不能加访问修饰符

匿名内部类

匿名内部类是没有名字的类,所以没有办法引用它,因此它只能使用一次,匿名内部类通常用接口来实现,在new了之后就直接跟上类的body{}:

public class OutterClass implements TestInterface {
    
    //匿名内部类
    TestInterface ti = new TestInterface() {
        public void show(){
            System.out.println("我是匿名内部类中的方法");
        }
    };
    
}

匿名内部类更好的体现了Java的封装性,同时也使代码变得更加简洁,易读。匿名内部类在Android中使用非常普遍,基本上到处都能用到。

静态内部类

静态内部类跟类中类一样,只不过在前面加了一个static,所以创建一个静态内部类不需要依赖外部类,也就是说即使没有外部类的对象也可以直接new一个静态内部类的对象。因为你new一个静态内部类的时候可能还没有外部类的对象,所以静态内部类是不能访问外部类的非静态的属性和方法

public class OutterClass {
    
    static int id = 1;
    
    static void show(){
        System.out.println("外部类的static方法");
    }
    
    static class Inner{
        //访问外部类的静态属性
        int id = OutterClass.id;
        
        //访问外部类的静态方法
        void show(){
            OutterClass.show();
        }
    }
}

你可能感兴趣的:(Java内部类)