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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 编程的梦想 中级黑马   /  2013-11-5 11:26  /  1455 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

//匿名内部类:
interface Inter{
        void show(int a,int b);
        void func();
}
class test {
        public static void main(String args[]){
                Inter it=new Inter(){   //不是说接口不能直接创建对象吗,这里可以直接用接口创建,而且test类上也不声明实现接口???
                                public void show(int a,int b){
                                        System.out.println( a+b);
                                }
                                public void func(){
                                        System.out.println("我实现了该方法");
                                }
                };
                it.func();
                it.show(5, 6);
                       
        }
       
}


评分

参与人数 1技术分 +1 收起 理由
特殊服务 + 1

查看全部评分

5 个回复

倒序浏览
你要明白 Inter it=new Inter(){ };是啥意思,再去看你写的代码,就OK了。
=左边Inter it是声明了Inter的一个引用,
=右边,本来我们创建对象应该是new 类名();对吧,显然这里不一样是吧,那么这就是一种规定了。
new Inter(){}便是Inter的子类对象,就是一种规范而已嘛。
=两遍都明白了,那你看左边接口引用,右边子类对象,不就是接口(父类)引用指向子类对象嘛,不就是多态嘛,好了,明白了吧~
new Inter(){}里面不是重写类接口两个方法了吗,你也应该看出一点点意思来~
希望多楼主有用~

评分

参与人数 1技术分 +1 收起 理由
特殊服务 + 1

查看全部评分

回复 使用道具 举报
对于匿名内部类,其实匿名内部类就是一个匿名子类对象。而且这个对象有点胖。可以理解为带内容的对象。 但匿凡看到匿名内部类,那是一个子类对象。
所以你的程序中:
new Inter()
{
        public void show(int a,int b)
        {
               System.out.println( a+b);
        }
        public void func()
        {
                System.out.println("我实现了该方法");
        }
}
这其实是以接口Inter为父类的子类对象,这种情况下匿名对象对方法只能调一次,但是你的内部类中有两个方法,如果都要调用的话,需要实现两次这样的代码
代码量就会很大,所以因为多态的存在,通过内部类的父类Inter在栈内存中创建一个子类对象指向堆内存中的内部类空间,Inter it = new Inter()从而可以同时
调用子类的两个方法。
it.func();
it.show(5, 6);
通过父类创建一个变量指向子类对象,使子类完成了实例化,并调用其方法,所以程序中的it并不是父类Inter对象,因为it不是接口Inter的实例化。Inter肯定也是
无法实例化的。只能通过子类来实例化。

另外如果test类上也声明实现接口则说明test也是Inter的子类了,你需要的是test类中的内部类的实例化,所以不能在test上声明此接口,又因为内部类的建立用的是接口
Inter的名称,意味着他会自动继承接口Inter,所以也不用声明接口了。

以上是个人理解,有不对的地方希望强烈批斗,大家共同进步~~~

评分

参与人数 1技术分 +1 收起 理由
特殊服务 + 1

查看全部评分

回复 使用道具 举报
匿名内部类也就是没有名字的内部类,正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写,但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口。而等号右边则是符合了前提条件:实现了一个接口,同时他也就成为了接口的子类对象,而等号左边其实是用来java面向对象编程的多态性。
而只有通过匿名内部类创建了接口的子类对象,才能调用其内部类中的方法。
不用声明接口的原因是内部类的建立用的是接口Inter的名称, 同时实现了该接口的全部方法,已经成为一个可以建立对象的类了

评分

参与人数 1技术分 +1 收起 理由
特殊服务 + 1

查看全部评分

回复 使用道具 举报
1.对接口是不能创建对象 因为是抽象类的一种特殊情况
2.           Inter it=new Inter(){   //不是说接口不能直接创建对象吗,这里可以直接用接口创建,而且test类上也不声明实现接口???
                                public void show(int a,int b){
                                        System.out.println( a+b);
                                }
                                public void func(){
                                        System.out.println("我实现了该方法");
                                }
                };

这段代码是 创建实现接口的类的实例 并使实例指向接口 (多态 接口与实现接口的类对象)

3.这是内部类实现的一种形式 就是这么规定的

评分

参与人数 1技术分 +1 收起 理由
特殊服务 + 1

查看全部评分

回复 使用道具 举报
接口可以定义对象,要想new 的话,必须是实现的该接口的实现类
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马