内部类介绍

基础知识

当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么这个内部的完整结构最好使用内部类

我们可以将一个类定义在另一个类或者一个方法的内部

class OuterClass{
    public int data1=1;
    public static int data2=2;//外部类可以定义静态属性
    private int data3=3;
    class InnerClass{
        public int data4 = 4;
        private int data6 = 6;

        public void test(){
            System.out.println("InnerClass::test()");
        }
    }
    public void test(){
        System.out.println("OuterClass:: test()");
    }
// OutClass是外部类
// InnerClass是内部类

实例内部类

1.如何实例化实例内部类的对象?

内部类介绍_第1张图片

正确做法:内部类必须有外部类的引用

public class Test {
    public static void main(String[] args) {
        //InnerClass innerClass = new InnerClass();//无法实例化
        OuterClass outerClass = new OuterClass();
        OuterClass.InnerClass innerClass = outerClass.new InnerClass();
    }
}

 2.内部类无法创建static对象?

public static int data5 = 5;//不行

因为内部类需要外部类的调用,而static成员是不需要去实例化这个成员的,这样两个就打架了

可以加一个final,在编译的时候就确定了变成常量

public static final int data5 = 5;//可以

3.内部类的可以直接访问外部类的变量,如果内部类有和外部类重名的变量,那么在内部类方法在使用该变量时优先调用内部类的变量

内部类介绍_第2张图片

那我非要在内部类方法访问外部类的相同名称的变量,那就这么干

System.out.println(OuterClass.this.data1);//1

实例内部类,包含了两个this,一个是内部类的,一个是外部类的


内部类的字节码文件长这样 

静态内部类

class Out {
    public int data1 = 1;
    public static int data2=2;
    private int data3 = 3;
    static class Innerclass{
        public int data4 =4;
        public static int data5 = 5;
        private int data6 = 6;

        public void test(){
            System.out.println("InnerClass::test()");
        }
    }
    public void test(){
        System.out.println("Out: test()");
    }
}

实例化:

    public static void main(String[] args) {
        Out.Innerclass innerclass = new Out.Innerclass();
        innerclass.test();
    }

在内部类方法中,自己的变量可以调,无法调用外部类中非static修饰的变量

内部类介绍_第3张图片 

那就在这个方法里面实例化外部类就可以调用外部类中非static修饰的变量

内部类介绍_第4张图片

匿名内部类

interface IA{
    void test();
}
public class Test {
    public static void main(String[] args) {
        //实例化
        IA a = new IA(){
            @Override
            public void test() {
                System.out.println("这是重写了接口的方法!");
            }
        };
        a.test();//调用
    }

有一个类实现了IA接口,还重写了他的方法,再接口名称前面new一下,就是匿名内部类

另一种调用方法

        new IA(){
            @Override
            public void test() {
                System.out.println("这是重写了接口的方法!");
            }
        }.test();

局部内部类(用的很少)

只能在方法体内部使用

    public void func(){
        class AA{
            public int a;
        }
        
        AA aa = new AA();
        System.out.println(aa.a);
    }

你可能感兴趣的:(JAVASE基础,java,开发语言,算法)