35、Java内部类

1、内部类(Inner Class),共分为4种:

      1)静态内部类(static inner class):只能访问外部类的静态成员变量与静态方法,生成静态内部类对象的方法:外部类.静态内部类 变量名 = new 外部类.静态内部类();outerClass.InnerClass inner = new OuterClass.InnerClass();

[java] view plain copy print ?
  1. class StaticInner 
  2.     private static int a =4
  3.      
  4.     public static class Inner 
  5.     { 
  6.         public void test() 
  7.         { 
  8.             System.out.println(a); 
  9.         } 
  10.     } 
  11. public class StaticInnerClass 
  12.     public static void main(String[] args) 
  13.     { 
  14.         StaticInner.Inner inner = new StaticInner.Inner(); 
  15.         inner.test(); 
  16.     } 


这里Inner就是静态内部类,private static int a =4;这里的a变量必须是static的,如果去掉将出错,(静态的只能访问静态的),生成的class文件如下:StaticInner$Inner.class、StaticInner.class、StaticInnerClass.class,内部类的class名字为外部类名字+“$”+ 内部类定义的名字

      2)成员内部类(member inner class):可以访问外部类的静态与非静态的方法与成员变量。生成成员内部类对象的方式为:

OuterClass.InnerClass inner = new OuterClass().new InnerClass();若想在成员内部类中访问外部类的成员变量,语法为:  OuterClass.this.a;

[java] view plain copy print ?
  1. class MemberInner 
  2.     private int a = 4
  3.     public class Inner2 
  4.     { 
  5.         private int a = 5
  6.         public void doSomething() 
  7.         { 
  8.             System.out.println(a);//当前对象的a,就是5 
  9.             System.out.println(this.a);//当前对象的a,就是5 
  10.             System.out.println(MemberInner.this.a);//外部类的变量a,是4 
  11.         } 
  12.     } 
  13.     public void method() 
  14.     { 
  15.         Inner2 inner = this.new Inner2();// 
  16.     } 
  17. public class MemberInnerClassTest 
  18.     public static void main(String[] args) 
  19.     { 
  20.         MemberInner.Inner2 inner = new MemberInner().new Inner2(); 
  21.         inner.doSomething(); 
  22.     } 


      3)局部内部类(Local Inner Class):定义在方法当中,只能访问方法中声明的finally类型的变量。

[java] view plain copy print ?
  1. class LocalInner 
  2.     public void doSomething() 
  3.     { 
  4.         final int a = 4;//只有定义成final类型的变量,局部内部类才能访问 
  5.         int b = 5
  6.         class Inner3 //局部内部类,只能访问final的局部变量 
  7.         { 
  8.             public void test() 
  9.             { 
  10.                 System.out.println("hello"); 
  11.                 System.out.println(a); 
  12.                 //System.out.println(b);这样写编译器报错 
  13.             } 
  14.         } 
  15.         new Inner3().test(); 
  16.     } 
  17. public class LocalInnerClass 
  18.     public static void main(String[] args) 
  19.     { 
  20.         LocalInner localInner = new LocalInner(); 
  21.         localInner.doSomething(); 
  22.     } 


    4)匿名内部类(Anonymous Inner Class),是局部内部类的一种,没有类名字,没有关键字class、extends、implements,没有constructors,但是,

匿名内部类会隐式的继承一个父类或实现一个接口

[java] view plain copy print ?
  1. import java.util.Date; 
  2.  
  3. public class AnonymousInnerClass 
  4.     @SuppressWarnings("deprecation"
  5.     public String get(Date date) 
  6.     { 
  7.         return date.toLocaleString(); 
  8.     } 
  9.     public static void main(String[] args) 
  10.     { 
  11.         AnonymousInnerClass test = new AnonymousInnerClass(); 
  12.         //String str = test.get(new Date()); 
  13.         //System.out.println(str); 
  14.          
  15.         String str = test.get(new Date(){});//注意这里的get方法 
  16.         //new Date(){}生成一个继承了Date的子类的一个对象。 
  17.         //new Date(){},其一说明定义了一个匿名内部类;其二这个匿名内部类继承了Date类, 
  18.         //             其三,他没有重写Date类的任何方法 
  19.         System.out.println(str); 
  20.          
  21.         String str1 = test.get(new Date() 
  22.         { 
  23.             public String toLocaleString() //匿名内部类重写了Date类的toLocaleString方法 
  24.             { 
  25.                 return "hello"
  26.             } 
  27.         }); 
  28.         System.out.println(str1); 
  29.     } 
  30.      


2、Swing使用匿名内部类的例子

[java] view plain copy print ?
  1. import java.awt.event.ActionEvent; 
  2. import java.awt.event.ActionListener; 
  3. import java.awt.event.WindowAdapter; 
  4. import java.awt.event.WindowEvent; 
  5.  
  6. import javax.swing.JButton; 
  7. import javax.swing.JFrame; 
  8.  
  9. public class SwingTest 
  10.     public static void main(String[] args) 
  11.     { 
  12.         JFrame frame = new JFrame("frame"); 
  13.         JButton button = new JButton("click me"); 
  14.         //button.addActionListener(new MyListener());正常写法 
  15.         button.addActionListener(new ActionListener(){ 
  16.             public void actionPerformed(ActionEvent e) 
  17.             { 
  18.                 System.out.println("hello"); 
  19.             } 
  20.         });//因为MyListener只有一个作用,所以可以使用匿名内部类,而取消MyListener 
  21.            //这时Swing大量使用的方式,也是匿名内部类的用处之一 
  22.         frame.setSize(200, 200); 
  23.         frame.getContentPane().add(button); 
  24.         frame.addWindowListener(new WindowAdapter() 
  25.         { 
  26.             @Override 
  27.             public void windowClosing(WindowEvent e) 
  28.             { 
  29.                 System.exit(0); 
  30.             } 
  31.         }); 
  32.         frame.setVisible(true); 
  33.     } 
  34. /*
  35. class MyListener implements ActionListener
  36. {
  37.     @Override
  38.     public void actionPerformed(ActionEvent e)
  39.     {
  40.         System.out.println("hello");
  41.     }
  42. }
  43. */ 

你可能感兴趣的:(java开发工具)