黑马程序员--Java内部类

------- android培训java培训、期待与您交流! ----------

 

在Java中,可以把一个类的定义放到另一个类中,--内部类。 第一个例子:

 1 public interface Contents
 2 {
 3     int value();
 4 }
 5 public class Parcel7b
 6 {
 7     class MyContents implements Contents
 8     {
 9         private int    i    = 11;
10 
11         public int value()
12         {
13             return i;
14         }
15     }
16 
17     public Contents contents()
18     {
19         return new MyContents();
20     }
21 
22     public static void main(String[] args)
23     {
24         Parcel7b p = new Parcel7b();
25         Contents c = p.contents();
26         Contents c1 = p.new MyContents();
27     }
28 }

 

 

当把内部类向上转型为基类,尤其转换成接口时,内部类就有啦用武之地。

在这个例子中MyContents被定义在Parcel7b的内部,并且实现啦Contents接口;

在main函数中直接通过接口Contents c来操作,对于实现就一点也不知道了,这很好的实现啦封装性, 同时,我们也发现了在外部类作用范围之外得到内部类对象的第一个方法, 那就是利用其外部类的方法创建并返回。上例中的contents()方法就是这么做的。

还有想main方法中的:

Parcel7b p = new Parcel7b();

Contents c1 = p.new MyContents();


注意:在创建非静态内部类对象时,一定要先创建起相应的外部类对象。 这是因为非静态的内部类都有指向其外部类的引用。 在看一个例子:

 1 public interface Contents
 2 {
 3     int value();
 4 }
 5 public class Parcel7b
 6 {
 7     private int i = 12;
 8     public int j = 9;
 9     class MyContents implements Contents
10     {
11         private int    i    = 11;
12 
13         public int value()
14         {
15             return i + j + Parcel7b.this.i;
16         }
17     }
18 
19     public Contents contents()
20     {
21         return new MyContents();
22     }
23 
24     public static void main(String[] args)
25     {
26         Parcel7b p = new Parcel7b();
27         Contents c = p.contents();
28         Contents c1 = p.new MyContents();
29     }
30 }


 

在这里我们给Parcel7b类增加了一个private成员变量i,和public的成员变量j; 在内部类MyContents的方法value()计算价值时把它加上。 我们发现,value()可以访问i和j,这也是内部类的第二个好处: 一个内部类对象可以访问创建它的外部类对象的内容,甚至包括私有变量! 访问私有变量是(Parcel7b.this.i)这种方式。

在方法和作用域内的内部类---局部内部类 

 1 public interface Contents
 2 {
 3     int value();
 4 }
 5 public class Parcel7b
 6 {
 7     private int i = 12;
 8     public int j = 9;
 9     
10     public Contents contents()
11     {
12         
13         class MyContents implements Contents
14         {
15             private int    i    = 11;
16 
17             public int value()
18             {
19                 return i + j + Parcel7b.this.i;
20             }
21         }
22 
23         return new MyContents();
24     }
25 
26     public static void main(String[] args)
27     {
28         Parcel7b p = new Parcel7b();
29         Contents c = p.contents();
30         Contents c1 = p.new MyContents();
31     }
32 }


 

在contents方法中定义的MyContents 类,其作用域在这个方法内部,通过Contents接口访问。

匿名内部类 java的匿名内部类的语法规则看上去有些古怪,不过如同匿名数组一样, 当你只需要创建一个类的对象而且用不上它的名字时,使用内部类可以使代码看上去简洁清楚。它的语法规则是这样的: new interfacename(){......}; 或 new superclassname(){......};

静态内部类 和普通的类一样,内部类也可以有静态的。不过和非静态内部类相比,区别就在于静态内部类没有了指向外部的引用。 除此之外,在任何非静态内部类中,都不能有静态数据,静态方法或者又一个静态内部类(内部类的嵌套可以不止一层)。 不过静态内部类中却可以拥有这一切。

  

------- android培训java培训、期待与您交流! ----------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值