黑马程序员技术交流社区

标题: 内部类问题 [打印本页]

作者: LSCZ3633    时间: 2014-2-14 09:51
标题: 内部类问题
  1. package com.itheima;
  2. public class InnerDemo {

  3.         /**
  4.          * 需求:内部类访问规则,局部内部类,匿名内部类,演示
  5.          * 思路:在外部类中定义一个局部内部类
  6.          *        
  7.          * 1因为此内部类在局部位置,是局部内部类,
  8.          * 在其他外部类无法直接创建对象,
  9.          * 因此必须在此处创建一个内部类对象并实现其功能
  10.          * new Inner().function();
  11.          * 2 变量a是局部变量,内部类若要调用必须将其用final修饰,成为常量
  12.          * @param args
  13.          */
  14.         public static void main(String[] args) {
  15.                 // TODO Auto-generated method stub
  16.                 Outer out = new Outer();
  17.                 out.method(7);//调用一次后结束时此方法所开辟的存储空间释放,
  18.                 out.method(8);//因此可以在下次调用时再给常量a赋值,
  19.         }
  20.         public class Outer{
  21.                
  22.                 int x=3;
  23.                
  24.                 public void method(final int a){
  25.                        
  26.                         class Inner{
  27.                                 void function(){
  28.                                         sop(x);
  29.                                         sop(a);
  30.                                 }
  31.                         }
  32.                         new Inner().function();
  33.                 }
  34.                 public void sop(Object obj){
  35.                        
  36.                         System.out.println(obj);
  37.                 }
  38.         }
  39.        
  40. }
复制代码


一直提示:Exception in thread "main" java.lang.Error: Unresolved compilation problem:
        No enclosing instance of type InnerDemo is accessible. Must qualify the allocation with an enclosing instance of type InnerDemo (e.g. x.new A() where x is an instance of InnerDemo).

        at com.itheima.InnerDemo.main(InnerDemo.java:15)


求教各位是什么情况?
作者: panzhenglian    时间: 2014-2-14 10:27
楼主你的是类中有成员位置的类,成员类里面的方法里面还有类,倒没见过谁这么玩过,这不是类中类中类么.而且主函数是静态的,也创建不了成员位置上的类的对象.
作者: guhaibin    时间: 2014-2-14 10:35
把Outer类加个静态修饰符试试,public static class Outer
作者: LSCZ3633    时间: 2014-2-14 10:35
还真是这个问题  非常感谢!
作者: LSCZ3633    时间: 2014-2-14 10:42
panzhenglian 发表于 2014-2-14 10:27
楼主你的是类中有成员位置的类,成员类里面的方法里面还有类,倒没见过谁这么玩过,这不是类中类中类么.而且主 ...

刚才又演示了下  这样是没有问题的 类中有类再在里面加内部类也没有问题,把Outer类用static修饰 就可以了
作者: LSCZ3633    时间: 2014-2-14 10:57
  1. package com.itheima;
  2. public class InnerDemo {

  3.         /**
  4.          * 需求:内部类访问规则,局部内部类,匿名内部类,演示
  5.          * 思路:在外部类中定义一个局部内部类
  6.          *        
  7.          * 1因为此内部类在局部位置,是局部内部类,
  8.          * 在其他外部类无法直接创建对象,
  9.          * 因此必须在此处创建一个内部类对象并实现其功能
  10.          * new Inner().function();
  11.          * 2 变量a是局部变量,内部类若要调用必须将其用final修饰,成为常量
  12.          * @param args
  13.          */
  14.         public static void main(String[] args) {
  15.                 // TODO Auto-generated method stub
  16.                 Outer out = new Outer();
  17.                 out.method(7);//调用一次后结束时此方法所开辟的存储空间释放,
  18.                 out.method(8);//因此可以在下次调用时再给常量a赋值,
  19.         }
  20.        
  21.                 static class Outer{
  22.                
  23.                 int x=3;
  24.                
  25.                 public void method(final int a){
  26.                        
  27.                         class Inner{
  28.                                 void function(){
  29.                                         sop(x);
  30.                                         sop(a);
  31.                                 }
  32.                         }
  33.                         new Inner().function();
  34.                 }
  35.                 public void sop(Object obj){
  36.                        
  37.                         System.out.println(obj);
  38.                 }
  39.         }
  40.        
  41. }
复制代码

作者: 乔青山    时间: 2014-2-14 14:16
你是怎么编译通过的呢。。。
Outer out = new Outer();
这一行中Outer是内部类,
所以你要么就InnerDemo.Outer out = new InnerDemo().new Outer();来实例化
要么就把Outer类定义成静态类。
不可能编译通过吧
作者: 奋斗的小胖子    时间: 2014-2-14 16:37
本帖最后由 奋斗的小胖子 于 2014-2-14 16:39 编辑

第一,你应该把类放在主函数的外面,第二命名不能放public  我帮你改了

  1. <p>package IOstart;</p><p>
  2. public class TestDemo {
  3. </p><p>        /**

  4.          * 需求:内部类访问规则,局部内部类,匿名内部类,演示

  5.          * 思路:在外部类中定义一个局部内部类

  6.          *         
  7.          * 1因为此内部类在局部位置,是局部内部类,

  8.          * 在其他外部类无法直接创建对象,

  9.          * 因此必须在此处创建一个内部类对象并实现其功能

  10.          * new Inner().function();

  11.          * 2 变量a是局部变量,内部类若要调用必须将其用final修饰,成为常量

  12.          * @param args

  13.          */

  14.         public static void main(String[] args) {

  15.                 // TODO Auto-generated method stub

  16.           Outer1 out = new Outer1();

  17.                 out.method(7);//调用一次后结束时此方法所开辟的存储空间释放,

  18.                 out.method(8);//因此可以在下次调用时再给常量a赋值,

  19.         }

  20. }</p><p>class Outer1
  21. {
  22. Outer1(){}
  23.         
  24.         int x=3;</p><p>        
  25.         public void method(final int a){</p><p>               
  26.                 class Inner{</p><p>                        void function(){</p><p>                                sop(x);</p><p>                                sop(a);</p><p>                        }</p><p>                }</p><p>                new Inner().function();</p><p>        }</p><p>        public void sop(Object obj){</p><p>               
  27.                 System.out.println(obj);</p><p>        }</p><p>}</p>
复制代码


作者: 奋斗的小胖子    时间: 2014-2-14 16:41
汗 ,其他人的方法也行啊 。我也学习了
作者: LSCZ3633    时间: 2014-2-15 00:50
谢了 ,我开始也以为不行那,后来加个static修饰还真行,呵呵。不过一般还是在外面方便。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2