一、内部类定义
内部类(nested classes),面向对象程序设计中,可以在一个类的内部定义另一个类。嵌套类分为两种,即静态嵌套类和非静态嵌套类。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。内部类是JAVA语言的主要附加部分。内部类几乎可以处于一个类内部任何位置,可以与实例变量处于同一级,或处于方法之内,甚至是一个表达式的一部分。
内部类是JAVA语言的主要附加部分。嵌套类从JDK1.1开始引入。其中inner类又可分为4种():
1、在一个类(外部类)中直接定义的内部类;
2、在一个方法(外部类的方法)中定义的内部类;
3、匿名内部类。
4、还需要注意加有static关键词的静态内部类
1.成员内部类
1 2 3 public class Test1 { 4 private String member="这是外部类变量"; 5 //成员内部类 6 //不对外开放,高内聚 7 class B{ 8 public B() {//当内部类的构造器为Protected、private修饰时外部类外不可以访问 9 10 } 11 public void go(){ 12 System.out.println("这是内部类B的go方法"+Test1.this.member);//内部类访问外部类变量 13 } 14 } 15 16 17 //可供成员的外部类中其他方法调用 18 public B show(){ 19 20 return this.new B();//外部类调用 21 22 } 23 24 public static void main(String[] args) { 25 26 B b = new Test1().show(); 27 } 28 29 } 30 31 32 package memberiner; 33 34 public class A { 35 36 public static void main(String[] args) { 37 38 new Test1().show(); 39 40 (new Test1()).new B().go();//外部类外访问内部类 41 } 42 43 }
2.局部内部类
1 2 3 public class Test { 4 5 class Duanzanshichangzheng { 6 7 public void noProblem() { 8 System.out.println("患有急性短暂失常症,开车撞死人没事"); 9 10 } 11 12 } 13 14 private String member ="全局变量"; 15 final int n=4; 16 public void driver(){ 17 final String member2 ="局部变量";//方法内的变量只有final变量才能被方法内部类访问 18 System.out.println("我正在开车"+member); 19 20 //每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现, 21 //对于内部类都没有影响 22 //内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效地实现了“多重继承” 23 //短暂,不对外,防止变成全局 24 class B extends Duanzanshichangzheng { 25 public void show(){ 26 System.out.println(member2+4); 27 } 28 } 29 new B().noProblem();//方法内部类里的方法只能在方法里调用 30 new B().show(); 31 32 System.out.println("一切恢复正常"); 33 34 } 35 36 public static void main(String[] args) { 37 new Test().driver(); 38 } 39 40 }
3.静态内部类
即添加了static关键词的内部类。和外包类平级,与普通类无异,此处不做讲述
4.匿名内部类
interface MyInterface{
void showMI();
}
class FatherClass{
void showFC(){
System.out.println("FatherClass的方法!");
}
}
public class TestAnonymityClass{
public static void main(String[] args){
FatherClass f=new FatherClass(){
void showFC(){
System.out.println("匿名类重写父类FatherClass的方法!");
}
};
f.showFC();
MyInterface m=new MyInterface(){
public void showMI(){
System.out.println("匿名类实现接口MyInterface的方法!");
}
};
m.showMI();
}
}