初学Java中的内部类(一)

首先看一下书中的例子:
//: c08:Destination.java
public interface Destination
{
        String readLabel();
} ///:~

//: c08:Contents.java
public interface Contents
{
        int value();
} ///:~

//: c08:Parcel3.java
// Returning a reference to an inner class.
public class Parcel3
{
        private class PContents implements Contents
        {
                private int i = 11;

                public int value() { return i; }
        }
       
        protected class PDestination implements Destination
        {
                private String label;

                private PDestination(String whereTo)  { label = whereTo; }
                public String readLabel() {  return label;  }
        }

        public Destination dest(String s) {  return new PDestination(s);  }

        public Contents cont() {  return new PContents(); }
}

class Test
{
        public static void main(String[] args)
        {
                Parcel3 p = new Parcel3();
                Contents c = p.cont();
                Destination d = p.dest("Tanzania");
                // Illegal -- can't access private class:
                //! Parcel3.PContents pc = p.new PContents();
        }
} ///:~

看到 p.new PContents()时我感到很惊讶,在我的潜意识里应该是这样写的new Parcel3.PContents(),这当然是C++的思维了,呵呵。由此我又试了试发现Java与C++在这样快的不同,C++中我们可以这样写代码:
class A
{
public:
    class B
    {
    };

private:
    int i;
};

int main()
{
    A::B *b = new A::B();
    return 0;
}

我发现了二者的不同:
1, C++中的内部类(我不知道是否可以这么说)与其外部类没有什么从属关系,这是两个独立的类,外部类只不过像名字空间的机制一样将内部类包了起来,我们用外部类名::内部类名就可以获取其类型定义了。
2,Java中的内部类与其外部类之间并不是独立的,其内部类就像外部类的其他方法,成员变量一样都是外部类的一个属性,除非其被声明为static的,否则必须通过外部类的对象才能访问
       下面的代码可以验证我的说法:
public class InnerClassTest
{
    private void f() {}
    private static void sf() {}

    public class InnerClass1
    {
        public InnerClass1()
        {
            f();         //can access to the private member method
        }
    }
   
    private class InnerClass2{    }
   
    public static class StaticInnerClass
    {
        public StaticInnerClass()
        {
            sf();  //can access to the static private member method
        }
    }
   
}

class Test
{
    public static void main(String[] args)
    {
        InnerClassTest test = new InnerClassTest();
        InnerClassTest.InnerClass1 i1 = test.new InnerClass1();

        //illegal: The type InnerClassTest.InnerClass2 is not visible
        //but if this main() is in InnerClassTest, it turns to be legal, I'am a little trouble about what can be
        //seen in static method?
        InnerClassTest.InnerClass2 i2 = test.new InnerClass2();

        //static inner class
        InnerClassTest.StaticInnerClass s = new InnerClassTest.StaticInnerClass();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值