java基础十四 内部类详解

内部类------>>java中将一个类定义在另一个类或一个方法中,这样的类称为内部类。
通常可以分为:成员内部类,静态内部类,局部内部类,匿名内部类
通俗点,可以通过类比java中变量来区分这几种内部类。
java中的成员变量对应:成员内部类,静态内部类
java中的局部变量对应:局部内部类,匿名内部类
成员内部类:最普通的一种内部类
class Outer {
	class Inner{
	//我是成员内部类
	}
}
成员内部类访问特点:
1.内部类可直接访问外部类成员 包括私有(内部类之所以能获取到外部类成员 是因为它能获取到外部类的引用(外部类名.this))
2.外部类访问内部类成员 必须创建对象
格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象
比如:Outer.Inner in = new Outer() . new Inner()
3.内部类是可以设置权限的
静态内部类(静态成员内部类):和成员内部类一样,只是在类名之前加上了一个static关键字
class Outer {
	static class Inner{
	//我是静态成员内部类
	}
}
静态成员内部类的访问特点:
1.外部类访问里面的非静态方法:
格式:外部类名.内部类名 对象名 = 外部类名.内部类对象
例如:Outer.Inner in = new Outer.Inner();
常规写法是:Outer.new Inner();
2.外部类访问里面的静态方法:Outer.Inner
注意:静态内部类是不需要依赖于外部类的,并且不能使用外部类的非static成员变量或者方法。静态内部类只能访问外部类的static修饰 的变量或者方法,如果想要访问外部类的非static修饰的变量和方法,就必须创建外部类的对象。

局部内部类:定义在一个方法或者作用于之中的类,它的访问仅限于方法内或者作用域内
class Outer {
	public void test() {
	class Inner {
	//我是局部内部类
	}
	}
}
注意:
1. 局部内部类(在方法中定义类) 只能在其所在方法中访问,他就像java方法中一个局部变量一样,它是不能有public protected private以及static修饰的
2.局部内部类访问局部变量(也就是局部内部类所在方法中的变量)必须用final修饰
原因:调用该这个方法时 局部变量如果没有用final修饰 它的生命周期和方法的生命周期一样 当方法弹栈 这个局部变量会消失 那么如果局部内部类对象还没马上消失 并且 想用这个局部变量 就不见了 如果用final修饰的话 会在类加载时进入常量池 即使方法弹栈 常量池的常量 还在 可以继续使用(常量池是方法区的一部分 final修饰的变量会放在常量池)
匿名内部类:内部类的简化写法 局部内部类的一种
本质:是一个类继承了该类或者实现了该接口的子类匿名对象
前提:存在一个类或者接口(这里的类可以是具体的类 也可以是抽象类)
格式:new 类名/接口名(){重写方法}
例如:有一个Inner接口 在方法中匿名内部类是 new Inner(){里面重写方法}
interface Inner {
	void test();
	}
public class Outer {
	public static void main(String[] args) {
		new Inner() {
			@Override
			public void test() {
				System.out.println("测试匿名内部类");
			}
		}.test();;
	}
}
注意:匿名内部类只针对重写一个方法时使用 它是不能向下转型的 因为没有子类类名

匿名内部类在编译之后 Outer $1.class Outer$2.class 其中1,2代表第几个匿名内部类
内部类编译之后:Outer$Inner.class
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值