【Java】--什么是内部类?

Java之内部类



一、什么是内部类

在一个类的内部再定义一个完整的类,内层的类称为内部类。


二、内部类分类

1. 成员内部类

1.1 概念

定义在类的内部,方法的外部的类称为成员内部类。编译后会有外部类$内部类.class文件

1.2 代码形式

class outer{//外部类
	
	class inner{//成员内部类

	}
}

1.3 特点

  1. 成员内部类可以使用任意修饰符(private、[default]、protected、public)
  2. 成员内部类可以获取父类的所有属性和方法,包括private修饰的。
  3. 成员内部类中不能包括静态成员(静态变量、静态方法),但可以包含静态常量(staic final)。(JDK16之前版本)
  4. 成员内部类中属性和外部类的属性同名时,使用外部类名.this.属性访问外部类的属性。

1.4 代码展示

1.4.1 成员内部类创建对象
public class Test{
	public static void main(String[] args){
		//第一种方式
		Outer ou = new Outer();//先创建外部类对象ou
		Outer.Inner in = ou.new Inner();//再通过ou创建内部类对象
		//第二种方式
		Outer.Inner in = new Outer().new Inner();//将上面两行代码合成一行
	}
}

1.4.2 成员内部类访问属性
class Outer{
	String name = "张三";
	int age = 15;
	
	class inner{
		String name = "李四";
		int age = "23";
		//inner属性
		System.out.printf("姓名:%s 年龄:%d\n",name,age);
		//outer属性
		System.out.printf("姓名:%s 年龄:%d\n",outer.this.name,outer.this.age);
	}
}

输出结果:

姓名:李四 年龄:23
姓名:张三 年龄:15

2. 静态内部类

2.1 概念

static修饰的成员内部类

2.2 代码形式

class Outer{//外部类
	
	static class Inner(){//静态内部类

	}
}

2.3 特点

  1. 静态内部类可以使用任意访问修饰符(private、[default]、protected、public)。
  2. 静态内部类易于创建对象。
  3. 静态内部类可以创建静态成员。
  4. 静态类不能创建实例成员(实例变量、实例方法)。

2.4 代码展示

2.4.1 创建对象
public class Test{
	public static void main(String[] args){
		Outer.Inner in = new Outer.Inner();//创建对象
	}
}

3. 局部内部类

3.1 概念

定义在方法中的类,使用范围仅限方法内部

3.2 代码形式

class Outer{//外部类

	public void method(){//外部类方法

		class inner{//局部内部类

		}
	}
}

3.3 特点

  1. 局部内部类不能使用任何修饰符。
  2. 局部内部类是否能获取外部类的成员取决于所在方法是否为静态(static)的。
    ①.静态方法(static):
    可以访问外部类的静态成员(静态变量、静态方法),实例成员需要创建对象调用。
    ②.实例方法
    可以访问外部类的所有成员。
  3. 局部内部类可以访问所在方法的局部变量,但是局部变量只能是常量(final),JDK1.8版本及以后fianl可以省略不写(不代表不用)。
  4. 局部内部类不能声明静态成员(静态变量、静态方法),可以使用静态常量(static final)。

3.4 代码展示

3.4.1 创建对象
class Outer{//外部类

	public void method(){//外部类方法
	
		class Inner{//内部类

		}
		Inner in = new Inner();//创建对象
	}
}

4. 匿名内部类

4.1 概念

舍弃类名的局部内部类,必须继承父类或者实现接口,有两种定义形式。

4.2 代码形式

interface MyInterface{//一个接口

}
class MyClass{//一个类

}
class Outer{//外部类
	
	public void method(){//外部类方法
		//1. 第一种定义方式
		
		//1.1 继承父类
		MyClass in1 = new MyClass(){//匿名内部类,通过父类引用(MyClass)创建对象in1
			//方法体
		}
		
		//1.2 实现接口
		MyInterface in2 = new MyInterface(){//匿名内部类,通过接口引用(MyInterface)创建对象in2
			//方法体
		}
		
		//2. 第二种定义方式
		
		//2.1 继承父类
		MyClass in3 = () -> {//匿名内部类,使用“->”,省略了new和父类名
			//方法体
		}
		
		//2.2 实现接口
		MyInterface in4 = () ->{//匿名内部类,使用“->”,省略了new和接口名
			//方法体
		}
	}
}

4.3 特点

  1. 创建匿名内部类时,必须实现接口,或继承父类。
  2. 匿名内部类的对象数量有且只能有一个。
  3. 匿名内部类不能手动添加构造方法,不能包含静态成员。
  4. 匿名内部类中的属性和方法需要使用对象来调用。
  5. 匿名内部类生成的class文件名:外部类名&编号.class

总结

本人第一次写博客,如果哪里有问题,请多担待,欢迎评论区讨论~

  • 21
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值