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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

:'(:'(:'(快被内部匿名类搞晕了,下面代码运行错误,求修改。

abstract class AbsDemo
{
        abstract void show();
}
class Outer
{
        int x=3;

        public void function()
        {
                //new Inner().show();
                new AbsDemo()        //匿名类调用show()一次
                {
                        void show()
                        {
                                System.out.println("x="+x);
                        }
                        void method1()
                        {
                                System.out.println("哈哈");
                        }
                }.show();
        }
}

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

评分

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

查看全部评分

27 个回复

倒序浏览
你把匿名内部类放到主函数里试试:L
回复 使用道具 举报
它是其实算是子类的实例对象,我也是醉了……:L

点评

这就是局部内部类啊,应该是主函数调用那错了吧。。。  发表于 2015-4-29 08:35
回复 使用道具 举报
你定义的内部类,,在局部变量位置,,,应该还要先new function对象吧,不然就不要function方法试试

点评

这就是成员函数中局部内部类练习啊。不能乱改的,不知道哪里错了。。。  发表于 2015-4-29 08:37
回复 使用道具 举报
主函数里面的调用有问题,new Outer().method(); 首先method方法就不是Outer类的成员,如果通过内部类调用首先要实例化,而这又是匿名的 所以不能直接调用。我觉得如果要调用就把内部类定义代码块后面的show方法改为method方法,然后主函数内再调用new Outer().function();就好了  个人理解 如有错误请指出
回复 使用道具 举报
你是想打印“哈哈” 吗?这样改就可以了~

  1. abstract class AbsDemo {
  2.         abstract void show();
  3. }

  4. class Outer {
  5.         int x = 3;

  6.         public void function() {
  7.                 // new Inner().show();
  8.                 new AbsDemo() // 匿名类调用show()一次
  9.                 {
  10.                         void show() {
  11.                                 System.out.println("x=" + x);
  12.                         }
  13.                         void method1() {
  14.                                 System.out.println("哈哈");
  15.                         }
  16.                 }.method1();
  17.         }
  18. }

  19. class InnerClassNiMing {
  20.         public static void main(String[] args) {
  21.                 new Outer().function();;
  22.         }
  23. }
复制代码
回复 使用道具 举报
你创建的Outer对象里 有  new Outer().method();这个方法吗?你匿名内部类中的方法写的是void method1()
回复 使用道具 举报
abstract class AbsDemo
{
        abstract void show();
}
class Outer
{
        int x=3;

        public void function()
        {
                //new Inner().show();
                new AbsDemo()        //匿名类调用show()一次
                {
                        void show()
                        {
                                System.out.println("x="+x);
                        }
                        void method1()
                        {
                                System.out.println("哈哈");
                        }
                }.show();
        }
}

class  InnerClassNiMing
{
        public static void main(String[] args)
        {
                new Outer().function();
        }
}
你应该这样写,你如果想通过匿名类调用method()方法,是不行的,因为你继承的抽象类里没有这个方法,多态的定义,调用方法的话能不能运行看左边,你如果
new AbsDemo()        //匿名类调用show()一次
                {
                        void show()
                        {
                                System.out.println("x="+x);
                        }
                        void method1()
                        {
                                System.out.println("哈哈");
                        }
                }.method1();
这样的话,是可以通过建立抽象类的子类调用method1()方法的。视频里讲的很详细。如果你把
AbsDemo a =new AbsDemo()        //匿名类调用show()一次
                {
                        void show()
                        {
                                System.out.println("x="+x);
                        }
                        void method1()
                        {
                                System.out.println("哈哈");
                        }
                }
           a..method1();
这样是不行的,因为这样就要看继承的抽象类里是否有.method1();的方法了!
回复 使用道具 举报
主函数里有method方法,Outer类中怎么没找到这个方法啊?
回复 使用道具 举报
主函数里面写new Outer().function();  相信我
回复 使用道具 举报
本帖最后由 Chans_宇 于 2015-4-30 10:19 编辑
Chans_宇 发表于 2015-4-29 00:25
它是其实算是子类的实例对象,我也是醉了……

匿名内部类其实就是多态的体现,它是其子实现类的实例对象,当时我也是搞得晕晕的,反正你定义内部类就按普通方式去定义,你的匿名内部类后面接了.show()整句话拼接起来其实就是利用多态创建了Inner的子实现类对象调用show()方法的(反正没main入口直接在类里面运算是会报错的,不过这里好像可以看作是方法的调用,会不会报错我没验证:L)……,你这里没有main入口,直接在这里运算时应该会报错了……况且我看了看,好像你连Inner类都没有去创建{:3_56:}

点评

这是匿名类,当然没有Inner,看仔细点,有main出口啊。。。  发表于 2015-4-30 11:19
回复 使用道具 举报
你别看它叫匿名内部类就以为它是一个类,它其实是具体的实例对象,你可以把它看作匿名对象
回复 使用道具 举报
Chans_宇 发表于 2015-4-30 10:00
匿名内部类其实就是多态的体现,它是其子实现类的实例对象,当时我也是搞得晕晕的,反正你定义内部类就按普 ...

你没理解我说的……,我下面特意补充说明了一下…… 算了,俺还是默默的撤,不然匿名内部类把你搞晕,你会把俺搞晕的:L

点评

呃呃。。  发表于 2015-4-30 19:26
回复 使用道具 举报
学习学习
回复 使用道具 举报
Chans_宇 发表于 2015-4-30 11:54
你没理解我说的……,我下面特意补充说明了一下…… 算了,俺还是默默的撤,不然匿名内部类把你搞晕,你 ...

毕向东老师视频那里有很详细的说明,你可以去看看,没事慢慢来来,都这么过来的:lol
回复 使用道具 举报
蓝墨清幽 来自手机 中级黑马 2015-5-1 23:20:15
16#
我还是自己默默的学习吧
回复 使用道具 举报
蓝墨清幽 发表于 2015-5-1 23:20
我还是自己默默的学习吧

加油:handshake
回复 使用道具 举报
new Outer().method();
应该为:new Outer().function();
回复 使用道具 举报
    new AbsDemo()        //匿名类调用show()一次                 {                         void show()                         {                                 System.out.println("x="+x);                         }                         void method1()                         {                                 System.out.println("哈哈");                         }                 }.show()你已经调用了那个Show()方法了。
回复 使用道具 举报
907888614 发表于 2015-5-2 01:19
new AbsDemo()        //匿名类调用show()一次                 {                         void show( ...

所以只能是show这个方法了
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马