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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 寇龙飞 中级黑马   /  2012-9-3 11:43  /  4574 人查看  /  19 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. package com.itheima.test;

  2. public class Init {

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

  4.                 new Tools() {
  5.                         void fun() {
  6.                         }
  7.                 }.fun();
  8.         }
  9. }

  10. class Tools {

  11. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

19 个回复

倒序浏览
  1. public class Init {

  2.         public static void main(String[] args) {
  3.                 // 这就是初始化匿名内部类的方式
  4.                 Tools tools = new Tools() {

  5.                 };

  6.                 // 调用tools对象的fun()方法
  7.                 tools.fun();
  8.         }

  9. }

  10. class Tools {

  11.         void fun() {

  12.         }

  13. }
复制代码
回复 使用道具 举报
我认为匿名内部类的初始化跟外部类是一样的,当你new一个对象时,它就会调用构造函数初始化。
回复 使用道具 举报
匿名类就是在方法里定义的类,我给你的代码是在方法定义的类啊.
回复 使用道具 举报
  1. public class Init {

  2.         public static void main(String[] args) {
  3.                 // 这就是初始化匿名内部类的方式
  4.                 Tools tools = new Tools() {

  5.                 };

  6.                 // 调用tools对象的fun()方法
  7.                 tools.fun();
  8.         }

  9. }

  10. class Tools {

  11.         void fun() {

  12.         }

  13. }
复制代码
// 这个实例化出来的对象就是Tools类的子类
new Tools() { };

// 这意思是父类引用指向子类对象,这个匿名类对象new Tools() { };就是Tools类的子类对象.
Tools tools = new Tools() { };
回复 使用道具 举报
马镱洵 发表于 2012-9-3 14:05
匿名类就是在方法里定义的类,我给你的代码是在方法定义的类啊.

一个类的定义放在另一个类的内部,这个类就叫做内部类。并且这个类没有名字,称其为匿名内部类。

1.你定义了一个内部类,但非匿名。

2.我题目问,匿名内部类如何初始化。
回复 使用道具 举报
问题就是匿名内部类,没有类名,如何写其同名构造函数,如何初始化。

有一点你必须要弄清楚,要实例化一个匿名类对象,至少要知道你要实例化的匿名类对象的父类(可以是普通类,也可以是抽象类,还可以是接口.)的名字叫什么,这样才可以实例化一个匿名类对象.另外,匿名类对象在实例化时,根本不可以写自己的构造方法,只能在实例化时调用父类的构造方法.但是匿名类对象在实例化时,是可以重写父类的方法的,可以通过父类引用调用到子类的重写后的方法.不过,匿名类对象在实例化时虽然也可以写属于匿名类自己的方法,不过,根据多态原则,不可以使用父类引用调用只属于子类(就是这个匿名类)的方法.
你必须要有一个觉悟,那就是:匿名类只是某个类或接口的子类,所以要初始化匿名类,就肯定要先知道某个类或某个接口的名字.
好了,说了这么多,用代码给你演示:
public class Init {

        public static void main(String[] args) {
                // 这就是初始化匿名内部类的方式
                Tools tools = new Tools("你现在看到的是子类对象的构造方法,也就是你想要的匿名类对象.") {
                        /**
                         * 此方法是重写的父类的方法,所以可以使用父类引用调用到此方法.
                         */
                        @Override
                        void fun() {
                                System.out.println("子类重写fun()方法");
                        }

                        /**
                         * 此方法是只属于子类的方法,根据多态原理,
                         *
                         * 用父类引用是调用不到此只属于子类的方法的,但是写出来也不会报错,运行时也不会出错.
                         */
                        @SuppressWarnings("unused")
                        public void print() {
                                System.out.println("子类自己的方法");
                        }
                };

                // 调用tools对象的fun()方法
                tools.fun();
        }
}

class Tools {

        public Tools(String name) {
                System.out.println(name);
        }

        void fun() {
                System.out.println("fun");
        }

}

你要还看不懂,我也没办法了.
现在教你如何写同名构造方法
回复 使用道具 举报
马镱洵 发表于 2012-9-3 14:29
问题就是匿名内部类,没有类名,如何写其同名构造函数,如何初始化。

有一点你必须要弄清楚,要实例化一个 ...

哥们码字辛苦了,可是你说的这些我之前就懂,呵呵,辛苦。并且,你所说的这些观点,部分我不赞同:

1、据我所知,匿名内部类是可以写自己的构造方法的,这也是我一个朋友给我出这道题考我的原因,他说android开发中,这个用处广泛。

2、只属于子类的方法,匿名对象可以自己调用,题目中代码已经表明了。我不需要------为了调用子类的某个方法,去父类中建立子类重载此方法的基础。

我的题目问题是如何初始化匿名内部类,并且,请不要修改我的题目代码。我的fun函数属于匿名子类,不属于父类Tools,谢谢!或者我应该再让题目中代码瘦弱些。

回复 使用道具 举报
寇龙飞 发表于 2012-9-3 14:11
一个类的定义放在另一个类的内部,这个类就叫做内部类。并且这个类没有名字,称其为匿名内部类。

1.你定 ...

"一个类的定义放在另一个类的内部,这个类就叫做内部类。并且这个类没有名字,称其为匿名内部类。
1.你定义了一个内部类,但非匿名。"

你是在搞笑吗.
普通内部类是定义在另一个类的内部,这没错.匿名内部类没有名字,这也没错.
我定义的就是匿名内部类(也就是Tools类的子类),那个tools引用可不是内部类的名字,而是Tools类(也就是匿名内部类的父类)的引用,这是父类引用指向子类对象好不好,结果你居然认为tools是匿名类的名字,我还能说什么呢,只能说明你内心很强大,再不懂的情况下,也敢乱下定义,确实很佩服阁下.



"2.我题目问,匿名内部类如何初始化。"
  1. Tools tools = new Tools("你现在看到的是子类对象的构造方法,也就是你想要的匿名类对象.") {
  2.                         /**
  3.                          * 此方法是重写的父类的方法,所以可以使用父类引用调用到此方法.
  4.                          */
  5.                         @Override
  6.                         void fun() {
  7.                                 System.out.println("子类重写fun()方法");
  8.                         }

  9.                         /**
  10.                          * 此方法是只属于子类的方法,根据多态原理,
  11.                          *
  12.                          * 用父类引用是调用不到此只属于子类的方法的,但是写出来也不会报错,运行时也不会出错.
  13.                          */
  14.                         @SuppressWarnings("unused")
  15.                         public void print() {
  16.                                 System.out.println("子类自己的方法");
  17.                         }
  18.                 };
复制代码
这就是初始化匿名内部类对象的代码.你如果不像这个匿名内部类有父类的引用指向它,那么你也可以:

点评

我说都是是乱说下我的认识,你都说让我摆正心态了,我内心还能有多强大,岂敢下定义呀。呵呵。 好吧,我这个新手不是来学java,我是来搞笑的。  发表于 2012-9-3 15:00
回复 使用道具 举报
马镱洵 发表于 2012-9-3 14:49
"一个类的定义放在另一个类的内部,这个类就叫做内部类。并且这个类没有名字,称其为匿名内部类。
1.你定 ...
  1. new Tools("你现在看到的是子类对象的构造方法,也就是你想要的匿名类对象.") {
  2.                         /**
  3.                          * 此方法是重写的父类的方法,所以可以使用父类引用调用到此方法.
  4.                          */
  5.                         @Override
  6.                         void fun() {
  7.                                 System.out.println("子类重写fun()方法");
  8.                         }

  9.                         /**
  10.                          * 此方法是只属于子类的方法,根据多态原理,
  11.                          *
  12.                          * 用父类引用是调用不到此只属于子类的方法的,但是写出来也不会报错,运行时也不会出错.
  13.                          */
  14.                         @SuppressWarnings("unused")
  15.                         public void print() {
  16.                                 System.out.println("子类自己的方法");
  17.                         }
  18.                 };
复制代码
回复 使用道具 举报
寇龙飞 发表于 2012-9-3 14:46
哥们码字辛苦了,可是你说的这些我之前就懂,呵呵,辛苦。并且,你所说的这些观点,部分我不赞同:

1、 ...

"1、据我所知,匿名内部类是可以写自己的构造方法的,这也是我一个朋友给我出这道题考我的原因,他说android开发中,这个用处广泛"

我不想多说,很简单,你何不一试?



"我的题目问题是如何初始化匿名内部类,并且,请不要修改我的题目代码。我的fun函数属于匿名子类,不属于父类Tools,谢谢!或者我应该再让题目中代码瘦弱些。"

你的fun()方法是属于匿名类的方法,我之所以在父类里也定义一个fun()方法,是为了方便给你演示不同的情况应该这么处理.我也给你的匿名类里定义了一个只属于子类的print()方法啊.哎呀,对不起,我知道我错了,我不应该在你的父类中定义fun()方法,而应该把print()方法定义在你的父类中,这样你就不会这样说了,是吧.

点评

没关系,没有什么对不起的,您言重了,咱都是来学java,学知识的,在黑马,咱都是同学关系。我还要感谢你对我这个问题的关注与支持呢。  发表于 2012-9-3 15:08
因为改了我的题目,我要问的和你答的会有偏差,我的问题解决不了,你答的也纠结。 匿名内部类的自己的构造方法见下条回复。  发表于 2012-9-3 15:06
回复 使用道具 举报
寇龙飞 发表于 2012-9-3 14:46
哥们码字辛苦了,可是你说的这些我之前就懂,呵呵,辛苦。并且,你所说的这些观点,部分我不赞同:

1、 ...

public class Init {

        public static void main(String[] args) {
                /**
                 * 好吧,要简单点是吧,这样够简单了吧.
                 *
                 * 以下就是初始化匿名类的代码,连父类引用都省了,这是你想要的代码吧.
                 */
                new Tools() {
                        void fun() {

                        }
                };
        }

}

class Tools {

}
回复 使用道具 举报
寇龙飞 发表于 2012-9-3 14:46
哥们码字辛苦了,可是你说的这些我之前就懂,呵呵,辛苦。并且,你所说的这些观点,部分我不赞同:

1、 ...

"因为改了我的题目,我要问的和你答的会有偏差,我的问题解决不了,你答的也纠结。 匿名内部类的自己的构造方法见下条回复。"

其实我回答你的都是匿名内部类的知识原理,你把原理弄懂了,还怕做不了题吗.好吧,下次我授鱼就是了,授渔看来不是明智的做法.

点评

别,还得分情况,就事论事。我这题目的问题不是匿名内部类原理方面,而是在匿名内部类基础上的初始化问题,你讲类构造函数原理,我求之不得。  发表于 2012-9-3 15:20
回复 使用道具 举报
本帖最后由 寇龙飞 于 2012-9-3 15:16 编辑
马镱洵 发表于 2012-9-3 14:59
"1、据我所知,匿名内部类是可以写自己的构造方法的,这也是我一个朋友给我出这道题考我的原因,他说andr ...
  1. package com.itheima.test;

  2. public class Init {

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

  4.                
  5.                 new Tools() {
  6.                         /*构造代码块*/
  7.                         {
  8.                                 System.out.println("匿名内部类的无参初始化");
  9.                         }
  10.                 };
  11.         }
  12. }

  13. class Tools {}
