黑马程序员技术交流社区

标题: 关于内部类中创建对象的一个小疑问 [打印本页]

作者: 王廷顺    时间: 2013-4-1 16:21
标题: 关于内部类中创建对象的一个小疑问
本帖最后由 王廷顺 于 2013-4-1 17:12 编辑

如下代码:
class Outer
{
      int x = 3;
      void method()
      {
            class Inner
            {   
                 
                 void function()
                 {
                     System.out.println(Outer.this.x);
                 }
            }
            new Inner().function();
           
      }
}

class InnerClassDemo3
{
     public static void main(String[] args)
     {
            new Outer().method();
     }
}
为什么”new Inner().function();“这条语句不能放在内部类Inner中,对象的创建不都是在类中才能完成吗。
作者: 赵海洋    时间: 2013-4-1 16:31
本帖最后由 赵海洋 于 2013-4-1 17:34 编辑

刚开始没有看明白你的问题,以为是报错的问题,不好意思。
对象的创建是可以在类中定义的,这个完全木有错误。但是想要创建对象总是得先把这个类定义出来吧。定义之后才可以创建对象啊,在类中创建对象的意思是在其他类中创建本类对象,然后调用本类方法。如果你在内部类里面直接创建本类对象,并调用本类方法,这就会造成报错。
作者: 胡滨    时间: 2013-4-1 17:07
楼主,你的代码只会报一个错:outer1无法解析为类型
头上那个outer没写1
加上就可以了

共同学习{:soso_e181:}

作者: 王廷顺    时间: 2013-4-1 17:11
不好意思 那个不是Outer1,而是Outer,这里边全部换成Outer或Outer1都可以,我的问题没有变,还是那个对象调用为什么不能放在Inner类中。
作者: 李红志    时间: 2013-4-1 17:14
对象的创建是在类外完成的,还没有定义类你就想创建对象?
作者: HM马明宇    时间: 2013-4-1 17:16
第一:可以在类中创建,也可以在方法中创建,看需求 但是注意:匿名对象不可以当成成员变量来创建,即只能放在方法中来创建,一般我们创建匿名对象是为了方法调用(只调用一次,没必要给对象起名字)
第二:类中方法的调用都在方法中,不可以直接在类中直接调用(不信可以去类里面试试)
第三:内部类也是类,适用于类的规则
再看你的那句代码:new Inner().function();这句话的含义是创建一个匿名对象并进行方法调用  注意,你这里调用了方法
对比以上规则,明白为什么不能了吧?

另外:你的代码有编译错误,外部类的名字那块有问题,细心注意就行了
作者: 张玉保    时间: 2013-4-1 17:23
对象的创建是在类中完成的不错,我在这里给你举个例子吧,
  1. class Demo
  2. {
  3.         public void method()
  4.         {
  5.                 Systen.out.println();
  6.         }
  7.         //new Demo().method()
  8. }/*这是在一个类中定义了一个函数,
  9.   如果你在这个类中建立对象调用method()方法会怎样?
  10.   你说的关于对象都是在类中创建没错,那是其他类在访问本类时
  11.   建立本类对象调用本类函数(静态内部类的时候可以用类名调用)*/
复制代码

作者: freeboyhrk    时间: 2013-4-1 17:38
本帖最后由 freeboyhrk 于 2013-4-1 17:53 编辑

内部类的访问规则:
1,内部类可以直接访问外部类中的成员,包括私有。之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式 外部类名.this
2,外部类要访问内部类,必须建立内部类对象。
另外,本类中不可以创建本类对象。
作者: 黑马李杰    时间: 2013-4-1 17:54
类内部要调用自己的成员没必要创建对象,因为类内部有个引用this,你要是想调用fuction()函数直接用,this.function()就可以了。
作者: 王廷顺    时间: 2013-4-1 22:09
HM马明宇 发表于 2013-4-1 17:16
第一:可以在类中创建,也可以在方法中创建,看需求 但是注意:匿名对象不可以当成成员变量来创建,即只能 ...

非常感谢,你说的很到位,我明白了。
作者: 王廷顺    时间: 2013-4-1 22:10
多谢大家的指点,我懂了,{:soso_e100:}

作者: 王廷顺    时间: 2013-4-1 22:24
对版主我想说,虽然今天是4月1日,那1分你加多了;如果不减,下次发帖你不给我加也以啊!今天是被各种愚......{:soso_e101:}




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