• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • YouClaw
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
风吹花落泪如雨
博客园    首页    新随笔    联系   管理    订阅  订阅

JAVA基础(八)-----内部类

内部类

内部类比外部类可以多使用三个修饰符:private(只能在外部类内部使用)、protected(外部类同一个包中其他类,外部类的子类)、static

若省略修饰符,只能与外部类处于同一个包中其他类所访问

一、非静态内部类

//在外部类以外的地方创建非静态内部类对象
Out.In in = new Out().new In("测试信息");

在非静态内部类对象里,保存了一个它所寄生的外部类对象的引用。非静态内部类可以直接访问外部类的private成员。

//--------内部类访问外部类的private成员----------
//如果外部类成员变量、内部类成员变量、内部类里方法的局部变量同名,通过this、外部类.this 作为限定区分
//
访问外部类同名变量 外部类.this.成员变量 外部类.this.成员方法 //访问内部类同名变量 this.成员变量 this.成员方法

//---------外部类访问内部类的实例变量,必须显示创建内部类对象-------------- new 内部类().变量名

不允许在非静态内部类里定义静态成员

 

拓展:子类继承Out类的非静态内部类In类

public class SubClass extends Out.In{
  //显示定义SubClass的构造器
  public SubClass(Out out){
    //通过传入的Out对象显示调用In的构造器
    //父类In的构造器必须使用外部类对象来调用,out代表外部类对象,super代表调用In类的构造器
    out.super("hello");
  }  
}

 

二、静态内部类

//在外部类以外的地方创建静态内部类对象
Outer.Inner inner = new Outer.Inner();

静态内部类不能访问外部类的实例成员(静态内部类只持有外部类的类引用,没有持有外部类对象的引用)

//外部类访问内部类的类成员
内部类.成员变量
//外部类访问内部类的实例成员
new 内部类().成员变量

接口里定义的内部类只能是静态内部类(public static)

 

三、局部内部类(很少使用)

不能加任何修饰符

 

四、匿名内部类

创建一个匿名内部类时会立即创建一个该类的实例,然后立即消失,不能重复使用

匿名内部类必须继承一个父类,或实现一个接口。并且最多一个父类或接口。

不能是抽象类(因为立即创建匿名内部类对象),不能定义构造器(没有类名),可以有初始化块代替构造器所做的事情。

abstract class Device{
  private String name;
  public abstract double getPrice();
  public Device();
  public Device(String name){
     this.name = name;
  }    
  .....
}
public class A{ public void test(Device d){ ... } public static void main(String[] args){ A a = new A(); //有参构造器 a.test(new Device("电子示波器"){ public double getPrice(){ return 20; } }); //无参构造器 Device d = new Device(){ //初始化块,不能使用静态初始化块 { int a; } //重写父类的实例方法 public String getName(){ return "键盘"; } } a.test(d); } }

 被局部内部类和匿名内部类访问的局部变量自动使用final修饰(Java为了避免数据不同步的问题)

 

posted @ 2018-06-06 23:42  风吹花落泪如雨  阅读(88)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3