java内部类讲解-面向对象-Java基础学习(二十九)

一、定义

在Java中,允许一个类的定义位于另一个类的内部,前者称为内部类,后者称为外部类。

Inner class一般用在定义它的类或语句块之内,在外部引用它时必须给出完整的名称。

Inner class的名字不能与包含它的类名相同;

Inner class可以使用外部类的私有数据,因为它是外部类的成员,同一个类的成员之间可相互访问。而

外部类要访问内部类中的成员需要:内部类.成员或者内部类对象.成员。

二、共性

1.内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的

类名和$符号 。

2.内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成

员变量,无论是否是private的 。

3.内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成

员变量 。

三、分类

1.成员内部类

2.局部内部类

3.匿名内部类

4.静态内部类

四、举例说明

1.成员内部类

  1. public class Test {
  2.     public static void main(String[] args)  {
  3.         //第一种方式:
  4.         Outter outter = new Outter();
  5.         Outter.Inner inner = outter.new Inner();  //必须通过Outter对象来创建
  6.         //第二种方式:
  7.         Outter.Inner inner1 = outter.getInnerInstance();
  8.     }
  9. }
  10. class Outter {
  11.     private Inner inner = null;
  12.     public Outter() {
  13.     }
  14.     public Inner getInnerInstance() {
  15.         if(inner == null)
  16.             inner = new Inner();
  17.         return inner;
  18.     }
  19.     class Inner {
  20.         public Inner() {
  21.         }
  22.     }
  23. }

2.局部内部类

  1. class People{
  2.     public People() {
  3.     }
  4. }
  5. class Man{
  6.     public Man(){
  7.     }
  8.     public People getWoman(){
  9.         class Woman extends People{   //局部内部类
  10.             int age =0;
  11.         }
  12.         return new Woman();
  13.     }
  14. }

3.匿名内部类

  1. //A、继承式的匿名内部类
  2. public class Car {
  3. public void drive(){
  4. System.out.println("Driving a car!");
  5. }
  6. public static void main(String[] args) {
  7. Car car = new Car(){
  8. public void drive() {
  9. System.out.println("Driving another car!");
  10. }
  11. };
  12. car.drive();
  13. }
  14. }
  1. //B、接口式的匿名内部类。
  2. interface Vehicle {
  3. public void drive();
  4. }
  5. class Test{
  6. public static void main(String[] args) {
  7. Vehicle v = new Vehicle(){
  8. public void drive(){
  9. System.out.println("Driving a car!");
  10. }
  11. };
  12. v.drive();
  13. }
  14. }
  1. //C、参数式的匿名内部类。
  2. class Bar{
  3. void doStuff(Foo f){
  4. f.foo();
  5. }
  6. }
  7. interface Foo{
  8. void foo();
  9. }
  10. class Test{
  11. static void go(){
  12. Bar b = new Bar();
  13. b.doStuff(new Foo(){
  14. public void foo(){
  15. System.out.println("foofy");
  16. }
  17. });
  18. }
  19. }

4.静态内部类

  1. public class Test {
  2.     public static void main(String[] args)  {
  3.         Outter.Inner inner = new Outter.Inner();
  4.     }
  5. }
  6. class Outter {
  7.     public Outter() {
  8.     }
  9.     static class Inner {
  10.         public Inner() {
  11.         }
  12.     }
  13. }

五、关于内部类,大家掌握三点:

①如何创建成员内部类的对象

②如何区分调用外部类、内部类的变量(尤其是变量重名时)

③局部内部类的使用 

weinxin
我的微信
有问题微信找我
DannyWu

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: