java内部类详解

简介: java内部类详解

what?

在内部定义类

分类:

成员内部类

如何定义:在类里声明类

public class InnerClassTest {
    public class InnerClassA {
    }
}

特点:

1. 可以访问外部类的所有成员

2. 外部类同样可以访问内部类所有成员

创建内部类对象:

外部类名.内部类名.变量名=new 外部类名().new 内部类名();

这里的内部类就像外部类声明的一个属性字段一样,因此其的对象时依附于外部类对象而存在的

静态内部类

如何定义:在类里声明静态类

public class InnerClassTest {
    static class InnerClassA {
    }
}

特点:

1. 无法访问外部类的非静态成员

2. 外部类依然可以访问静态内部类的所有访问权限的成员

创建内部类对象:

// 无需依赖外部类对象,直接创建内部类对象 
InnerClassTest.InnerClassA innerClassA = new InnerClassTest.InnerClassA();

静态内部类也是作为一个外部类的静态成员而存在,创建一个类的静态内部类对象不需要依赖其外部类对象

匿名内部类

如何定义:

匿名内部类有多种形式,其中最常见的一种形式莫过于在方法参数中新建一个接口对象 / 类对象,并且实现这个接口声明 / 类中原有的方法

     // 自定义接口
    interface OnClickListener {
        void onClick(Object obj);
 }
 //方法里新建接口对象,实现并重写接口唯一方法
      private void anonymousClassTest() {
        // 在这个过程中会新建一个匿名内部类对象,
        // 这个匿名内部类实现了 OnClickListener 接口并重写 onClick 方法
        OnClickListener clickListener = new OnClickListener() {
            @Override
            public void onClick(Object obj) {
                System.out.println("我被重写了");
            }
        };
        // new Object() 过程会新建一个匿名内部类,继承于 Object 类,
        // 并重写了 toString() 方法
        clickListener.onClick(new Object() {
            @Override
            public String toString () {
                return "我也被重写了";
            }
        });
    }

特点:


1. 可以在内部类中定义属性,但是只能在当前内部类中使用


2. 无法在外部类中使用,因为外部类无法获取当前匿名内部类的类名


3. 无法创建匿名内部类的对象


4. 内部类中可以使用外部类的属性


5. 外部类却不能使用匿名内部类中定义的属性,因为是匿名内部类,因此在外部类中无法获取这个类的类名


创建内部类对象:


外部类名.内部类名.变量名=new 外部类名().new 内部类名();

局部内部类

如何定义:声明在一个方法体 / 一段代码块的内部,而且不在定义类的定义域之内便无法使用

public class InnerClassTest {
    private void localInnerClassTest() {
        // 局部内部类 A,只能在当前方法中使用
        class A {
            // static int field = 1; // 编译错误!局部内部类中不能定义 static 字段
            public A() {
            System.out.println("创建 " + A.class.getSimpleName() + " 对象");
            }
        }
        A a = new A();
        if (true) {
            // 局部内部类 B,只能在当前代码块中使用
            class B {
                public B() {
                System.out.println("创建 " + B.class.getSimpleName() + " 对象");
                }
            }
            B b = new B();
        }
//        B b1 = new B(); // 编译错误!不在类 B 的定义域内,找不到类 B,
    }
    public static void main(String[] args) {
        InnerClassTest outObj = new InnerClassTest();
        outObj.localInnerClassTest();
    }
}

特点:

1. 局部内部类里面可以访问外部类对象的所有访问权限的成员

2. 外部类不能访问局部内部类中定义的成员

创建内部类对象:只能在局部内部类的代码块中使用

相关文章
|
1月前
|
Java 编译器
【Java】内部类
【Java】内部类
21 0
|
3月前
|
Java
【Java基础面试二】、个Java文件里可以有多个类吗(不含内部类)?
这篇文章讨论了Java文件中类的定义规则,指出一个Java文件可以包含多个类(不包含内部类),但其中最多只能有一个public类,且如果有public类,它的名称必须与文件名一致。
|
3月前
|
算法 Java
12 Java常用类(一)(内部类+object类+包装类)
12 Java常用类(一)(内部类+object类+包装类)
37 5
|
4月前
|
Java
Java进阶之内部类
【7月更文挑战第13天】Java内部类增进代码组织与封装,允许直接访问外部类成员,包括私有成员。主要有四种类型:成员、静态、局部和匿名内部类。匿名内部类常用于一次性实现接口或扩展类。内部类可隐藏实现细节,减少命名冲突,并在特定上下文中定义辅助类。示例展示了静态和非静态内部类如何在Shape类中封装Circle和Rectangle。使用内部类能提升代码可读性,但可能增加复杂性。
37 6
|
3月前
|
Java
【Java】内部类、枚举、泛型
【Java】内部类、枚举、泛型
|
5月前
|
Java
一篇文章讲明白Java中内部类详解—匿名内部类
一篇文章讲明白Java中内部类详解—匿名内部类
90 2
|
5月前
|
设计模式 Java 编译器
Java中的内部类(如果想知道Java中有关内部类的知识点,那么只看这一篇就足够了!)
Java中的内部类(如果想知道Java中有关内部类的知识点,那么只看这一篇就足够了!)
|
5月前
|
Java 编译器
24. 【Java教程】内部类
24. 【Java教程】内部类
29 2
|
6月前
|
Java 程序员
Java的内部类与匿名类的技术性文章
Java的内部类与匿名类的技术性文章
43 1
|
6月前
|
Java
Java内部类(成员内部类、静态内部类、局部内部类、局部内部类)
Java内部类(成员内部类、静态内部类、局部内部类、局部内部类)
46 3