zoukankan      html  css  js  c++  java
  • 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方法,这样可以在穿参的时候,直接把想做的功能传进来,就不用去单独写类,去重新编译运行程序了。

  • 相关阅读:
    Linux 文件系统层次结构 笔记 day 02
    新买服务器 设置ssh秘钥登录
    FastSocket客户端/服务端通讯示例 客户端被动接收
    FastSocket学习笔记~制定自已的传输协议~续~制定基于FastSocket的协议
    Oracle 查看表空间使用率
    Oracle查看用户占用的表空间大小
    failed to flush export bulk [default_local]
    Elasticsearch7.x配置文件
    master not discovered yet, this node has not previously joined a bootstrapped (v7+) cluster
    4.4 rust Smart Pointers Box and Deref 及 空针指
  • 原文地址:https://www.cnblogs.com/yunquan/p/9786733.html
Copyright © 2011-2022 走看看