分享
 
 
 

Java编程思想(2nd)学习笔记(8)-2

王朝java/jsp·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

二. Inner classes(内隐类)

1. 内隐类的基本用法

1) 如果要在外围class的non-static函数之外产生一个inner class对象,得以OuterClassName.InnerClassName的形式指定该对象的型别。而在non-static函数内则不用。

public class ExplicitStatic{

class Contents{

private int i = 11;

public int value() { return i; }

}

class Destination{

private String label;

Destination(String whereTo){

label = whereTo;

}

String readLabel() { return label; }

}

public Destination to(String s){

//在outer class的non-static函数中可直接产生inner class对象

return new Destination(s); //(1)

}

public Contents cont(){

return new Contents(); //(1)

}

public void ship(String dest){

//在outer class的non-static函数中可直接通过InnerClassName

//来指定对象型别

Contents c = cont();

Destination d = to(dest);

System.out.println(d.readLabel());

}

public static void main(String[] args){

ExplicitStatic p = new ExplicitStatic();

p.ship("Tanzania");

ExplicitStatic q = new ExplicitStatic();

//在outer class的非non-static函数内产生inner class对象

ExplicitStatic.Contents c = q.cont();

ExplicitStatic.Destination d = q.to("Borneo");

//不能在static函数直接生成inner class对象

// new Contents();

}

}

2) 对于non-staticinnerclass,在外围class的non-static函数可以通过new产生一个inner class对象,如上面的(1)处。但要在非non-static函数产生一个inner class对象,则一定要关联到其enclosingclass的某个对象。

3) inner class的向上转型

当把一个inner class对象向上转型成为interface时,我们得到的只是一个reference。

interface Destination{

String readLabel();

}

interface Contents{

int value();

}

class Parcel3{

private class PContents implements Contents{

private int i = 11;

public int value() { return i; }

}

protected class PDestination implements Destination{

private String label;

PDestination(String whereTo){

label = whereTo;

}

public String readLabel() { return label; }

}

public Destination to(String s){

return new PDestination(s);

}

public Contents cont(){

return new PContents();

}

}

public class ExplicitStatic{

public static void main(String[] args){

Parcel3 p = new Parcel3();

//把inner class对象向上转型

Contents c = p.cont();

Destination d = p.to("Borneo");

}

}

虽然我们不能在ExplicitStatic class无法调用Pcontents class,但我们把一个Pcontentsclass对象向上转型为Contents,就可对之进行调用。

4) innerclass的作用域为定义该innerclass的scope内。但innerclass可在它的作用域之外被继承(见4)。

interface Contents{

int value();

}

class Parcel3{

//PContents1class的作用域为Parcel3class内

private class PContents1 implements Contents{

private int i = 11;

public int value() { return i; }

}

public Contents cont1(){

return new PContents1();

}

public Contents cont2(){

//PContents2class的作用域为函数cont2内

class PContents2 implements Contents{

private int i = 11;

public int value() { return i; }

}

return new PContents2();

}

//不能在函数cont2外使用PContents2class

/*

public Contents cont22(){

return new PContents2();

}

*/

public Contents cont3(boolean b){

if(b){

//PContents3class的作用域为当前if内

class PContents3 implements Contents{

private int i = 11;

public int value() { return i; }

}

return new PContents3();

}

//不能在if外使用PContents3class

//return new PContents3();

return null;

}

}

public class ExplicitStatic{

public static void main(String[] args){

Parcel3 p = new Parcel3();

Contents c1 = p.cont1();

Contents c2 = p.cont2();

Contents c3 = p.cont3(true);

}

}

2. 内隐类与外围enclosing class的连接关系

2.1non-staticinnerclass

1) innerclass可以访问enclosingclass的所有成员(包括private成员),就像innerclass自己拥有这些成员一样。即innerclass天生具有对enclosingclass的所有成员的访问权力。

2) Innerclass对象被产生时,一定要关联到其enclosingclass的某个对象(这个enclosingclass对象就是Innerclass对象的制造者)。建构innerclass对象的同时,得有其enclosingclass对象的reference才行。

原因:因为innerclass可以访问enclosingclass的所有成员,那么当产生一个innerclass时,编译器会自动为innerclass对象添加一个指向enclosingclass对象的reference(这个reference是隐藏的)。所以Innerclass被产生时,一定要关联到其enclosingclass的某个对象。

3) 同一个enclosingclass对象产生出来的innerclass对象访问的是同一个enclosingclass对象中的成员。

interface Destination{

String readLabel();

}

interface Contents{

int value();

}

class Parcel3{

int i1 = 10;

private String s1 = "Parcel3_";

Parcel3(String s){

s1 += s;

}

private class PContents implements Contents{

//可调用enclosingclass的成员(1)

private int i2 = i1;

private String s2 = s1;

PContents(int num){

System.out.println("" + num + ": i2 = " + i2 + ",s2 = " + s2);

}

public int value() { return 1; }

}

public Contents cont(int i){

return new PContents(i);

}

}

public class ExplicitStatic{

public static void main(String[] args){

Parcel3 p1 = new Parcel3("1");

Contents c1 = p1.cont(1);

Contents c2 = p1.cont(2);

Parcel3 p2 = new Parcel3("2");

c2 = p2.cont(3);

c2 = p1.cont(4);

}

}

结果为:

1: i2 = 10,s2 = Parcel3_1

2: i2 = 10,s2 = Parcel3_1

3: i2 = 10,s2 = Parcel3_2

4: i2 = 10,s2 = Parcel3_1

在(1)在innerclass调用了enclosingclass的成员。结果表明,同一个enclosingclass对象p1产生的innerclass对象调用的是同一个enclosingclass对象中的成员,如结果中的1、2、4。

2.2 Static inner classes(静态内隐类)

1) 产生Static inner classes对象时,不需要同时存在一个enclosingclass对象

2) 只能在Static inner classes对象中访问enclosingclass中的静态成员。

interface Contents{

int value();

}

class Parcel1{

private static String s1 = "Parcel3_";

private String s11 = “Parcel3_”;

Parcel1(String s){

s1 += s;

}

protected static class PContents implements Contents{

//只能访问enclosing class中的s1

String s2 = s1;

//s11不是static成员,不能访问

//String 22 = s11;

PContents(int num){

System.out.println("" + num + ":s2 = " + s2);

}

public int value() { return 1; }

}

public static Contents cont(int i){

return new PContents(i);

}

}

public class ExplicitStatic{

public static void main(String[] args){

Parcel1 p1 = new Parcel1("1");

Contents c1 = p1.cont(1);

c1 = Parcel1.cont(2); //(1)

Parcel1 p2 = new Parcel1("2");

c1 = p2.cont(3);

c1 = Parcel1.cont(4);//(1)

}

}

因为内隐类Pcontentsclass是静态的,所以在(1)处不通过enclosingclass对象而是通过静态函数来直接产生其对象。

2.3 无论innerclass被嵌套置放的层次有多深,且所有outerclass的成员都可

被它访问。

class MNA{

private void f() {}

class A{

private void g() {}

class B{

void h(){

g();

f();

}

}

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有