A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© -_-# 中级黑马   /  2014-5-1 00:38  /  973 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


下面是一段代码。。
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函数改怎么调用呢?

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1 认真看视频,多思考。加油。

查看全部评分

3 个回复

倒序浏览
没搞明白你的意思
回复 使用道具 举报
本帖最后由 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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 张然龙 于 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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1 很给力!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马