Java内部类分类与基本介绍

文章目录

    • 前言
    • 一、成员内部类
    • 二、静态内部类
    • 三、局部内部类
    • 四、匿名内部类
    • 五、内部类的优点


前言

在 Java 中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。


一、成员内部类

  • 定义
    成员内部类是最普通的内部类,它的定义为位于另一个类的内部。
  • 例子
public class Outer {
     

   private static int num1=2;
   private  int num2=4;
   public static void show1(){
     
       System.out.println("访问外部类静态方法");
   }
   public void show2(){
     
       System.out.println("访问外部类实例方法");
   }
   class memberInner{
     
       public void visit(){
     
           System.out.println("访问外部类静态变量num1:"+num1);
           System.out.println("访问外部类实例变量num2:"+num2);
           show1();
           show2();
       }
   }

   public static void main(String[] args) {
     
       Outer.memberInner memberInner = new Outer().new memberInner();
       //memberInner memberInner = new Outer().new memberInner();也可以
       memberInner.visit();
   }
/*
控制台输出结果:
访问外部类静态变量num1:2
访问外部类实例变量num2:4
访问外部类静态方法
访问外部类实例方法
*/
}

  • 创建方式
    (外部类类名.)成员内部类类名 xxx = 外部类对象名.new 成员内部类类名()
  • 特点
    • 成员内部类可以拥有 private 访问权限、默认访问权限、protected 访问权限、public 访问权限。
    • 成员内部类可以访问外部类所有的变量和方法(可以将其类比成员方法)。
    • 因为是成员内部类,属于对象,因此其内部不能存在static关键字。

二、静态内部类

  • 定义
    静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。
  • 例子
public class Outer {
     

   private static int num1=2;
   private  int num2=4;
   public static void show1(){
     
       System.out.println("访问外部类静态方法");
   }
   public void show2(){
     
       System.out.println("访问外部类实例方法");
   }
   static class staticInner{
     
       public void visit(){
     
           System.out.println("访问外部类静态变量num1:"+num1);
//            System.out.println("访问外部类实例变量num2:"+num2);  静态内部类无法访问
           show1();
//          show2();  静态内部类无法访问
       }
   }

   public static void main(String[] args) {
     
       Outer.staticInner staticInner = new Outer.staticInner();
       staticInner.visit();
   }
/*
控制台输出结果:
访问外部类静态变量num1:2
访问外部类静态方法
*/
}

  • 创建方式
    外部类类名.静态内部类类名 xxx = new 外部类类名.静态内部类类名()
  • 特点
    • 静态内部类可以访问外部类所有的静态变量,而不可访问外部类的非静态变量(可以将其类比成静态方法)。

三、局部内部类

  • 定义
    局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。
  • 例子
public class Outer {
     

   private static int num1=2;
   private  int num2=4;
   public static void show1(){
     
       System.out.println("访问外部类静态方法");
   }
   public void show2(){
     
       System.out.println("访问外部类实例方法");
   }

   public static void showLocalInner1(){
     
       class localOuter1{
     
           private void show(){
     
               System.out.println("静态局部内部类:");
               System.out.println("访问外部类静态变量num1:"+num1);
               show1();
           }
       }
       localOuter1 localOuter1=new localOuter1();
       localOuter1.show();
   }
   public  void showLocalInner2(){
     
       class localOuter2{
     
           private void show(){
     
               System.out.println("局部内部类:");
               System.out.println("访问外部类静态变量num1:"+num1);
               System.out.println("访问外部类实例变量num2:"+num2);
               show1();
               show2();
           }
       }
       localOuter2 localOuter2=new localOuter2();
       localOuter2.show();
   }
   public static void main(String[] args) {
     
         showLocalInner1();
         new Outer().showLocalInner2();
   }
/*
控制台输出结果:
静态局部内部类:
访问外部类静态变量num1:2
访问外部类静态方法
局部内部类:
访问外部类静态变量num1:2
访问外部类实例变量num2:4
访问外部类静态方法
访问外部类实例方法
*/
  • 创建方式
    在对应方法内:局部内部类类名 xxx = new 局部内部类类()
  • 特点
    • 局部内部类就像是方法里面的一个局部变量一样,是不能有 public、protected、private 以及 static 修饰符的。
    • 定义在实例方法中的局部内部类可以访问外部的所有变量和方法;定义在静态方法中的局部类只能访问外部类的静态变量和方法。

四、匿名内部类

  • 定义
    与局部内部类很相似,只不过匿名内部类是一个没有给定名字的内部类,在创建这个匿名内部类后,便会立即用来创建并返回此内部类的一个对象
  • 例子
interface AnonymousInterface{
     
   void show();
}
abstract class  AnonymousClass{
     //不是抽象类也可以
   abstract void show();
}
public class Outer {
     

   private final int num1=2;
   private  int num2=4;
   public void show1(final int i){
     
       new AnonymousInterface(){
     
           @Override
           public void show() {
     
               System.out.println("匿名内部类实现接口");
               System.out.println("匿名内部类访问final变量:"+num1);
               System.out.println("匿名内部类访问final形参:"+i);
           }
       }.show();
   }
   public void show2(int i){
     
       new AnonymousClass(){
     
           @Override
           void show() {
     
               System.out.println("匿名内部类继承抽象类");
               System.out.println("匿名内部类访问非final变量:"+num2);
               System.out.println("匿名内部类访问非final形参:"+i);
           }
       }.show();
   }
   public static void main(String[] args) {
     
       Outer outer = new Outer();
       outer.show1(10);
       outer.show2(20);

   }
/*
控制台输出结果:
匿名内部类实现接口
匿名内部类访问final变量:2
匿名内部类访问final形参:10
匿名内部类继承抽象类
匿名内部类访问非final变量:4
匿名内部类访问非final形参:20
*/
  • 创建方式
    new 类/接口{
    //匿名内部类实现部分
    }
  • 特点
    • 匿名内部类不能定义任何静态成员和静态方法。
    • 匿名内部类不能访问外部类未加final修饰的变量和该匿名内部类所在方法的未加final修饰的形参(jdk1.8及以后即使没有用final修饰也可以访问)
    • 匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。

五、内部类的优点

  • 一个内部类对象可以以访问创建它的外部类对象的内容,包括私有数据。
  • 内部类实现了"多重继承",一定程度上解决了Java只有单继承的缺陷(内部类可以实现一个接口,无论外部类是否实现了该接口)。
  • 内部类可以使得有一定关联的类组合在一起,又对外隐藏细节。

你可能感兴趣的:(Java,java,类)