黑马程序员 终于明白了一点内部类

来源:互联网 发布:淘宝帮助在哪里 编辑:程序博客网 时间:2024/04/29 03:04
 ---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

黑马基础测试的时候,有一道题是内部类,之前一直不明白怎么使用,之后看了视频才明白,虽然只会在面试的时候被刁难一下,还是做一点总结吧。


原题:6、 创建一个包含实例内部类的类,外部类中定义一个名为str的String字符串并初始化任意值,
* 在内部类中定义跟外部类同种类型且同名的变量,
* 并在内部类中定义一个方法,分别打印外部类和内部类的变量。


没看视频之前真是一头雾水,看完之后对代码做了一些修改,但仍旧不通过编译,先粘贴一下我自己的代码:

public class text6 {
class Out{  

 String str="outside";
class Inner{
String str="inner";
   void Print(){
    System.out.println(Out.this.str);
    System.out.print(str);
}
}
void Method(){
Inner in=new Inner();
in.Print();
}
}
public static void main(String[] args) {
Out x = new Out();
x.Method();
}
}


   出现的错误提示为:No enclosing instance of type text6 is accessible. Must qualify the allocation with an enclosing instance of type text6 (e.g. x.new A() where x is an instance of text6).

楼主不解,这么小的程序怎么还能出错,于是楼主百度了一下,搜到了一篇技术贴,地址为http://blog.csdn.net/sunny2038/article/details/6926079,内容也拿来用用好了:

最近在看Java,在编译写书上一个例子时,由于书上的代码只有一部分,于是就自己补了一个内部类。结果编译时出现:No enclosing instance of type E is accessible. Must qualify the allocation with an enclosing instance of type E(e.g.  x.new A() where x is an instance of E). E指代我写的那个内部类。
根据提示,没有可访问的内部类E的实例,必须分配一个合适的内部类E的实例(如x.new A(),x必须是E的实例。)看着这句提示,我就纳闷了,我已经用new实例化了这个类,为什么还不行呢。
于是百度谷歌了一下相关资料。原来我写的内部类是动态的,也就是开头以public class开头。而主程序是public static class main。在Java中,类中的静态方法不能直接调用动态方法。只有将某个内部类修饰为静态类,然后才能够在静态类中调用该类的成员变量与成员方法。所以解决办法是将public class改为public static class.


  话说一开始楼主真是没看明白,但是有一句话楼主是懂的:“在java里,类中的静态方法不恩呢该直接调用动态方法。”所以楼主错认为是我的method()的动态问题,so大笔一挥加了个static,结果编译还是那个问题,加public就更不用说了,跟本就不能加,所以楼主就仔细看了看视频里的程序跟我的到底有什么不同,于是我就发现了这个:




原来视频里的主函数跟内部类所在的外部类不在一个类中,而我的外部类和主函数都在一个text6类,

我没有真正建立Out类的实体,于是我把Out类拿到了text6类外面,编译运行成功。
于是,我就真正的理解了那个提示的意思,没有建立text6内部类的实例,

而不是没有建立Out内部类的实例,所以在methor上做文章是没有用的,问题不在这,

Out类又是text6的一个内部类,所以我又把Out类给挪了进去,对主函数做了如下修改:

public static void main(String[] args) {
text6.Out x = new text6().new Out();
x.Methord();

}

这是外部类想使用内部类时的方法,不常用,只在面试等场合用到(不是我说的,毕老师说的哦),于是编译运行又通过了。

至此,楼主才明白,上面那哥们的解释错了,那个E其实是外部类,而他的解决方法是把外部类变成静态,在一开始就加载到方法区,直接为main函数所调用,变成静态跟本无需再建立对象,所以实例问题自然就解决了,但是那根本就不是那个提示的本意,而且这里也用不着把E静态化,并不是最有效的解决方法。

估计那个哥们跟楼主犯的是同一个错误,No enclosing instance of type text6 is accessible. Must qualify the allocation with an enclosing instance of type text6,没有可访问的text6类的内部类实例,必须描述定义一个text6的内部类实例。”text6.Out x = new text6().new Out();“这样就可以了!

    ---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

原创粉丝点击