您的位置:首页 > 编程语言 > Java开发

JAVA学习资料之成员内部类

2010-08-01 01:13 337 查看
在类的成员中,有变量variable,有的称之为属性property)和方法method,有的称之为函数function)。现在,又添了一个class)。这是个很有意思的成员。

静态内部类又称为“嵌套类(nested class)”。因为只属于外部类,静态内部类不依赖于外部类所生成的对象,所以还不算奇怪。在外部类之内的方法中创建内部类对象就和创建一般对象一样没有区别。而在外部类之外创建内部类对象时,要明确内部类的位置:外部类类名.内部类类名
引用=new 外部类类名.内部类构造器; ,这使外部类看起来很像包。
而非静态内部类就很奇怪了。因为在有权限的情况下,类成员变量和方法在类生成的对象中是可以访问的,于是我们可以认为这些成员随类被具体化了。而类是抽象的,在外部类生成的具体对象中肯定不能访问成员内部类,并且在外部类具体化的同时内部类是不会被具体化的。然后你可能会想到直接通过类名来利用内部类,就和静态内部类一样。那么,就请注意这个非静态内部类和其他非静态成员一样是依赖于对象的,而不是类(可别犯概念错误!)。再说,如果这样,静态和非静态还有什么差别啊?可是类的非静态成员内部类到底哪里去了(要知道,它也可以用public来修饰啊)?类和对象看似水火不容,而Java偏偏就是把它们结合在了一起。既然结合了,就必然有办法在外部类外通过外部类对象来利用非静态成员内部类(在外部类中创建它的对象,与普通类没啥区别,不谈了)。创建它的对象的方法以前从来没有见过:

外部类类名.内部类类名 引用=new 外部类构造器.new
内部类构造器;



外部类类名.内部类类名 引用=外部类对象引用.new 内部类构造器;

我们不能直接在外部类对象中访问到非静态内部类的构造器,但能通过new运算符访问到(这种用法很怪)。还要注意的是,在静态方法中不能创建非静态内部类的对象
在编译后,内部类会有自己专有的class文件,其命名方式是:外部类名称$内部类名称.class
另外,我还做了一些试验:

1.在成员内部类中可以访问到其外部类的其他数据成员

2.内部类可继承或实现接口

3.内部类还可以拥有内部类

4.存在内部接口,只能出现在最外部类中或静态内部类中

5.非静态内部类不能拥有静态成员,静态内部类中可以拥有静态成员(内部接口也算静态成员)
附:试验代码

class
MyAttempt1
{

private
int
i=12;

interface
gg{public
void
p();}

static
int
hh(){return
0;}

public
class
aa
implements
gg

{

public
void
p()

{

ee
ff=new
ee();

ff.p();

}

public
class
ee
implements
gg

{

public
void
p()

{

System.out.println(i);

}

}

//interface gg{public void p();}
出错,提示说“内部类成员不能有静态声明”

//static int hh(){return 0;}
出错,提示说“内部类成员不能有静态声明”

}

public
static
void
main(String[]
args)

{

MyAttempt1
dd=new
MyAttempt1();

dd.bb();

}

private
void
bb()

{

aa
cc=new
aa();

cc.p();

}
}

class
MyAttempt2
{

private
int
i=12;

//public static class aa implements gg
出错,提示说“找不到符号”

public
static
class
aa

{

public
void
p()

{

ee
ff=new
ee();

ff.p();

}

public
class
ee
implements
gg

{

public
void
p()

{

//System.out.println(i);
出错,提示说“无法从静态上下文中引用非静态变量i”

System.out.println(hh());

}

}

interface
gg{public
void
p();}

static
int
hh(){return
0;}

}

public
static
void
main(String[]
args)

{

MyAttempt2
dd=new
MyAttempt2();

dd.bb();

}

private
void
bb()

{

aa
cc=new
aa();

cc.p();

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: