Java09/内部类

五 内部类

1 格式定义

(1) 成员内部类
(2) 局部内部类(匿名内部类)

修饰符 class 外部类 {
	修饰符 class 内部类{
		//...
	}
}

注意: 内用外,随便访问;外用内,需要内部类对象

2 内部类使用

(1) 间接:通过外部类的方法访问内部类
(2) 直接:外部类.内部类 对象名 = new 外部类().new 内部类();

public class Outer{
	public class Inner{
		public void methodInner(){
			System.out.println("内部类")
		}
	}
	//在main函数中通过
	//外部类方法间接方法内部类方法
	//也可用直接方式访问
	public void methodOuter{
		Inner inner = new Inner();
		inner.method();
		//new Inner().methodInner();
	}

}
3 内部类成员变量的使用
public class Outer{
	int num = 10;
	public class Inner{
		int num = 20;
		public void method(){
			int num = 30;
			//内部类方法局部变量
			System.out.println(num);
			//内部类成员变量
			System.out.println(this.num);
			//访问外部类成员变量
			System.out.println(Outer.this.num);
		}
	}
}
4 局部内部类
1 局部内部类格式定义

局部内部类为定义在方法内部的类,只能在方法内部使用。

修饰符 class 外部类{
	修饰符 返回值类型 方法名(){
		class 局部内部类{
			//...
		}
	}
}

注意:定义一个类时的权限修饰符规则:
(1) 外部类public/(default)
(2) 成员内部类public/protected/(default)/private
(3) 局部内部类不能有权限修饰符

2 局部内部类的final

局部内部类如果希望访问所在方法的局部变量,那么这个局部变量必须是有效final
原因:

  1. new出来的对象在堆内存中,直到垃圾回收才消失。
  2. 局部变量和方法一起在栈内存中,方法结束后,局部变量就会消失。
  3. 为了保证new出来的对象,继续使用局部变量,故需要该局部变量是有效不变的。
public class Outer{
	public void methodOuter{
		int num = 10;//此处必须保证是实际不变的
		//int final num = 10;
		class Inner{
			public void methodInner(){
				System.out.println(num);
			}
		}
	}
}
5 匿名内部类

使用匿名内部类,不必再额外单独定义一个外部实现类
用于:接口的实现类或父类的子类只需使用一次,那么即可省去该实现类或子类的定义。

接口名 对象名 =  new 接口名(){
	//覆盖重写所有抽象方法
}

匿名内部类省去对象名称即为匿名对象:

new 接口名(){
	//覆盖重写所有抽象方法
}.method();
6 提要

类或接口作为成员变量类型
接口作为方法的参数或返回值

发布了54 篇原创文章 · 获赞 6 · 访问量 4827

猜你喜欢

转载自blog.csdn.net/glpghz/article/details/103238973