复制代码
回复 使用道具 举报
寇龙飞 发表于 2012-9-3 15:15

你很幽默啊,刚刚你明明说的是构造方法,现在变构造代码块了.
回复 使用道具 举报
寇龙飞 发表于 2012-9-3 15:15

我刚刚可说的是,匿名内部类不能写自己的构造方法,可没有说不可以写构造代码块.你不要忘了,你自己在前面问的是:
"1、据我所知,匿名内部类是可以写自己的构造方法的,这也是我一个朋友给我出这道题考我的原因,他说android开发中,这个用处广泛"

这可是你问的.你说的很清楚,你认为匿名内部类是可以写自己的构造方法.结果你现在却用构造代码块来说事儿,我还能说啥呢.

点评

我只看了老毕的视频,以为二者有关联。  发表于 2012-9-3 15:48
回复 使用道具 举报
关于匿名内部类如何初始化的问题,请见12楼.
回复 使用道具 举报
寇龙飞 发表于 2012-9-3 15:15

"别,还得分情况,就事论事。我这题目的问题不是匿名内部类原理方面,而是在匿名内部类基础上的初始化问题,你讲类构造函数原理,我求之不得。"

不是我想这样啰嗦啊,是我想要技术分啊.
回答问题不是有要求么,不仅要有详细代码,还要有详细解释,才有机会加分,都是为了技术分而奋斗啊,见谅哈.

点评

没事。我也是为了分。我讨论技术都问周围几个做安卓的朋友。  发表于 2012-9-3 15:50
回复 使用道具 举报
回复 使用道具 举报
马镱洵 发表于 2012-9-3 15:31
"别,还得分情况,就事论事。我这题目的问题不是匿名内部类原理方面,而是在匿名内部类基础上的初始化问 ...

给你个链接,看我另外一个问题。


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