疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

内部类 和匿名内部类的基本应用


 

  内部类可以直接访问外部类的成员,包括私有。

  外部类要想访问内部类,必须建立对象。

  之所以可以直接访问外部类的成员,因为内部类持有外部类的引用,格式:Outer.this.x

  访问格式:

  在内部类定义在外部类中的成员位置上,而且是非私有,可以在外部的其他类中。

  可以直接建立内部类的对象。

  格式:1. 外部类.内部类 变量名 = 外部对象.内部对象;

  Outer.Inner in = new Outer().new Inner();

  2. 当内部类在成员位置上,就可以被成员修饰符修饰。

  比如 private:将内部类在外部类中进行封装。

  static: 内部类具有了static特性。

  当内部类被static修饰时,只能直接访问外部类的static成员,

  出现了想问局限。

  3.在外部类中,如何直接访问static内部类中非静态成员?

  new Outer.Inner().function();

  4. 在外部类中,如何直接访问static内部类中的静态成员?

  Outer.Inner.function();

  注意:

  当在内部类中定义了静态成员,那么内部类必须是静态内部类。(内部类中不能有静态声明除非内部类也是静态的)。

  当外部类中的静态方法访问内部类中的方法时,那么内部类必须为静态的。

  什么时候使用内部类:

  当描述的事物时,事物内部还有事物,该事物就应该用内部类封装:人-人体(private)

  内部类中定义在局部时,

  1. 不可被成员修饰符修饰。

  2. 可以直接访问外部类中的成员,因为他还持有外部类的引用,

  但是是不可以访问他所在的局部变量,只能访问被final修饰过的局部变量 。

  匿名内部类:

  1. 匿名内部类其实就是内部类的简写格式。

  2. 定义匿名内部类的前提:

  内部类必修是继承一个类或者是接口

  3. 匿名内部类的格式:

  new 父类或者接口(){定义子类的内容}

  4. 其实匿名内部类就是一个匿名子类对象,而且这个对象有点胖,也可以说是带内容的对象。

  5. 在匿名内部类中可以写其他成员,但每次只能调用一个方法,

  但可以帮他取个名字用父类的引用指向子类的对象。

  使用情况: 当使用的方法的参数类型是一个接口类型时,直接向调用方法传入一个匿名对象。

  面试题:假如我没有父类,也没有接口让我去实现,还能写匿名内部类吗?

  答案 :能

  public class{

  new Object(){

  public void function(){}

  }

  }