JAVA内部类

1 内部类

在这里插入图片描述
  内部类的作用:

  • 内部类提供了更好的封装,不允许外部类之外的类访问外部内中的内部类的对象(但可以获取外部类.内部类.class),内部类只有在外部类中才有效,离开外部类后没有任何意义。
  • 内部类可以访问外部的的成员变量(包括私有变量)
  • 匿名内部类适合用于创建那些只需要使用一次的类。

  内部类比外部类多了三个修饰符(都有的是public-共有访问权限,default-包访问权限):private(当前类访问权限),protected(子类访问权限),static,final。因为外部类只有两个作用于任何位置。而内部类有四个作用域:同一个类、同一个包、父子类、任何位置。

1.1 非静态内部类

  非静态内部类中保存了一个外部类对象的引用外部类.this(可以使用this,外部类.this来区分外部类和内部类中名字相同的变量)
  非静态内部类中不允许包含静态的方法,静态成员变量,静态初始化块

1.2 静态内部类

  静态内部类是与外部类类相关的(而非静态内部类与外部类是对象相关的)。并且,静态内部类只能访问外部类的静态成员和静态方法

1.3 使用内部类

  • 不能在外部类中的静态方法中使用非静态内部类(因为非静态内部类是做为外部类的的成员变量的)
  • 在外部类以外的其他地方使用非静态内部类:OuterInstance.new InnerConstructor()
  • 非静态内部类中有一个其外部类对象的引用,所以,非静态内部类的子类也应该有一个该外部类对象的引用()
  • 非静态内部类In对象和他的SubClass对象都必须持有指向外部类Outer对象的引用,区别在于传入Out对象的方式不同。当创建In对象的Outer对象时,必须通过一个已有的Outer对象来调用new关键字;当创建SubClass类的Outer对象时,必须使用Oter对象作为调用者来调用In类的构造器

  非静态内部类与静态内部类创建对象的方式都差不多。区别在于静态内部类通过外部类就可以调用内部类构造器,而非静态内部类通过外部类的对象来调用内部类构造器。因此,当程序使用内部类时,当优先考虑静态内部类

1.3 匿名内部类

  • 当被匿名内部类访问的局部变量自动使用了final修饰。但是这个局部变量不能被改变了。
public class Main {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		 int b=3;
		A a=new A(){
			/** 
			 * TODO 简单描述该方法的实现功能(可选). 
			 * @see temp.A#A() 
			 */
			@Override
			public void A() {
				// 下面语句在java8之前会报错,之后就不会了
				System.out.println(b);
			}
		};
	}

}
 
interface A{
	void A();
}

1.4 Lambda表达式

  Lambda表达式由三部分组成:()->{}

  • 形参列表
  • 箭头
  • 代码块

 emsp;为了保证Lambda的目标类型(target type)是一个明确的函数式接口,常见的有以下三种方法:

  • 将Lambda表达式赋值给一个函数式接口的变量。
  • 将Lambda表达式作为函数式接口类型的参数传递给方法
  • 将Lambda表达式强制类型转换给一个函数式接口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值