内部类

本文详细解析了Java内部类的分类及其特点,包括有名内部类、匿名内部类、静态内部类等,阐述了它们的使用场景及限制条件,并介绍了内部类与Lambda表达式的联系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内部类的分类

非静态内部类

1:有名内部类

public class Boy{

	public void move(){
		system.out.println("...................");
	}
		/**
		*有名内部类
		*/
		public class Herat{
			public void beat(){
			system.ont.println("有名内部类");
		}
	}	
}

1:全局有名内部类的使用方式类似于全局变量;局部有名内部类的使用方式类似局部变量——它们都有固定的使用范围;

2:匿名内部类

public class Father{
	/**
	*匿名内部类
	*/
	Boy boy =new Boy(){
	@Override
			public void move(){
			system.out.println("匿名内部类");
		}
	}
}
(1)特点

1:匿名内部类由于没有类名而不能单独存在,定义匿名内部类的同时须直接实例化该类;
3:匿名内部类不能自定义构造方法,但是可以通过非静态代码块初始化成员变量
4:匿名内部类一定不能是抽象类;
5:可以在匿名内部类中添加新的属性和方法,但是这些属性和方法不能被上转型对象所调用,只能被非上转型对象方式创建的匿名内部类对象所调用

(2)抽象类与接口

1:抽象类的匿名内部类的实质为抽象类的子类
2:接口的匿名内部类的实质为抽象类的实现类

静态内部类(有static修饰)

4:静态有名内部类

public class Body {

	/**
	 * 静态有名内部类
	 */
	public static class Heart{

		public void beat(){
			System.out.println("正在跳动...");
		}
	}
}

5:静态匿名内部类

public class OutClass {

	/**
	 * 匿名内部类
	 */
	static Father son = new Father(){
		
		@Override
		public void eat() {
			System.out.println("筷子吃饭....");
		}
	};
}

6:静态内部类特点

1:静态内部类只能定义在外部类中
2:静态内部类可以直接访问外部类的静态成员变量和方法,对于非静态成员变量和方法必须创建外部类的对象间接访问
3:有名静态内部类允许有静态成员(静态的代码块、属性、方法)

内部类的特点总结

  • 内部类是一个独立的类:编译之后内部类会被编译成独立的.class文件,如果该内部类为有名内部类,则有名内部类字节码文件名为外部类的类名+$+内部类类名;如果为匿名内部类,则匿名内部类字节码文件名为外部类类名+$+数字;
  • 普通外部类、抽象类和接口可以有内部类(匿名的或有名的);
  • 内部类可以直接定义在类中,也可以定义在方法或代码块中;
  • 直接定义在外部类中的内部类可以有public、protected、默认的和private四种访问权限修饰(普通外部类、接口和抽象类只能使用public和default修饰),也可以使用static修饰( static不能修饰普通外部类、接口和抽象类);
  • 定义在方法或代码块中的内部类不能有访问修饰符修饰,也不能有static修饰。
  • 在局部变量作用的范围内,如果定义的内部类需要使用该局部变量,则该变量必须有final修饰。
  • 从 Java 8开始,如果定义的内部类需要使用该局部变量,则该变量可以不使用final修饰。

Lambda表达式

1:表达式:([参数1], [参数2], [参数3],… [参数n])->{代码块}
2:代码:

	InnerClass innerClass = new InnerClass () {
			@Override
			public void iterate(Object[] array) {
				for (Object obj : array) {
					System.out.println(obj);
				}
			}
		};
		//   用Lambda表达式写:
		IArrayUtil arrayUtil = (Object[] array) -> {
			for (Object obj : array) {
				System.out.println(obj);
			}
		};

3:如果方法有返回值且只有一行代码,则Lambda表达式语法为:

IComputer computer = (a, b) -> {
			return a+b;
		};
		int result = computer.add(1,2);
		System.out.println(result);
	}
	//Lambda表达式:
	IComputer computer = (a, b) -> a+b;

4:如果方法没有返回值且只有一行代码,则Lambda表达式语法为:

IComputer computer = (name) -> {
	System.out.println(name+"正在运行");
}
//Lambda表达式为:
IComputer computer = (name) ->System.out.println(name+"正在运行");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值