黑马程序员技术交流社区

标题: 内部类的用法? [打印本页]

作者: zhangx    时间: 2013-4-14 09:22
标题: 内部类的用法?
匿名内部类能不能继承其它的类和实现接口啊?
作者: ①人←①城市    时间: 2013-4-14 09:33
本帖最后由 ①人←①城市 于 2013-4-14 09:36 编辑

匿名内部类在实现时必须借助一个类或一个接口,若从这个层次上讲它是可以继承其他类也可以实现接口的,
但若是通过extends或implements关键字那是不可能的

作者: 王洪宇    时间: 2013-4-14 09:43
本帖最后由 王洪宇 于 2013-4-14 09:45 编辑

匿名内部类本身已经实现了一个接口或父类。
正常实现方法:
一。新建类A继承类B,并重写run()方法
class A extends B{
  @override
public void run(){
   //方法体
}
}
二。新建类A实现接口C,并重写run()方法
class A implements C{
  @Override
public void run(){
   //方法体
}
}
匿名内部类方式:
一.新建一个匿名内部类的实例(new出来的是实例),继承类B,重写run()方法
new B(){
  @Override
public void run(){
   //方法体
}
}
二.新建一个匿名内部类的实例,实现接口c,并重写run()方法
new C(){
   @Override
public void run(){
   //方法体
}
}
作者: 周一川    时间: 2013-4-14 10:02
可以继承其他类或实现其他接口。不仅是可以,而是必须!


作者: 李程    时间: 2013-4-14 11:04


匿名内部类
1,匿名内部类其实就是内部类的简写格式。
2,定义匿名内部类的前提:
        内部类必须是继承一个类或者实现接口
3,匿名内部类的格式:new 父类或者接口(){定义子类的内容}
4,其实,匿名内部类就是一个匿名子类对象,即把定义子类和其对象一步完成。
例如,上代码:
new AbsDemo()
{
        void show()
        {
                System.out.println(x)
        }
}


5,匿名内部类中定义的方法最好不要超过2个,否则阅读性很差,这个时候就不要用匿名了     
6,使用匿名内部类的情况:例如一个类要实现一个接口,然后用这个类的对象作为一个函数的参数的时候,这时候观察我需要实现的功能不超过两个,就可以直接在参数位置定义一个匿名内部类。

作者: zhuiyi0819    时间: 2013-4-14 11:09
匿名内部类必须指定父类或者指定实现的接口
new 父类或接口(){}
必须指定父类或者实现的接口。
匿名内部类与正常类不一样,它只能指定一个要继承的类或者是指定一个要实现的接口。两者不能兼得!
实现接口,也只能实现1个。要实现接口,就不能指定父类!


作者: 乘鱼飞    时间: 2013-4-14 11:37
本帖最后由 乘鱼飞 于 2013-4-14 11:42 编辑

内部类的上一级是类(外部类),所以可以用static修饰(静态内部类)。
内部类可以直接访问外部类的成员,包括private修饰的成员。
非静态内部类,在外部类外创建实例时,必须先创建外部类的实例,然后用外部类.new 非静态内部类();
举例说明:http://blog.sina.com.cn/u/2742093933
匿名内部类:刚学完集合里面的定制排序就用了匿名内部类
如:TreeSet<Students>  set=new TreeSet<Students>(new Comparator<Students>(){         
               public int compare(Students s1,Students s2){
                                if(s1.getScore()>s2.getScore())
                                {
                                        return -1;
                                }
                                else if(s1.getScore()<s2.getScore())
                                {
                                        return 1;
                                }else
                                {return 0;}
                        }
                });//匿名内部类
                set.add(new Students("zhangsan",69.5));
                set.add(new Students("lisi",78.9));

作者: 花伟昌    时间: 2013-4-14 12:42
匿名内部类的前提:内部类必须继承一个父类,或实现一个接口。
匿名内部类的格式:new 父类或接口(){ };

匿名内部类是内部类的简写格式。
class DemoA{
        public String name;
        public int age;
        public void set(String name,int age){
                this.name=name;
                this.age=age;
               
        }
        public int getAge(){
                return this.age;
        }
        public String getName(){
                return this.name;
        }
       
}

class DemoB{
       
         /*  class DemoC extends DemoA{//创建一个内部类,继承一个父类
                          
           }
          
          
           public void show(){
                   DemoC b=new DemoC();
                   b.set("李四",22);
                   System.out.println(b.getAge());
                   System.out.println(b.getName());
          
           }*/
                  
        //将注释的内容用匿名内部类的形式表现。
                public void show(){   
                       
                DemoA demoa=new DemoA(){         
               
                       
                };         
                demoa.set("李四",22);
                System.out.println(demoa.getAge());
                System.out.println(demoa.getName());
               
                
          
                 }
       
}
       

public class Demo{
        public static void main(String []args){
                 new DemoB().show();
        }
}

作者: 〃Mr.Zぐ    时间: 2013-4-14 15:50
内部类的用法几乎等同于一般类,只是使用外部类变量的时候需要将外部类变量设置为final.因为内部类使用外部变量时,仅仅使用的是他的一个副本,所以说,即便内部类使用的变量更改了,在外部类中也不会有变化,这也是sun为了提醒程序员的一种方法...
同样的,匿名内部类也可以继承或实现一类或方法,用法为:
JButton btn = new JButton("click");
btn.addActionListener(new ActionListener()
{
    public void actionPerformed(ActionEvent e){//some mothod...}
});
内部类除了实现一个接口也可以继承一个类,语法都是同上述的"new ActionListener()",(你也可以去继承一个适配器类,为了万无一失,我刚还专门测试了一下)
之所以swing用的内部类比较多,是因为他需要用到注册监听器机制,而该监听类如果只服务于一个组件,那么,将该类设置成内部类/匿名类是最方便的.




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