Java基础——内部类

内部类

我们学习类与对象后,知道了类的定义和使用
也知道抽象类以及包装器类的用法
类中除了定义成员属性和成员方法外
还能添加内部类

概述

内部类(内置类)(嵌套类):定义在另一个类中的类。

特点

  1. 内部类是编译时的语法,编译后生成两个独立的类。
  2. 内部类可以访问外部类的任何成员。
  3. 外部类不能直接访问内部类的成员。
  4. 内部类可以为静态,privateprotected修饰,外部类只能用publicdefault缺省的包访问。
  5. 用内部类定义在外部类不可访问的属性,实现必外部类的private更小的访问权限。

类别

  • 成员内部类
  • 局部内部类
  • 匿名内部类
  • 静态内部类

成员内部类

作为外部类的成员存在,与外部类的属性、方法并列。

class OutClass{
      //成员属性
      private int i;
      //成员方法
      void print(){
            System.out.println("外部类");
      }

      //内部类
      class Inner{
      }
}

创建对象

  • 在外部类的内部。
    • Inner i = new Inner();
  • 在外部类的外部。
    1. 建立一个外部类对象
    2. 生成一个内部类对象

访问

  • 在内部类中访问内部类变量。
    • 内部类.this.属性;
  • 访问外部类成员
    • 外部类名.this.属性
  • 在外部类的外部访问内部类
    • 内部类对象.对象名

局部内部类

在方法中定义的内部类为局部内部类。
局部内部类不能加修饰符privatepublicprotected

class OutClass{
      //外包方法
      public void print(){
            System.out.println("外部类方法");
      
            //局部内部类
            class Inner{
                  //局部内部类方法
                  public void method(){

                  }
            }
            //创建局部内部类对象
            Inner in = new Inner();
            //调用局部内部类方法
            in.method();
      }
}

特点

  1. 局部内部类可以访问外包方法之外的外部类的所以成员
  2. 局部内部类可以该访问外包方法的参数
  3. 局部内部类只能访问局部中被final修饰的局部变量
  4. 局部内部类不能声明为接口

使用

使用局部内部类时,需要

  1. 生成外部类对象
  2. 通过外部类对象调用外包方法;在方法中才能调用局部内部类

匿名内部类

匿名内部类是局部内部类的使用扩展
只创建类的一个对象,不用对内部类命名。

interface anonymous{
      void print();
}

class{
      public void print(){
            System.out.println("外部类方法");
            //匿名内部类
            anonymous an = new anonymous(){
                  //局部内部类方法
                  public void method(){

                  }
            };
            an.method();
      }
}

特点

  1. 匿名类没有类名,必须继承一个类或实现一个接口。不能有显式的extendsimplements
  2. 匿名类不能有构造方法,没有匿名。可通过 new 父类名();创建对象
  3. 匿名类的创建和定义同时进行
  4. 匿名类只能一次性的创建对象
  5. 匿名类可以在方法体中,可以在参数列表中
  6. 匿名内部类不能是抽象类。
  7. 匿名内部类必须实现它的抽象父类或者接口里的所有抽象方法
  8. 匿名内部类一定是在new的后面,其隐含实现一个接口或一个类,没有类名

静态内部类

静态内部类定义在类中,在方法之外。static修饰

class OutClass{
      public void print(){
            System.out.println("外部类方法");
      }


      //静态内部类
      protected static class Inner{
            
      }
}

使用

静态内部类的对象可以直接生成

public class Demo{
      public static void main(String args[]){
            OutClass.Inner inner = new OutClass.Inner();
      }
}

特点

  1. 静态内部类直接访问外部类的静态成员,不能直接访问外部类的非静态程序
  2. 静态内部类可定义静态成员,其他内部类不行
  3. 内部类有静态成员,其内部类也必须为静态。

博客相关java项目:查看Github项目
对应github项目:Inner
导入项目的方法: Java基础——Java如何导入本地项目

原文地址:https://www.cnblogs.com/occlive/p/13374764.html