内部类

在一个类A内部定义类B, B是非static类,那么B叫做非静态内部类,A叫做B的外部类。

 

在一个类A内部定义类C, C是static类,那么C叫做静态内部类,A叫做C的外部类。

 

非静态内部类B:

 

1在外部类A非静态方法中可以直接实例化内部类B.

 

2.内部类B可以直接访问外部类A的属性(成员变量)或方法。

     

3.其它类D引用内部类B的语法 A.B b=A实例.new B(); //前提是B对于D是可见的。

 

4. 内部类B内部默认持有外部类实例的引用: 外部类A.this 。 一个外部类A实例 new出来的多个B实例,那么所有B实例共享这个外部类实例。

 

静态内部类C:

 

 

1.在外部类A方法中可以直接实例化内部类C.

 

 

 

2.内部类C不可以直接访问外部类A的非静态属性(成员变量)或方法。

     

 

 

3.其它类D引用内部类C的语法与普通类一样: C c = new C(); //前提是C对于D是可见的。

 

匿名内部类:

 

匿名内部类在代码块内实例化,可以调用父类构建器

 

2.匿名内部类可以覆盖或实现父类的方法。

 

3.内部类B可以直接访问外部类A的属性(成员变量)或方法。

 

匿名内部类还可以引用代码块内的可见的局部变量(含方法参数),但局部变量必须是final的。

 

 

内部类一般的使用场景:仅为外部类服务,对于其它类不可见。

 

 

public class A {
	private String name = "hello";
	 class B{//非静态内类部
		void print(){
			System.out.print("B.print A.name="+name);//引用外部类属
		}
		public A getA(){
			return A.this;//默认持有外部类实例的引用
		}
	}
	 static class C {//静态内部类
		 //int cName = name; 编译出错,静态内部类不可以引用外部类的非静态属性或方法
	 }
	 public void test(String threadName){
		final  int num =0;
		 Thread thread  = new Thread( threadName){//匿名类调用父类构建器
			 int total =num;//引用方法内局部变量
			 String aName  = name;//引用方法内final局部变量
			@Override
			public void run() {//覆盖父类方法
				// TODO Auto-generated method stub
				super.run();
			}
			 
		 };
	 }
	 public void printB(){
		 B b = new B();//外部类可以直接实例化内部类
		 b.print();
	 }
	 public static void main(String args ){
		 A a  = new A();
			A.B b = a.new B();//其它类或静态方法实例化 非静态内部类
			a = b.getA();
			C c = new C();//其它类或静态方法可以按普通方式实例化静态内部类 
			
		}
	 
}

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值