1.定义:
什么是内部类?
类:使用class关键字修饰过的,就是类。
内部类:将一个类定义在一个类中
2.分类:
2.1静态内部类
package day0707_01;
/**
* @author WJ
* @date 2021年7月7日 下午8:49:59
*
* @description:静态内部类
*/
public class Outer01 {
private static int radius = 1;
// 静态内部类
static class staticInner {
public void visit() {
System.out.println("visit outer static variable:" + radius);
}
}
public static void main(String[] args) {
// 静态内部类可以访问外部类所有的静态变量,不可以访问外部类的非静态变量
// 创建方式:new 外部类.静态内部类();
Outer01.staticInner inner = new Outer01.staticInner();
inner.visit();
}
}
2.2成员内部类
package day0707_01;
/**
* @author WJ
* @date 2021年7月7日 下午8:49:59
*
* @description:成员内部类
*/
public class Outer02 {
private static int radius = 1;
private int count = 2;
// 成员内部类
class Inner {
public void visit() {
System.out.println("visit outer static variable:" + radius);
System.out.println("visit outer variable:" + count);
}
}
public static void main(String[] args) {
// 成员内部类可以访问外部类所有的属性和方法,包括静态和非静态,私有和共有。
// 成员内部类依赖于外部类的实例,创建方式:外部类实例.new 内部类();
Outer02 outer = new Outer02();
Outer02.Inner inner = outer.new Inner();
inner.visit();
}
}
2.3局部内部类
package day0707_01;
/**
* @author WJ
* @date 2021年7月7日 下午8:49:59
*
* @description:局部内部类
*/
public class Outer03 {
private int out_a = 1;
private static int STSTIC_b = 2;
public void testFunctionClass() {
int inner_c = 3;
// 普通方法里面的局部内部类
class Inner {
private void fun() {
System.out.println("普通方法里面的局部内部类访问外部类实例变量:" + out_a);
System.out.println("普通方法里面的局部内部类访问外部类静态变量:" + STSTIC_b);
System.out.println("普通方法里面的局部内部类访问外部类局部变量:" + inner_c);
}
}
// 创建方式:在对应的方法内new 内部类();
Inner inner = new Inner();
inner.fun();
}
public static void testStaticFunctionClass() {
int d = 3;
// 静态方法里面的局部内部类
class Inner {
private void fun() {
// System.out.println("普通方法里面的局部内部类访问外部类实例变量:"+out_a);//编译错误,定义在静态方法中的局部内部类不可以访问外部类的实例变量
System.out.println("普通方法里面的局部内部类访问外部类静态变量:" + STSTIC_b);
System.out.println("普通方法里面的局部内部类访问外部类局部变量:" + d);
}
}
// 创建方式:在对应的方法内new 内部类();
Inner inner = new Inner();
inner.fun();
}
public static void main(String[] args) {
// 定义在实例方法中的局部内部类可以访问外部类的所有方法和属性
// 定义在静态方法中的局部内部类只能访问外部类的静态变量和静态方法
// 创建方式:在对应的方法内new 内部类();
Outer03 outer = new Outer03();
outer.testFunctionClass();
outer.testStaticFunctionClass();
}
}
2.4匿名内部类
package day0707_01;
/**
* @author WJ
* @date 2021年7月7日 下午9:40:28
*
* @description:匿名内部类
*/
public class Outer04 {
// 当所在的方法的形参需要被匿名内部类使用时,必须声明为final
private void test(final int i) {
// 匿名内部类必须实现一个接口或者继承一个抽象类。
// 匿名内部类不能定义任何静态成员和静态方法。
// 匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。
// 创建方式:new 类/接口{匿名内部类实现部分};
new Service() {
@Override
public void method() {
System.out.println("匿名内部类!");
for (int j = 0; j < i; j++) {
System.out.print(j + " ");
}
}
}.method();
}
public static void main(String[] args) {
Outer04 outer = new Outer04();
outer.test(30);
}
}
//接口
interface Service {
void method();
}