Java 内部类

内部类

  • 优点:能获得外部类的私有属性;

  • 注意:一个java类中可以有多个class类,但是只能有一个public class

  • 内部类分为:

成员内部类

局部内部类

静态内部类

匿名内部类

内部类不会因为类的加载或成员方法的加载而加载进入内存,只会在被调用的时候才会被加载进入内存

成员内部类

  • 特性:在外部类中的成员位置

eg:

public class Demo03 {
	public static void main(String[] args) {
		Outer o = new Outer();
		o.method();
		Outer.Inner in = new Outer().new Inner();
		in.show();
	}	
}

class Outer{
	int num = 1;
	public void method() {
		System.out.println(num);
	}
	//成员位置
	class Inner{
		int num = 2;
		public void show() {
			int num = 3;
			//想要访问成员---就近原则
			System.out.println(num);
			
			System.out.println(this.num);
			
			//通过所属类访问
			System.out.println(Outer.this.num);
			
		}
	}
}
  • 物理文件特性:

    ​ 外部类经过编译后在bin目录下的class文件的文件名为:Out$Inner.class

    • $ 表示所属

局部内部类

  • 特性:在外部类中的方法中;
public class Demo03 {
	public static void main(String[] args) {
		Outer o = new Outer();
		o.method();
		Outer.Inner in = new Outer().new Inner();
		in.show();
	}	
}

class Outer{
	int num = 1;
	public void method() {
		System.out.println(num);
	}
	
	class Inner{
		int num = 2;
		public void show() {
			int num = 3;
			//想要访问成员---就近原则
			System.out.println(num);
			
			System.out.println(this.num);
			
			//通过所属类访问
			System.out.println(Outer.this.num);
			
		}
	}
}
  • 物理文件特性:

    ​ 外部类经过编译后在bin目录下的class文件的文件名为:Out$1Inner.class

    • $ 表示所属
    • 1 表示局部
  • 注意:

    • 局部内部类不能被访问权限符修饰, static 也不行
    • jdk 1.8 之后,在局部内部类中访问的局部变量是一个常量(默认被 final 修饰)

静态内部类

  • 特性:内部类被静态关键字 ( static ) 所修饰

eg:

public class Demo03 {
	public static void main(String[] args) {
		Outer o = new Outer();
		o.method();
		Outer.Inner in = new Outer.Inner();
		in.show();
		in.show2();
	}	
}

class Outer{
	static int num = 1;
	public void method() {
		System.out.println(num);
	}
	
	static class Inner{
		public void show() {
			int num = 3;
			//就近原则
			System.out.println(num);
						
		}
		public void show2() {
			System.out.println(Outer.num);
		}
	}
}

匿名内部类

  • 特性:不需要创建具体的子类型,而创建出父类型的子对象;

eg:

public class Demo03{
	public static void main(String[] args) {
		//普通写法,多态
		ter t = new ret();
		t.method();
		t.show();
		
		//匿名内部类
		ter tt = new ter() {		//多态 接口类型 变量名 = 匿名实现类对象
			public void method() {
				System.out.println("天上掉下个猪八戒");
			}
			public void show() {
				System.out.println("天上掉下个林妹妹");
			}
			
		};
		//此上操作与 ter tt = new ret();		类似
		
		tt.method();
		tt.show();
	}
}

interface ter{
	abstract void method();
	abstract void show();
}
class ret implements ter{
	public void method() {
		System.out.println("实现接口方式的method方法");
	}
	public void show() {
		System.out.println("实现接口方式的show方法");
	}
}

拓展

内部类的继承

优点:

  • 在外部没有被暴露出来内部类;
  • 可以通过内部类的方法对类进行继承重写,或者通过接口实现,通过公共的方式对其内部类进行访问。因为内部类通常是被封装在外部类中;
public class Demo03{
	public static void main(String[] args) {
		new Outer().getObject();
		AbsDemo in  = new Outer().getObject();
		in.show();
	}
		
}

class Outer{
	int num = 4;
	private class Inner extends AbsDemo{
		void show() {
			System.out.println("继承方法");
		}
	}
	
	public AbsDemo getObject() {
		return new   Inner();
	}
}
//抽象方法
abstract class AbsDemo{
	abstract void  show();
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值