java面对对象(六)--内部类、匿名内部类

内部类

可以在一个类的内部定义另一个类这种类成为内部类或嵌套类,比如:

 1 class Outer{
 2  3     class Inner{
 4         ….
 5     }
 6 }
 7 class Outer1{}       // 这个Inner1不是Outer1的内部类,不在Outer1的类体括号内
 8     class Innter1{
 9     ……
10     }
11 Class Outer2{      //Inner2虽然是在Outer2的方法内,但还是在Outer2的类体括号内,是内部类
12     ……
13     public void test(){
14         class Inner2{
15         ….
16         }
17     }
18 }

内部类有什么问题和好处:

  • 问题:外部类不使用或不创建外部类对象,就不能直接创建内部类对象
  • 好处:外部类的私有属性,内部类可使用,而且不破坏封装,这也是为什么内部类存在的重要原因


内部类的特性

  • 内部类的特征与变量概念特性很相似
  • 内部类的位置与变量位置相似
  • 变量可分为实例变量(成员变量),局部变量,静态变量
  • 内部类与变量相似,也可分为四种


内部类的分类
静态内部类,成员内部类,局部内部类,匿名内部类

成员内部类

1.使用成员内部类就象使用成员变量一样,在本类的主方法中则直接使用成员内部类,不用加上外部类的名字来访问。但在其他类的主方法中要使用成员内部类则就需要使用外部类.内部类来访问。
2.使用外部类名来访问内部类还因为一个内部类可能有不同的外部类
3.创建一个成员内部类对象必须先创建外部类的对象,因为成员内部类要访问外部类的成员
4.成员内部类可以访问外部类的所有属性
5.成员内部类中不能定义有静态属性
6.当外部类的成员与内部类成员,内部类中局部变量同名时,则使用三种不同方式访问

  • 直接使用变量名则访问局部变量
  •  使用this.变量名则访问内部类的成员
  • 使用外部类名.this.变量名则访问外部类的成员

静态内部类

  • 在成员位置上定义为static的内部类,称为静态内部类
  • 静态内部类类似于静态变量,修饰静态变量的修饰符也可以修饰静态内部类
  • 静态内部类与静态方法,静态属性相似,访问静态方法,静态属性用类名.属性名/方法名访问,但是在本类中可不用类名.来访问。静态内部类也一样,在本类方法中访问则不用加上外部类名来访问,若在其他类的方法中则要加外部类名.内部类名来访问。
  • 静态内部类中只能访问外部类的静态成员和本内部类的成员
  • 静态内部类中不能访问外部类的非静态成员

匿名内部类

1.匿名内部类是一种特殊的局部内部类,局部内部类可以转化为匿名内部类
2.局部内部类要转化为匿名内部类必须具备3个条件

  • 首先是一个局部内部类,也是一个私有的内部类
  • 该局部内部类实现一个接口或继承一个父类
  • 局部内部类只new一次创建一个对象

3.匿名内部类就是无显式地声明某个类名来实现接口,而直接实现接口的方法的类

4.匿名内部类不能定义构造方法,因为匿名内部类是一个特殊局部内部类,它没有类名。

5.匿名内部类可以访问外部类的局部变量,但也要求外部类的局部变量是final型的才能访问

6.匿名内部类可以访问外部类的属性

7.匿名内部类可以在一个类的方法中创建,同样可以在一个类的主方法中实现。

8.当继承的父类中抽象方法与实现的接口中方法同名,同参数列表,同返回类型,则子类只写一个方法实现就可以了

9.当继承的父类中抽象方法与实现的接口中的方法同名,但返回类型不同,则子类就必须写出每个方法,但这样的方法集同名,返回类型不一样则认为是同一方法,又不能构成重载,则就会编译出错

原文地址:https://www.cnblogs.com/AloneZ/p/java7.html