学习任务:

视频学习

阅读文档认识内部类

动手构建内部类对象

动手测试public和private

顾名思义内部类就是在内部定义的类,内部是指哪里呢?是指在类的内部定义一个类,这个类称为内部类。

内部类的形式有四种:成员内部类、局部内部类、匿名内部类、静态内部类。下边介绍成员内部类。

如下:类FirstInnerClass是一个内部类,它在FirstOuterClass的内部定义,FirstOuterClass称为外部类:

package com.pbteach.javase.oop.innerclass;

/**
 * 第一个内部类测试
 * @author 攀博课堂
 * @version v1.0
 */
public class FirstOuterClass {
	
	//内部类
	private class FirstInnerClass{
		
		
	}

}

在学习内部类之前我们知道,一个类不能使用private修饰,通过上边的代码发现内部类可以使用private修饰,内部类使用private修饰表示它只能在外部类的内部被使用,所以内部类可以很好的隐藏一个类,并控制对类的访问。

由于内部类在外部类的内部定义,所以内部类无需在单独的java文件中定义,上边的内部类编译后生成FirstOuterClass$FirstInnerClass.class文件,所以内部类无需去维护单独的java文件。

内部类定义的位置处于外部类成员的位置所以叫成员内部类,类的成员有:成员方法、成员变量,现在又多了一个成员就是成员内部类。

当内部类使用private修饰时只能在外部类中去构建内部类对象,下边使用两种方法进行测试,代码如下:

package com.pbteach.javase.oop.innerclass;


/**
 * 第一个内部类测试
 * @author 攀博课堂
 * @version v1.0
 */
public class FirstOuterClass {
	
	
	
	//内部类
	private class FirstInnerClass{
		
		
	}
	//构建内部类对象
	public FirstInnerClass getFirstInnerClassObj(){
		return new FirstInnerClass();
	}
	

	public static void main(String[] args) {
		//构建一个外部类对象
		FirstOuterClass firstOuterClass = new FirstOuterClass();
		//调用外部类的方法构建内部类对象
		FirstInnerClass firstInnerClassObj = firstOuterClass.getFirstInnerClassObj();
		//使用外部类对象构建一个内部类对象
		FirstInnerClass firstInnerClassObj2 = firstOuterClass.new FirstInnerClass();
		
	}
}

两种创建内部类对象的方法:

1)在外部类的非静态方法中通过new去构造一个内部类对象,详细请参考getFirstInnerClassObj()方法。

2)通过 外部类对象去构造一个内部类对象,成员内部类对象依赖外部类对象而存在。

格式如下:

外部类对象.new 内部类名称()

内部类还可以用public修饰,public修饰的内部类可以在外部类以外去访问,下边是private和public两种修饰的对比:

1)private修饰

定义一个单独的类FirstInnerTest用于测试:

image-20210620191913081

上边的代码报:The type FirstOuterClass.FirstInnerClass is not visible 编译期错误,说明private修饰的内部类在外部类以外不可见。

2)public修饰

下边将内部类的修饰改为public,如下:

package com.pbteach.javase.oop.innerclass;

/**
 * 第一个内部类测试
 * @author 攀博课堂
 * @version v1.0
 */
public class FirstOuterClass {

	//内部类
	public class FirstInnerClass{
		
		
	}
	......

再观察FirstInnerTest类现在编译错误已经消失,这说明在外部类的外边可以访问public修饰的内部类。

package com.pbteach.javase.oop.innerclass;


/**
 * 内部类测试		
 * @author 攀博课堂
 * @version v1.0
 */
public class FirstInnerTest {
 
	public static void main(String[] args) {
		FirstOuterClass firstOuterClass = new FirstOuterClass();
		//构造一个内部类对象
		FirstOuterClass.FirstInnerClass firstInnerClass = firstOuterClass.new FirstInnerClass();
		
	}
	
}

当内部类用public修饰时,在外部类的外部去构造内部类对象的完整语法是:

外部类名.内部类名 对象名 = 外部类对象.new 内部类名称()

从测试可以看出,public修饰的内部类可以在外部类以外进行访问,当一个内部类无需限定访问时可以用public修饰,此时定义内部类的主要目的就是为了将其定义在外部类的内部。

内部类其它类成员一样,除了private、public修饰还可以采用默认修饰,默认修饰的内部类只允许同包级别的访问。(关于private、public、默认权限的内容请详细参考“成员变量的权限”知识点)

提问-攀博课堂
我要提问 不会就问,有效沟通
关注公众号,加入微信群交流提问。 攀博课堂官方公众号
问答列表,查看本知识点所有问题