Java 中的内部类

简介: Java 中的内部类

一、实例内部类



1. 语法规则


(1)在实例内部类中,不能定义一个静态的成员变量,如果非要定义,只能在修饰类型之前加 static final

(2)如何通过实例内部类实例化对象?


OutClass outClass = new OutClass();
OutClass.InnerClass innerClass = outClass.new InnerClass();
//外部类名. 内部类名 + 内部类的对象变量 = 外部类的对象变量. new 内部类( )


(3)在实例内部类中,如果包含了和外部类同名的成员变量,那么如何在实例内部类中进行访问?


实例内部类中,包含两个 this,一个是外部类 this,一个是自己内部类的 this


外部类名. this.(变量) -> 访问的是外部类的成员变量
this.(变量) -> 访问的是内部类的成员变量


2. 代码演示


程序清单1:


class OutClass{
    public int a = 1;
    public int b = 2;
    public String str = "abc";
    //实例内部类,你可以把它当作是外部类的一个普通实例的成员
    class InnerClass{
        public int a = 99;
        public int b = 100;
        private int c = 3;
        public static final int d = 5;
        //public static int d = 5; //error
        public InnerClass(){
            System.out.println("内部类不带参数的构造方法");
        }
        public void test(){
            System.out.println(OutClass.this.a);
            System.out.println(this.a);
            System.out.println(OutClass.this.b);
            System.out.println(b);
            System.out.println(c);
        }
    }
}
public class Test1 {
    public static void main(String[] args) {
        OutClass outClass = new OutClass();
        OutClass.InnerClass innerClass = outClass.new InnerClass();
        innerClass.test();
    }
}


输出结果:


5337f78fec85455b84f14b31fe55c6d9.png


二、静态内部类



只要和 static 相关的,都与类直接相关联,而与对象并无多大关系,以下对静态内部类的测试也是如此。我们可以发现静态内部类和外部类息息相关,不需要依赖外部类实例化的对象。因为实际上,外部类中的内部类和外部类中的成员在地位上是相等的,所以语法层面也是一样的。


1. 语法规则


  1. 如何通过静态内部类实例化对象?


OutClass2 outClass2 = new OutClass2();
OutClass2.InnerClass2 innerClass2 = new OutClass2.InnerClass2();
//外部类类名.内部类类名 + 内部类的对象变量 = new 外部类类名.内部类类名()


2. 代码演示


这里有些部分和实例内部类的使用语法是一样的,我只演示一些不同的地方。


程序清单2:


class OutClass2{
    public int a = 1;
    public int b = 2;
    public String str = "abc";
    static class InnerClass2{
        public int a = 99;
        public static final int d = 5;
        public static int e = 5; //right
        public InnerClass2(){
            System.out.println("内部类不带参数的构造方法");
        }
        public void test(){
            //System.out.println(str); //error
            //正确访问外部内的成员
            System.out.println(new OutClass2().str); //right
            System.out.println(new OutClass2().a);
            System.out.println(a);
        }
    }
}
public class Test2 {
    public static void main(String[] args) {
        OutClass2 outClass2 = new OutClass2();
        OutClass2.InnerClass2 innerClass2 = new OutClass2.InnerClass2();
        innerClass2.test();
    }
}


输出结果:


c62bddfa5e2e41f980cbd554b59efec5.png


三、匿名内部类



程序清单3:


/**
 * 匿名内部类
 */
class Unnamed{
    public void test(){
        System.out.println("abc");
    }
}
class Unnamed2{
    public void test2(){
        System.out.println("abc");
    }
}
public class Test3 {
    public static void main(String[] args) {
        //匿名对象调用 test() 方法
        new Unnamed(){
        }.test();
        new Unnamed2(){
            @Override
            public void test2() {
                System.out.println("我们可以重写 test2() 方法");
            }
        }.test2();
    }
}


输出结果:


e474cbe1d455464a87ee5a1334bfa47c.png


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