JAVA 内部类

内部类分为四种:成员内部类,静态内部类,局部内部类和匿名内部类
1.成员内部类
概念: 在一个类的内部再次定义一个完整的类。
内部类可以访问外部类的私有成员而不破坏封装性

public class InnerTest {

	public static void main(String[] args) {
		Outer outer=new Outer();   //先创建外部类的对象
		Outer.Inner in=outer.new Inner();  //通过外部类的对象在创建内部类的对象
		in.funntion();

	}
	

}
class Outer{
	private int i=1;
	class Inner{
		void funntion() {
			System.out.println(i);
		}
	}
}

注意:创建成员内部类的对象必须依赖于外部类的对象。

注意new的位置

成员内部类:创建内部类的对象时,必须依赖于外部类的对象,不能定义静态的成员(静态成员变量和静态的成员方法)(static finnal int a=1等常量不在考虑的范围内)
JAVA 内部类_第1张图片为什么报错?不能定义static 类型的成员?
假设定义为static是成立的,那么static是可以通过类名.XXX的方式调用,而不需要通过new对象,而我们类的内部定义必须依赖外部的对象。 在类加载的时候,static变量就会被初始化,也就是说我们在没有new Outer 的对象时,就已经可以调用内部类的成员,显然是脱离了外部类。

2.静态内部类
那么最大的优点我们可能已经熟知了。就是————不依赖外部类的对象,可以直接创建或者通过类名.XXX的方式访问,那么也就是说可以声明静态的成员
当然只能直接访问外部类的静态成员,实例的成员需要实例化外部类对象

请看下面的例子:

JAVA 内部类_第2张图片
静态内部类: j是外部类的静态成员变量,可以通过Outer.j来进行访问,但是i不是静态的,需要通过生成外部类的对象进行访问。

3.局部内部类定义在外部类的方法当中,作用的范围和创建对象范围仅限于当前的方法(简单来说就是成员函数内部创建了个class)
JAVA 内部类_第3张图片
注意重点!!!!!!下面
下面是重点很多人知道,但不知道到底是为什么?其实我也是加上了自己的理解 JAVA 内部类_第4张图片
当局部内部类访问外部类局部变量时怎么办?
也就是上面的例子
在function01 中访问function中的a,要在a前面加上finnal,将他声明成常量
那么为什么要加final?
需要保证局部内部类和外部类的局部变量二者的生命周期一致,或者外部类的局部变量比内部类的生命周期长。解释:(占时可以这么理解)对象的创建在堆中,局部变量是一种引用在栈中,栈和堆中的垃圾回收,如同保洁阿姨给你家打扫卫生一样,不可能都半小时打扫一次。二者的生命周期不一样。当对象都不存在了,被清理了,那么这个a也就无法访问了,所以必须将它声明成常量,常量的保存的时间长。
上面是自己查阅资料后,自己的理解,如果有理解错的,希望大佬帮我指证

4.匿名内部类:没有类名的局部内部类(一切特征与局部内部类相同)
必须继承一个父类或者实现一个接口。

public class TestInner {

	public static void main(String[] args) {
		Teacher t=School.getTeacher(1);
		t.teach();
		Teacher t1=School.getTeacher(2);
		t1.teach();
		}

}
abstract class Teacher{
	public abstract void teach();
}
class School{
	public static Teacher getTeacher(int classNo) {
		class BeginnerTeacher extends Teacher{
			public void teach() {
				System.out.println("初级老师在上课!");
			}
		}
		Teacher t=null;
		if(classNo%2!=0) {
			t=new Teacher() {
				public void teach() {
					System.out.println("高级老师在上班!");
				}
			};//将一个类的多个部件合在了一起,请与初级老师上课进行比较
		}else {
			t=new BeginnerTeacher();
		}
		return t;
	}
}

高级老师在上课的部分就是匿名内部类

寒假无聊在家自学的JAVA,还有目前的疫情比较严重,大家出门戴口罩,没事在家可以看看博客学习一下。

武汉加油!中国加油!!!

你可能感兴趣的:(JAVA 内部类)