嵌套类

来源:互联网 发布:学java好还是学ios好 编辑:程序博客网 时间:2024/04/29 23:19
如果你不需要内部类对象与其外围类对象之间的联系,那你可以将内部类声明为static。这
通常称为嵌套类(nested class)4。想要理解static应用于内部类时的含义,你就必须记
住,普通的内部类对象隐含地保存了一个引用,指向创建它的外围类对象。然而,当内部
类是static的时,就不是这样了。嵌套类意味着:


1. 要创建嵌套类的对象,并不需要其外围类的对象。
2.不能从嵌套类的对象中访问非静态的外围类对象。


嵌套类与普通的内部类还有一个区别。普通内部类的属性与方法,只能放在类的外部层次
上,所以普通的内部类不能有 static 数据和 static 属性,也不能包含嵌套类。但是嵌套类
可以包含所有这些东西:


//: c08:Parcel10.java
// Nested classes (static inner classes).


public class Parcel10 { 
private staticclass ParcelContents implements Contents {
private int i = 11;
public int value() {return i; } 
  }
protected staticclass ParcelDestination 
implements Destination { 

private String label;

private ParcelDestination(String whereTo) { 
      label = whereTo;
    }
public String readLabel() { return label; } 
// Nested classes can contain other static elements:
public static void f() {}
static int x = 10;
static class AnotherLevel { 
public static void f() {}
static int x = 10; 
    }
  }
public static Destination dest(String s) {
return new ParcelDestination(s); 
  }
public static Contents cont() {
return new ParcelContents();
  }
public static void main(String[] args) { 
    Contents c = cont(); 
    Destination d = dest("Tanzania");
  }
} ///:~


在 main()中,没有任何 Parcel10 对象是必需的;取而代之的是,你要使用选取一个 static
成员的普通语法,来调用返回 Contents 和 Destination 引用的方法。


你将会看到,在一个普通的(非静态)内部类中,通过一个特殊的 this 引用,可以链接到
其外围类对象。嵌套类就没有这个特殊的 this 引用,这使得它类似于一个 static 方法。


正常情况下,你不能在接口内部放置任何代码,但嵌套类可以作为接口的一部分,因为它
是 static 的。只是将嵌套类置于接口的命名空间内,这并不违反接口的规则:


//: c08:IInterface.java
// Nested classes inside interfaces.


public interface IInterface { 
static class Inner {
int i, j, k; 
public Inner() {}
void f() {} 
  }
} ///:~
我曾在本书中建议过,在每个类中都写一个 main()方法,以用来测试这个类。这样做有一
个缺点,你必须带着那些编译了的额外代码。如果这对你是个麻烦,你可以使用嵌套类来
放置测试代码。


//: c08:TestBed.java
// Putting test code in a nested class.


public class TestBed {
public TestBed() {}
public void f() { System.out.println("f()"); }
public static class Tester { 
public static void main(String[] args) {
      TestBed t = new TestBed();
      t.f();
    }
  }
} ///:~


这生成了一个独立的类 TestBed$Tester(要运行这个程序,执行 java TestBed$Tester
即可)。你可以使用这个类来做测试,但是你不必在发布的产品中包含它,只需简单地在
将产品打包前删除 TestBed$Tester.class。


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 qq领手游礼包账号存在异常怎么办 笔记本电脑太卡怎么办最有效 华为平板电脑忘记开机密码怎么办 平板电脑忘记开机密码怎么办 平板电脑忘了开机密码怎么办 qq文件已被损坏怎么办 斗地主没痘了怎么办 熹妃q传金币不够用怎么办 苹果手机玩王者卡怎么办 苹果6玩王者荣耀卡怎么办 苹果macbook开不了机怎么办 苹果7震动像拖拉机一样怎么办 win10笔记本玩lol卡怎么办 苹果笔记本密码忘了怎么办 苹果笔记本系统密码忘记了怎么办 qq加好友频繁了怎么办 淘宝买食品有问题怎么办 手机的设置图标没有了怎么办 国家创业贷款还不了会怎么办 手机mac显示:不好使.怎么办? 英雄联盟买皮肤重复怎么办 皮肤很油毛孔又粗怎么办 笔记本电脑玩英雄联盟卡怎么办 win10系统更新不动了怎么办 win7任务栏时间没了怎么办 win10桌面图标都没了怎么办 win10软件图标没了怎么办 电脑内存插板没用了怎么办 win10笔记本开不了机怎么办 cad复制东西变卡怎么办 企业网银证书过期怎么办 游戏更新网页无法正常打开怎么办 网页游戏打开说脚本错误怎么办 电脑玩游戏出现闪屏怎么办 玩游戏时出现窗口化怎么办 玩游戏时出现输入不支持怎么办 电脑玩游戏出现蓝屏怎么办 谷歌商店网页版进不去怎么办 谷歌商店为什么打不开怎么办 玩lol突然卡顿怎么办 手机上路由器管理页面打不开怎么办