java内部类

Java内部类: 
内部类:内置类,嵌套类。 
  将类定义在另一个类中,该类就是内部类。类中定义的类就是内部类。 
   
访问方式: 
  内部类可以直接访问外部类中的成员。 
  外部类想要访问内部类,需要建立内部类对象。 
   
   
有A类和B类,当A类想要直接访问B类中的成员,而B类又需要建立A类的对象来访问A类中的成员。这时,就将A类定义成B类的内部类。 

class outer{ 
  private int num = 3; 
  class Inner{ 
  void show(){ 
  System.out.println(num); 
  } 
  } 
  void methor(){ 
  Inner in = new Inner(); 
  in.show(); 
  } 



什么时候定义内部类? 
当分析一个事物时,该事物的内部还有具体的事物,这个具体的事物在使用该事物中 
的其他成员。内部类通常都不会直接对外提供,都会封装到外部类中,外部一般会通过 
对外提供方法的形式对其进行访问。 

内部类的使用情况: 
只有默认修饰符,或者public修饰符时,可以被外部类直接访问到。 
注意要保证的是该内部类必须定义在外部类的成员位置上。 
外部类名.内部类名 变量 = 外部类对象.内部类名对象; 
Outer.Inner in = new Outer().new Inner(); 
但是一般不会这么用,因为内部类都会被外部类隐藏,通常都是外部类提供方法获取内部类的对象,通常内部类会被private私有化。 

当内部类中如果有静态成员时,该内部类也必须是静态的。 
而静态内部类只能访问外部类中的静态成员。 
在执行static内部类方法时,两种情况。 
1.内部类静态,但是方法没静态。 
该方法需要被对象调用执行。 
new Outer.Inner();//产生了一个静态内部类的对象 
in.show(); 
2.内部类是静态,而且方法也是静态的。 
静态内部类随着对象的加载就已经存在了,静态方法随着内部类的加载也存在了。 
这时就不需要对象了。 
Outer.Inner.show(); 

非静态的内部类之所以可以直接访问外部类中的成员,那是因为内部类中都持有一个外部类对象引用:外部类名.this 

内部类定义在类中的局部位置: 
class Outer{ 
  int num = 4; 
  public void metod(){ 
  final int x = 3; 
  class Inner{ 
  void show(){ 
  System.out.println(Outer.this. num); 
  System.out.println(x); 
  } 
  } 
  new Inner().show 
  } 

x必须设置成final; 

内部类编译时会生成class文件,外部类$内部类.class 
局部内部类生成的是外部类$编号内部类.class 

匿名内部类: 
没有名字的内部类。 

好处:简化了内部类的书写。 
前提:内部类必须要继承或者实现了一个外部类或外部接口 

格式: 
abstract class AbsDemo{ 
  abstract void show(); 

class Outer{ 
  new AbsDemo(){ //创建了一个匿名内部类 
  void show(){ 
  System.out.println(num); 
  } 
  }.show(); 

new 父类名或接口(){里面定义该父类或者接口的子类的成员} 

什么时候使用匿名内部类? 
当函数的参数是一个接口类型的引用,而且该接口中的方法不超过3个。 
这时可以给这个函数传递一个匿名内部类实际参数传入。简化书写 

匿名内部类其实就是一种简化形式。在父类方法较少的时候可以使用简化书写。 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值