Java 内部类

  一、什么是内部类?

  内部类就是把一个类写到另一个类的内部。

  二、为什么要存在内部类这个东西?

  这个我可以举个例子,例如现在有A类和B类

   class A{
        int num=10;

        public void methonA(){
            System.out.println("大家好,我是A方法");
        }

        //A类想调用B类,也得new一个对象出来
        B b=new B();
        

    }
    class B{
        A a=new A();

        public void methonB(){
            System.out.println(a.num);
            a.methonA();
        }
    }

可以看到,B类想要访问A类的变量和方法,必须new一个A类的对象出来。这当然是没问题的。那我的A类现在也想访问B类的一些成员,那我也new一个B类的对象???

B套A,A套B,这样不觉得很绕很麻烦吗,所以内部类应运而生,把B放在A类的内部,这样B类使用A类的成员的时候,就直接使用,A类使用B类的成员的时候,就new一个对象,相当于省了一步。

改进后的内部类的代码是这样的

package com.company;

public class Main {

    public static void main(String[] args) {
        System.out.println("大家好,我是Vae");
        A a =new A();
        a.methonA();

    }
}


//内部类可以直接访问外部类的所有成员,包括私有的
//外部类想要访问内部类,必须创建内部类的对象

class A{
    private int num=10;

    public void methonA(){
        System.out.println("大家好,我是A方法,外部类");
        B b=new B();
        b.methonB();
    }

    class B{

        public void methonB(){
            System.out.println("大家好,我是B方法,内部类");
            System.out.println("A类的变量:"+num);
        }
    }

}

我们可以看到,B类作为内部类,直接调用了A类的变量num,运行结果如下:

内部类的总结:

1.内部类可以直接访问外部类的所有成员,包括私有的
2.外部类想要访问内部类,必须创建内部类的对象

下面来看一下,内部类调用变量的区别,代码如下:

package com.company;

public class Main {

    public static void main(String[] args) {
        System.out.println("大家好,我是Vae");
       Outer outer=new Outer();
       outer.methon();

    }
}


class Outer{
    int num=5;

    public void methon(){
        System.out.println("大家好,我是外部类方法");
        Inner inner=new Inner();
        inner.methon();
    }

    class Inner{
        int num=1;
        public void methon(){
            int num=4;
            System.out.println("大家好,我是内部类方法");
            System.out.println(num);
            System.out.println(this.num);
            System.out.println(Outer.this.num);
        }
    }

}

输出结果:

  三、局部内部类

 局部内部类,可以把内部类写到方法的里面。

package com.company;

public class Main {

    public static void main(String[] args) {
        System.out.println("大家好,我是Vae");
       Outer outer=new Outer();
       outer.methon();

    }
}


class Outer{
    int num=5;

    public void methon(){
        System.out.println("大家好,我是外部类方法");
        //局部内部类,可以把类写在方法里面,但是不能用修饰符public,private之类的修饰了
        class Inner{
            public void methon(){
                System.out.println("大家好,我是内部类方法");
                System.out.println(num);
            }
        }
        new Inner().methon();
    }



}

  四、匿名内部类

  匿名内部类就是没有名字的内部类......这里我举一个很好玩的例子。

例如,我在实现接口的时候,电脑上的接口都是实现了USB协议的,像鼠标,键盘之类的,都写了各自的类。但是某一个只用一次就不用的东西,就没必要去专门的写代码。例如打印机,假如打印机这个是几乎不怎么使用的东西。那我可以这样写代码

package com.JavaBoard;

public class Main {

    public static void main (String [] args){


        MotherBoard motherBoard=new MotherBoard();

        motherBoard.install(new Mouse());
        motherBoard.install(new InterUSB() {
            @Override
            public void Input() {
                System.out.println("我是匿名内部类");
            }
        });


    }

}

可以看到,我的电脑主板MotherBoard类的实例,第一次调用了鼠标的对象,然后下一个呢,我直接new了接口,接口是没办法去new的,这里使用的其实就是匿名内部类,这个匿名内部类继承了InterUSB接口,然后重写了Input方法,这样可以在穿参的时候,直接把想做的功能传进来,就不用去单独写类,去重新编译运行程序了。

原文地址:https://www.cnblogs.com/yunquan/p/9786733.html