Java内部类的实现

内部类的定义

何为内部类,内部类就是在一个类或者一个方法或者一个代码块中定义的类。

内部类的作用

  1. 封装。将不想公开的实现细节封装到一个内部类中,内部类可以声明为私有的,只能在所在外
    部类中访问。
  2. 提供命名空间。静态内部类和外部类能够提供有别于包的命名空间。
  3. 便于访问外部类成员。内部类能够很方便访问所在外部类的成员,包括私有成员也能访问。

内部类的分类

在这里插入图片描述

成员内部类

实例内部类与实例变量类似,可以声明为公有级别、私有级别、默认级别或保护级别,即4种访问级别都可以,而外部类只能声明为公有或默认级别。

package com.a51Work6;
//外部类
public class Outer {
    //外部类成员变量
    private int x=10;
    //外部类方法
    private void print(){
        System.out.println("调用外部类方法");
    }
    //测试调用内部类方法
    public void test(){
        Inter inter=new Inter();
        inter.display();

    }
    //内部类
    class Inter{
        //内部类成员变量
        private int x=5;
        //内部类方法
        void display(){
            //访问外部类的成员变量x
            System.out.println("外部类册成员变量x="+Outer.this.x);
            //访问内部类的成员变量x
            System.out.println("内部类成员变量x="+this.x);
            System.out.println("内部类成员变量x="+x);
            //调用外部类的成员方法
            Outer.this.print();
            print();
        }
    }
}

package com.a51Work6;

public class Main {
    public static void main(String[] args) {
        //通过外部类访问内部类
        Outer outer =new Outer();
        outer.test();
        System.out.println("----------直接访问内部类-------------");
        //直接访问内部类
        Outer.Inter inter= outer.new Inter();
        inter.display();
    }
}

静态内部类

静态内部类与静态变量类似,在声明的时候使用关键字static修饰,静态内部类只能访问外部类静态成员,所以静态内部类使用的场景不多。但可以提供有别于包的命名空间。

package com.a51Work7;
//外部类
public class View {
    //外部类实例变量
    private int x=20;
    //外部类静态变量
    private static int staticX=10;
    //静态内部类
    static class Button{
        //内部类方法
        void onClick(){
            //访问外部类的静态成员
            System.out.println("staticX:"+staticX);

        }
    }
}

package com.a51Work7;

public class Main {
    public static void main(String[] args) {
        //直接访问内部类
        View.Button button=new View.Button();
        button.onClick();
    }
}

局部内部类

局部内部类就是在方法体或代码块中定义的内部类,局部内部类的作用域仅限于方法体或代码块中。局部内部类访问级别只能是默认的,不能是公有的、私有的和保护的访问级别,即不能使用public、privateprotected修饰。局部内部类也不能是静态,即不能使用static修饰。局部内部类可以访问外部
类所有成员。

//Outer.java文件
package com.com.a51Work8;
//外部类
public class Outer {
    // 外部类成员变量
    private int value = 10;
    // 外部类方法
    public void add(final int x, int y) {
//局部变量
        int z = 100;
// 定义内部类
        class Inner {
            // 内部类方法
            void display() {
                int sum = x + z + value;
                System.out.println("sum = " + sum);
            }
        }
//声明匿名对象
        new Inner().display();
    }
}
package com.com.a51Work8;

public class Main {
    public static void main(String[] args) {
        Outer outer=new Outer();
        outer.add(100,300);
    }
}

匿名内部类

匿名内部类是没有名字的内部类,本质上是没有名的局部内部类,具有局部内部类所有特征。例如:可以访问外部类所有成员。如果匿名内部类在方法中定义,它所访问的参数需要声明为final的。

package com.a51Work9;

public interface OnClickListener {
    void onClick();
}

package com.a51Work9;

public class View {
    public void handler(OnClickListener listener){
      listener.onClick();
    }
}

package com.a51Work9;

public class Main {
    public static void main(String[] args) {
        View v=new View();
        v.handler(new OnClickListener() {
            @Override
            public void onClick() {
                System.out.println("实现接口的匿名内部类。。。");
            }
        });
    }
}

点击链接加入群聊【程序员技术交流群】:添加链接描述

发布了84 篇原创文章 · 获赞 24 · 访问量 4340

猜你喜欢

转载自blog.csdn.net/qq_41827511/article/details/103172709
今日推荐