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、付费专栏及课程。

余额充值