内部类

内部类是定义在类中的类,主要的作用:

  • 内部类可以访问类中的数据,包括私有数据
  • 可以对包中的其他类隐藏起来
  • 定义一个回调函数时,使用匿名内部类可以很便捷

局部内部类

public class InnerClassDemo2 {
	public static void main(String[] args) {
		new OutClass().f();
	}
}

class OutClass{
	private int a =9;
	final int f = 4;
	static final int sf = 5;
	static int s = 3;
	public void f() {
		int ii = 4;
		final int ff =3;
		class InnerClass{
			int inin = 4;
			void f() {
				System.out.println(ff);
//				System.out.println(ii);
				System.out.println(a);
				System.out.println(f);
				System.out.println(s);
			}
		}
		new InnerClass().f();
		ii+=1;
	}
}

对于局部内部类,

  • 访问的变量:可以访问外部类的所有属性,不可以访问局部变量,除了局部常量(在jdk8以后没有加final关键字,会自动加上final,表示常量,理由,局部变量的生命周期可能没有局部内部类长)
  • 定义属性:不可以是静态属性,但可以被final修饰再被static修饰表示静态常量
  • 内部类的修饰符:不能被访问权限修饰符修饰和static,可以是abstract,final,可以被继承和实现
  • 只有在本方法内知道有这么个内部类,其他地方无法访问。

成员内部类

public class InnerClassDemo2 {
	public static void main(String[] args) {
		new OutClass().new InnerClass().f();
	}
}
class OutClass{
	private int a =9;
	final int f = 4;
	static final int sf = 5;
	static int s = 3;
	
	public class InnerClass{
		private int aa =9;
		final int fa = 4;
		static final int sfa = 5;
//		static  int sa = 3;
		public void f() {
			
		System.out.println(a);
		System.out.println(f);
		System.out.println(s);
		}
	}
}

对于普通成员内部类

  • 可以被访问权限符和static修饰,可以被abstract,final修饰
  • 不可以定义静态属性和方法,但可以定义静态常量属性
  • 可以访问外部类的所有属性
  • 被public修饰符修饰就可以按什么规则被其他类访问,创建方式为new Outclass().new Innerclass()
public class InnerClassDemo2 {
	public static void main(String[] args) {
		OutClass.InnerClass innerClass = new  OutClass.InnerClass();
		innerClass.f();
	}
}

class OutClass{
	private int a =9;
	final int f = 4;
	static final int sf = 5;
	static int s = 3;
	
	static class InnerClass{
		private int aa =9;
		final int fa = 4;
		static final int sfa = 5;
		static  int sa = 3;
		static void f() {
			
//		System.out.println(a);
//		System.out.println(f);
		System.out.println(s);
		}
	}
}

对于静态成员内部类

  • 可以定义静态属性和方法
  • 只能拿到外部类的静态属性和方法
  • 可以被访问权限修饰符修饰,可以被abstract,final修饰
  • 被public修饰符修饰就可以按什么规则被其他类访问,创建方式为new Outclass.Innerclass()注意这里Outclass没有括号

匿名内部类

public class InnerClassDemo2 {
	public static void main(String[] args) {
//		OutClass.InnerClass innerClass = new  OutClass.InnerClass();
//		innerClass.f();
//		OutClass.InnerClass.f();
		int a = 9;
		new Inner() {
			
			@Override
			public void f(int aa) {
				System.out.println(a);
//				a++;
			}
		}.f(6);;
	}
}


interface Inner{
	void f(int a);
}

对于匿名内部类

  • 本质在进行方法的重写,final修饰的类没有匿名内部类;
  • 对于其内的属性和方法看其位置在哪;在方法内和方法内部类一致,在成员变量中和成员内部类一致

其他

  • 接口内部类
    都是静态成员内部类

  • 内部接口
    可以在类中,接口中。都是静态的,基本不用

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值