Java中的特殊类——内部类、匿名类

内部类

内部类有两种形式,静态内部类和非静态内部类

非静态内部类

  • 非静态内部类是一个类中嵌套着另外一个类,它有访问外部类成员的权限, 通常被称为内部类。
  • 由于内部类嵌套在外部类中,因此必须首先实例化外部类,然后创建内部类的对象来实现
普通非静态内部类
class OuterClass {
  int x = 10;

  class InnerClass {
    int y = 5;
  }
}

public class MyMainClass {
  public static void main(String[] args) {
    OuterClass myOuter = new OuterClass();
    OuterClass.InnerClass myInner = myOuter.new InnerClass();
    System.out.println(myInner.y + myOuter.x);
  }
}

输出的结果为

15

从以上例子可以看出,当需要实例化内部类时,需要先实例化外部类。否则会在编译时出错。

私有非静态内部类

内部类可以使用 private 或 protected来修饰,如果你不希望内部类被外部类访问可以使用 private 修饰符

class OuterClass {
  int x = 10;

  private class InnerClass {
    int y = 5;
  }
}

public class MyMainClass {
  public static void main(String[] args) {
    OuterClass myOuter = new OuterClass();
    OuterClass.InnerClass myInner = myOuter.new InnerClass();
    System.out.println(myInner.y + myOuter.x);
  }
}

运行结果

Error:(9, 19) java: OuterClass.InnerClass 在 OuterClass 中是 private 访问控制

以上运行结果产生的原因是InnerClass类被private修饰。在这种情况下,只有在OuterClass类(外部类)中,才能对InnerClass进行访问。对于上述例子,如果main函数实在OuterClass中,则可以成功访问InnerClass。

从内部类访问外部类成员
class OuterClass {
  int x = 10;

  class InnerClass {
    public int myInnerMethod() {
      return x;
    }
  }
}

public class MyMainClass {
  public static void main(String[] args) {
    OuterClass myOuter = new OuterClass();
    OuterClass.InnerClass myInner = myOuter.new InnerClass();
    System.out.println(myInner.myInnerMethod());
  }
}

输出结果为

10

静态内部类

静态内部类可以使用 static 关键字定义,静态内部类我们不需要创建外部类来访问,可以直接访问它。

class OuterClass {
  int x = 10;

  static class InnerClass {
    int y = 5;
  }
}

public class MyMainClass {
  public static void main(String[] args) {
    OuterClass.InnerClass myInner = new OuterClass.InnerClass();
    System.out.println(myInner.y);
  }
}

输出结果为

5

注意:静态内部类无法访问外部类的成员。

匿名类

  • Java 中可以实现一个类中包含另外一个类,且不需要提供任何的类名直接实例化。主要是用于在我们需要的时候创建一个对象来执行特定的任务,可以使代码更加简洁。
  • 匿名类是不能有名字的类,它们不能被引用,只能在创建时用 new 语句来声明它们。
  • 匿名类通常继承一个父类或实现一个接口,下面分别以这两种情况进行举例。
  • 注意:匿名类是表达式形式定义的,所以末尾以分号 ; 来结束。

匿名类继承一个父类

在这里插入图片描述

class Polygon {
   public void display() {
      System.out.println("在 Polygon 类内部");
   }
}

class AnonymousDemo {
   public void createClass() {

      // 创建的匿名类继承了 Polygon 类
      Polygon p1 = new Polygon() {
         public void display() {
            System.out.println("在匿名类内部。");
         }
      };
      p1.display();
   }
}

class Main {
   public static void main(String[] args) {
       AnonymousDemo an = new AnonymousDemo();
       an.createClass();
   }
}

输出结果为

在匿名类内部。

以上程序中,创建了 Polygon 类,该类只有一个方法 display(),创建的另一个类AnonymousDemo类继承了 Polygon类并重写了Polygon 类的 display() 方法。执行以上代码,匿名类的对象 p1 会被创建,该对象会调用匿名类的 display() 方法。

匿名类继承一个接口

继承接口的方式与继承父类相似。

interface Polygon {
   public void display();
}

class AnonymousDemo {
   public void createClass() {

      // 匿名类实现一个接口
      Polygon p1 = new Polygon() {
         public void display() {
            System.out.println("在匿名类内部。");
         }
      };
      p1.display();
   }
}

class Main {
   public static void main(String[] args) {
      AnonymousDemo an = new AnonymousDemo();
      an.createClass();
   }
}

输出结果为

在匿名类内部。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值