java编程思想之内部类

可以将一个类定义在另一类的内部,这就是内部类。一起来看一个实例,看一下什么是内部类,以及如果调用内部类呢?

public class Parcel {
    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){
        return  new Destination(s);
    }
    public Contents contents(){
        return new Contents();
    }
    public void ship(String dest){
        Contents c = contents();
        Destination d = to(dest);
        System.out.println(d.readLabel());
    }
    public static void main(String[] args){
        Parcel p = new Parcel();
        p.ship("TEST");
        Parcel q = new Parcel();
        Parcel.Contents c= q.contents();
        System.out.println(c.value());
        Parcel.Destination d = q.to("test");
        System.out.println(d.readLabel());
	System.out.println(p.new Destination("3333").readLabel());
}}

从这个例子我们可以看到Contents和Detination定义在Parcel内部,作为Parcel的内部类使用。

从外部类的非静态方法创建内部类对象的方法:OutClassName.InnerClassName.内部类可以直接使用外部类的成员变量

外部类可以使用new 内部类来创建内部类的对象, 如: 外部类对象.new InnerClassName();


在方法和作用域内的内部类:可以在一个方法或者在任意作用域内定义内部类。如下实例:

/**
 * Created by yuanqisheng on 2017/4/1.
 * 作用于方法内部的内部类
 */
public class Parcel5 {
   public Destination destination(String s) {
       class PDestination implements Destination{
           private String label;

           PDestination(String whereTo) {
               label = whereTo;
           }
           String readLabel() {return label;}
       }
       return new PDestination(s);
   }
    
    public static void main(String[] args){
        Parcel5 p = new Parcel5();
        Destination d = p.destination("yuanqs");
    }
}

匿名内部类:从字面上理解就是没有名字的内部类,话不多说,直接上例子来的直接:

/**
 * Created by yuanqisheng on 2017/4/1.
 * 匿名内部类
 */
public class Parcel6 {
   public Contents contents(){
       return new Contents(){
           private int i=11;
           public int value(){return i;}
       };
   }

    public static void main(String[] args){
        Parcel6 p = new Parcel6();
        Contents c = p.contents();
    }

}
语法解释:创建一个继承Contents的匿名类的对象,通过new 表达式返回的引用自动向上转型对Contents的引用。

可能大家都很疑惑,为什么要使用内部类呢,使用接口也都可以实现呀!看了之前的实例,大家也应该有点了解了吧。下面讲讲使用内部类的原因和特性。

使用内部类最吸引人的原因是:每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。

如果使用的是抽象类或具体的类,而不是接口,那就只能使用内部类才能实现多重继承。

使用内部类的特性:

1,内部类可以有多个实例,每个实例都有自己的状态信息,并且在外围类对象的信息相对独立

2,在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或继承同一个类。

3,创建内部类对象的时刻并不依赖于外围类对象的创建。

4,内部类并没有令人迷惑的“ is - a”关系;它就是一个独立的实体。

    敬请关注下一节内容java编程思想之持有化对象



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值