黑马程序员技术交流社区

标题: 又是关闭内部类的问题 [打印本页]

作者: 乔玉吉    时间: 2012-7-16 15:10
标题: 又是关闭内部类的问题
本帖最后由 乔玉吉 于 2012-7-16 15:16 编辑
  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.Comparator;
  4. import java.util.LinkedHashMap;
  5. import java.util.Map;
  6. import java.util.Set;
  7. import java.util.TreeMap;



  8. public class TreeMapSort {

  9.         /**
  10.          * 对TreeMap集合进行值排序,为什么new一个成员方法上的内部类会出错 而new一个匿名内部类和单独外部类而不出错
  11.          */
  12.         public static void main(String[] args) {
  13.                 // TODO Auto-generated method stub
  14.                 TreeMap<String, Integer> treeMap = new TreeMap<String, Integer>();
  15.                 treeMap.put("zhangsan", 28);
  16.                 treeMap.put("lisi", 18);
  17.                 treeMap.put("wangwu", 18);
  18.                 treeMap.put("wuxiao",9);

  19.                 Set<Map.Entry<String, Integer>> entrySet = treeMap.entrySet();
  20.                 ArrayList<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String,Integer>>(treeMap.size());
  21.                 list.addAll(entrySet);
  22.                 Collections.sort(list,new myCompartor());//就这就编译报错,只不过new了一个成语方法上的内部类 ,new匿名内部类它就不报错,凭什么?
  23.                
  24.                 //匿名内部类
  25.                 /*Collections.sort(list,new Comparator<Map.Entry<String, Integer>>(){

  26.                         @Override
  27.                         public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
  28.                                 // TODO Auto-generated method stub
  29.                                 return o1.getValue().compareTo(o2.getValue());
  30.                         }               
  31.                 });*/
  32.                 Map<String, Integer> sortMap = new LinkedHashMap<String, Integer>();
  33.                 for(Map.Entry<String, Integer> entry:list){
  34.                         sortMap.put(entry.getKey(),entry.getValue());
  35.                 }
  36.                 Set<String> nameSet = sortMap.keySet();
  37.                 for(String name:nameSet){
  38.                         System.out.println(name+":"+sortMap.get(name));
  39.                 }
  40.         }
  41.         //成员上的内部类
  42.         private final class myCompartor implements Comparator<Map.Entry<String, Integer>>{

  43.                 @Override
  44.                 public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
  45.                         // TODO Auto-generated method stub
  46.                         return o1.getValue().compareTo(o2.getValue());
  47.                 }               
  48.         }
  49. }

  50. //外部类
  51. /*class myCompartor implements Comparator<Map.Entry<String, Integer>>{

  52.         @Override
  53.         public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
  54.                 // TODO Auto-generated method stub
  55.                 return o1.getValue().compareTo(o2.getValue());
  56.         }               
  57. }*/
复制代码

作者: 黑马-王言龙    时间: 2012-7-16 16:55
本帖最后由 黑马-王言龙 于 2012-7-16 16:56 编辑

外部类要访问内部类的成员必须要建立内部类对象,创建格式:外部类对象.内部对象
可以这样:
Collections.sort(list, new TreeMapSort().new myCompartor());
作者: 鲍霄霄    时间: 2012-7-16 17:14
匿名内部类可以减少你命名一个类的烦脑(^^)

其有很多优点
比如可以访问外部类的私有方法

new   YourClass{
...
}

这个例子是一个多线程的小程序,这里面就应用到了匿名内部类,实现了Runnable接口。
匿名内部类的一般好处是:是代码更加简洁,紧凑,但带来的是易读性下降。他一般用在GUI编程中
实现事件处理等等。希望大家一起讨论

public   class   RunnableTest{
public   static   void   main(String[]   args){
MyThread1   mt1   =   new   MyThread1();
MyThread2   mt2   =   new   MyThread2();
MyThread3   mt3   =   new   MyThread3();
mt2.th.start();
mt1.th.start();
mt3.th.start();
}
}

class   MyThread1   implements   Runnable{
Thread   th   =   new   Thread(this);
public   void   run(){
for   (int   i   =   0;   i   <   10;   i++){
System.out.println("BMW"   +   i);
}
}
}

class   MyThread2{
Thread   th   =   new   Thread(){
public   void   run(){
for   (int   i   =   0;   i   <   10;   i++){
System.out.println(i);
}
}
};
}
class   MyThread3{
Runnable   ra   =   new   Runnable(){
public   void   run(){
for   (char   ch   =   65;   ch   <   70;   ch++){
System.out.println(ch);
}
}
};
Thread   th   =   new   Thread(ra);
}

匿名内部类可以访问外部类的私有成员,其他的方式实现接口和继承类做不到
实现方式:
SuperType   aa   =   new   SuperType(construction   parameters){methods   and   data}

InterfaceType   aa   =   new   InterfaceType(){methods   and   data}
具体实现时需要把SuperType   和InterfaceType   换成具体的超类和接口。
匿名内部类可以访问外部类的私有成员,其他的方式实现接口和继承类做不到

内部类应该都可以的。
我觉得匿名的应该是隐藏实现,而且用完就out的那种。
这个是关闭内部类的代码:
Button close=new Button("close");
close.addActionListener(this);
close.setActionCommand("close");
作者: 乔玉吉    时间: 2012-7-16 18:12
楼上的回答不是我所需要的答案 请仔细看我的问题并拿到myEclips上测试  随便回答也给分 我真服了

内部类的好处是有的 但是当程序代码很多的时候 用太多的内部类会使代码的阅读性大大降低,黎活明老师在将android中就提到过

我的问题是 27行编译器为什么报错,27行调用了成员方法上的内部类(48~55行),我不知道错在哪里。而当有用匿名内部类的时候(30~45)而不会提示
错误,功能都是一样的。还有用外部类new对象也不会报错。我的意思是匿名内部类和调用成员方法上的内部功能上是一样的,几乎没什么区别,错再哪里?希望高人给个正确的回答。别为了赚分乱回答


作者: 乔玉吉    时间: 2012-7-16 18:37
找到原因了 在48行private上加 static 因为main方法是static的,访问的成员上的内部类,成员上的内部类也必须用static修饰
一句话就是 类中的静态方法不能访问非静态的成员




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