Java提高-内部类

内部类是指在一个外部类的内部再定义一个类。类名不需要和文件夹相同。
*内部类可以是静态static的,也可用public,default,protected和private修饰。(而外部顶级类即类名和文件名相同的只能使用public和default)。
 
注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现outer.class和outer$inner.class两类。所以内部类的成员变量/方法名可以和外部类的相同。

 

一、成员内部类

   成员内部类,就是作为外部类的成员,可以直接使用外部类的所有成员和方法,即使是private的。同时外部类要访问内部类的所有成员变量/方法,则需要通过内部类的对象来获取。
      要注意的是,成员内部类不能含有static的变量和方法。因为成员内部类需要先创建了外部类,才能创建它自己的,了解这一点,就可以明白更多事情,在此省略更多的细节了。
      在成员内部类要引用外部类对象时,使用outer.this来表示外部类对象;
      而需要创建内部类对象,可以使用outer.inner  obj = outerobj.new inner();
 1 public class Outer { 
 2     public static void main(String[] args) { 
 3         Outer outer = new Outer(); 
 4         //第一种调用方法,new 实例化
 5         Outer.Inner inner = outer.new Inner(); 
 6         inner.print("Outer.new"); 
 7         //第二种方法:getter()方法
 8         inner = outer.getInner(); 
 9         inner.print("Outer.get"); 
10     } 
11  
12     // 个人推荐使用getxxx()来获取成员内部类,尤其是该内部类的构造函数无参数时 
13     public Inner getInner() { 
14         return new Inner(); 
15     } 
16  
17     public class Inner { 
18         public void print(String str) { 
19             System.out.println(str); 
20         } 
21     } 
22 }      

 

 

二、方法内部类(局部内部类)

  方法内部类,是指内部类定义在方法和作用域内。

  *方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内可以使用。

  *方法内部类使用时,在方法中创建内部类对象,用对象调用其内部类中的方法。

  注:由于方法内部类不能在外部类的方法以外的地方使用呢,因此方法内部类不能使用访问控制符合 static 修饰符

  Test类:

 1 package methodinner;
 2 
 3 public class Test {
 4     //定义在方法里面
 5     public void driver(){
 6         System.out.println("我在开车");
 7         
 8         class B extends DuanZanShiChangZheng {}//定义方法内部类,继承DuanZanShiChangZheng(),ps不一定要继承父类类
 9         new B().noProblem();//调用方法内部类的noProblem方法
10 //        System.out.println("撞到人了");//变成没事
11         System.out.println("一切恢复正常");
12     }
13     
14     public void show(){
15         
16     }
17     
18     public static void main(String[] args) {
19         new Test().driver();
20     }
21 }

  DuanZanShiChangZheng类:

  

1 package methodinner;
2 
3 public class DuanZanShiChangZheng {
4     public void noProblem(){
5         System.out.println("我有短暂精神病,杀人也没事");//变成没事
6     }
7 }

运行结果:

  

 

 

 方法内部类也像别的类一样进行编译,但只是作用域不同而已,只在该方法或条件的作用域内才能使用,退出这些作用域后无法引用的。

 

三、匿名内部类

匿名内部类也就是没有名字的内部类

正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写

但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口

匿名内部类是不能加访问修饰符的。要注意的是,new 匿名类,这个类是要先定义的

我们可以通过下面这个栗子,能够明白。

 

QinShou接口:
1 package memberinner2;
2 
3 public interface QinShou {
4     
5     public abstract void workInght();
6 }

Doctor类:

1 package memberinner2;
2 
3 public abstract class Doctor implements QinShou{
4     
5     public void workInDay() {
6         System.out.println("白天教授理论知识");
7     }
8     
9 }

 

 Test类:

 

 1 package memberinner2;
 2 
 3 public class Test {
 4     public static void main(String[] args) {
 5         Doctor d1 = new Doctor1() ;
 6         d1.workInDay();
 7         d1.workInght();
 8         Doctor d2 = new Doctor2() ;
 9         d2.workInDay();
10         d2.workInght();
11         //匿名内部类
12         //new 一个抽象类或者接口
13         //后加{},实现里面的方法
14         Doctor d3 = new Doctor() {
15             
16             public void workInght() {
17                 System.out.println("嗨起来");
18                 
19             }
20         };
21         d3.workInDay();
22         d3.workInght();
23         
24     }
25 }

 

 运行结果:

在使用匿名内部类的过程中,我们需要注意如下几点:

      1、使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。

      2、匿名内部类中是不能定义构造函数的。

      3、匿名内部类中不能存在任何的静态成员变量和静态方法。

      4、匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。

      5、匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。

 

以上就是我对内部类的理解和例子。。。

 

posted @ 2016-11-16 13:53  小白萌新  阅读(169)  评论(0编辑  收藏  举报