黑马程序员技术交流社区

标题: 新手~!关于匿名对象的一个小问题 [打印本页]

作者: -_-#    时间: 2014-5-1 00:38
标题: 新手~!关于匿名对象的一个小问题

下面是一段代码。。
abstract class AbsDemo
{
        abstract void show();
}

class Outer
{
        int x=3;
       
        public void function()
        {               
                AbsDemo d=new AbsDemo()                               
                {
                        int num=9;
                        void show()
                        {
                                System.out.println("x=="+num);
                        }
                        void abc()
                        {
                                System.out.println("hah");
                        }
                       
                };
                d.show();
                d.abc();//编译失败。抽象函数中没有
               
        }
       
}

class InnerClassDemo4
{
        public static void main(String[] args)
        {
                new Outer().function();
        }

}
//如果我要在主函数中直接调用show函数改怎么调用呢?


作者: 四川男人    时间: 2014-5-1 00:50
没搞明白你的意思
作者: NewDemo    时间: 2014-5-1 01:42
本帖最后由 NewDemo 于 2014-5-1 01:44 编辑

首先主函数是静态的,要直接调用show方法的话,那么show方法也要加静态,但是abstract不能和static共存,所以show方法不能加静态,也即不能直接调用show方法。
可以修改成下面间接地调用show方法

  1. public class Test7 {

  2.         /**
  3.          * @param args
  4.          */
  5.         public static void main(String[] args) {
  6.                 // TODO Auto-generated method stub
  7.                  AbsDemo d = new Outer().function();//通过方法返回一个AbsDemo对象d,拿到对象再用它的方法
  8.                  d.show();
  9.                  
  10.         }

  11. }
  12. abstract class AbsDemo
  13. {
  14.         abstract void show();
  15. }

  16. class Outer
  17. {
  18.         int x=3;
  19.         
  20.         public  AbsDemo function()//这里方法的返回值修改下
  21.         {               
  22.                 AbsDemo d=new AbsDemo()                                
  23.                 {
  24.                         int num=9;
  25.                         void show()
  26.                         {
  27.                                 System.out.println("x=="+num);
  28.                         }
  29.                         void abc()
  30.                         {
  31.                                 System.out.println("hah");
  32.                         }
  33.                         
  34.                 };
  35.                
  36.                 d.show();
  37. //              }  d.abc();//编译失败。抽象函数中没有
  38.                
  39.                 return d;//这里返回一个AbsDemo的对象
  40.         }
  41.         
  42. }
复制代码

作者: 张然龙    时间: 2014-5-1 08:37
本帖最后由 张然龙 于 2014-5-1 08:39 编辑

首先你要知道,主函数是静态的,如果你要在主函数中调用非静态函数不通过对象来直接调用是不可以的。
static 是成员修饰符,不可以声明在函数内部,所以你的内部类不能声明为静态。
所以你想要在主函数中直接调用show方法必须在主方法中持有你的内部类对象的引用。

必须把内部类所在的方法的返回值类型写为AbsDemo,这就是多态的应用,所以只能在外部调用覆盖后的方法,也就是show方法。
return  返回的是你内部类对象的引用,没有对象引用就不能调用show方法!。 想要在主方法中调用show方法,拿到对象引用是必须的!  
如果想调用abc方法可以在抽象类中定义abc方法并进行覆盖,就可以在主函数中用同样的方式调用abc方法!!  够详细了吧?

代码如下↓

  1. abstract class AbsDemo
  2. {
  3.         abstract void show();
  4. }
  5. class Outer
  6. {
  7.         int x=3;
  8.         public  AbsDemo function()//必须把返回值类型写为AbsDemo,这就是多态的应用,所以只能在外部调用覆盖后的方法,也就是show方法。
  9.                                                                 //如果想调用abc方法可以在抽象类中定义abc方法并进行覆盖。
  10.         {  
  11.                 AbsDemo d=new AbsDemo()                                
  12.                 {
  13.                         int num=9;
  14.                         void show()
  15.                         {
  16.                                 System.out.println("x=="+num);
  17.                         }
  18.                         void abc()
  19.                         {
  20.                                 System.out.println("hah");
  21.                         }                       
  22.                 };
  23.                 return d;//返回的是你内部类对象的引用,没有对象引用就不能调用show方法!。     
  24.         }     
  25. }

  26. class Demo2
  27. {
  28.         public static void main(String[] args)
  29.         {
  30.                
  31.                 new Outer().function().show();
  32.         }
  33. }
复制代码





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