内部类有哪些好处?

来源:互联网 发布:伊利牛奶 知乎 编辑:程序博客网 时间:2024/04/29 05:29

第一个好处:隐藏你不想让别人知道的操作,也即封装性。

public interface Contents {
int value();
}
public interface Destination {
String readLabel();
}
public class Goods {
private class Content
implements Contents {
private int i = 11;
public int value() {
return i;
}
}
protected class GDestination implements Destination {
private String label;
private GDestination(String whereTo) {
label = whereTo;
}
public String readLabel() {
return label;
}
}
public Destination dest(String s) {
return new GDestination(s);
}
public Contents cont() {
return new Content();
}
}
class TestGoods {
public static void main(String[] args) {
Goods p = new Goods();
Contents c = p.cont();
Destination d = p.dest("Beijing");
}
1.类Content和GDestination被定义在了类Goods内部,并且分别有着protected和private修饰符来控制访问级别

2.Content代表着Goods的内容,而GDestination代表着Goods的目的地。

3.它们分别实现了两个接口Content和Destination。

4.在后面的main方法里,直接用 Contents c和Destination d进行操作,你甚至连这两个内部类的名字都没有看见

这样,内部类的第一个好处就体现出来了 隐藏你不想让别人知道的操作,也即封装性。

 

第二个好处 :一个内部类对象可以访问创建它的外部类对象的内容,甚至包括私有变量

public class Goods {
private valueRate=2;//Goods类增加了一个private成员变量valueRate
private class Content implements Contents {
private int i = 11*valueRate;//内部类Content的方法value()计算价值时把它乘上
public int value() {
return i; //我们发现,value()可以访问valueRate
}
}
protected class GDestination implements Destination {
private String label;
private GDestination(String whereTo) {
label = whereTo;
}
public String readLabel() {
return label;
}
}
public Destination dest(String s) {
return new GDestination(s);
}
public Contents cont() {
return new Content();
}

问题?

有人会问,如果内部类里的一个成员变量与外部类的一个成员变量同名,也即外部类的同名成员变量被屏蔽了,怎么办?

答:    Java里用如下格式表达外部类的引用: outerClass.this

为什么需要内部类?

答:   果你想实现一个接口,但是这个接口中的一个方法和你构想的这个类中的一个方法的名称,参数相同,你应该怎么办?这时候,你可以建一个内部类实现这个接口。由于内部类对外部类的所有内容都是可访问的,所以这样做可以完成所有你直接实现这个接口的功能。

真正的原因,java中的内部类和接口加在一起,可以很好的实现多继承的效果

 

扩展

局部内部类
public class Goods1 {
public Destination dest(String s)
{//dest中我们定义了一个内部类

class GDestination implements Destination {
private String label;
private GDestination(String whereTo) {
label = whereTo;
}
public String readLabel() { return label; }
}
return new GDestination(s);//最后由这个方法返回这个内部类的对象

//如果我们在用一个内部类的时候仅需要创建它的一个对象并创给外部,就可以这样做。
}
public static void main(String[] args) {
Goods1 g= new Goods1();
Destination d = g.dest("Beijing");
}

原创粉丝点击