1.内部类概念:将一个类定义在另一个类的内部,该类就称为内部类
类中定义的内部类特点
1) 内部类作为外部类的成员,可以直接访问外部类的成员
(包括 private 成员),反之则不行。
2) 内部类做为外部类成员,可声明为 private、默认、protected
或 public。
3) 内部类成员只有在内部类的范围之内是有效的。
4) 用内部类定义在外部类中不可访问的属性。这样就在外部
类中实现了比外部类的 private 还要小的访问权限。
1 public class Face { //脸 2 private String shape="瓜子脸";//私有属性 3 4 public class Nose{//鼻子 5 private String shape="高鼻梁"; 6 public void breath(){ 7 //当内部类与外部类有相同的属性时,在访问外部类的属性时,需要加上外部类的 类名.this.属性 8 System.out.println("鼻子长在了"+Face.this.shape+"形状的脸上"); 9 System.out.println(shape); 10 System.out.println("有使用鼻子呼吸!"); 11 } 12 } 13 }
内部类的优缺点:
优点:内部类可以直接访问外部类的私有属性
缺点:破坏了类的结构
2.内部类分类
1) 成员内部类
内部类相当于外部类的成员
2) 静态内部类
1 public class Outer { 2 private static String name="张三"; 3 /**静态内部类 ,(1)不允许访问外部类的非static属性 4 * (2)如果内部类中的方法为static方法,那么内部类也必须为静态的*/ 5 static class Inner{ 6 public void show(){ 7 System.out.println(name); 8 } 9 } 10 static class Inner2{ 11 public static void show(){ 12 13 } 14 } 15 }
1 public class TestStaticInner { 2 public static void main(String[] args) { 3 //创建内部类的对象 new 外部类类名.内部类类名(); 4 Outer.Inner i=new Outer.Inner(); 5 i.show(); 6 7 //访问的是静态内部类中的静态方法 8 Outer.Inner2.show(); 9 } 10 }
3) 方法中的内部类
只能在方法中使用,相当于方法中的局部变量
1 public class Outer { 2 //Outer的成员方法 3 public void show(){ 4 int a=10;//方法中的局部变量 5 //内部类相当于show方法中的局部变量,使用范围只能在show方法中 6 class Inner{ 7 public void fun(){ 8 System.out.println("a="+a); 9 } 10 } 11 //创建内部类的对象 12 new Inner().fun(); 13 } 14 }
4) 匿名内部类 (存在继承或实现关系)
a) 可以实现一个接口,或者继承一个父类
b) 只能实现一个接口
c) 适合创建那种只需要一次使用的类,不能重复使用。
比较常见的是在图形界面编程 GUI 里用得到。
1 public abstract class Father {//父类 2 public abstract void dream();//伟 大的梦想 3 } 4 class Son extends Father{ //子类是有名称的,子类的名称叫son 5 6 @Override 7 public void dream() { 8 9 } 10 11 } 12 class Test{ 13 public static void main(String[] args) { 14 //父类引用指向子类对象 15 Father f=new Son(); //在名字的子类 16 /**没有名字的子类*/ 17 Father f2=new Father() 18 { //没有名称的类 19 @Override 20 public void dream() { 21 System.out.println("努力实现父亲的伟 大梦想,当兵光荣"); 22 } 23 }; 24 f2.dream(); 25 } 26 }