关于java外部类和内部类的基础知识

292 阅读3分钟

这是我参与8月更文挑战的第23天,活动详情查看:8月更文挑战

外部类

一般我们说的类都是指外部类(如那种定义的.java文件的类) 如

public class TeacherClazzVo {
    private long id;
    private String clazzName;
}

内部类

Java允许一个类被定义在另一个类中,这样的类就称为嵌套类。嵌套类分为两种:静态的和非静态的。没有用 static来声明的嵌套类,就称为非静态嵌套类,非静态嵌套类又称为内部类。 主要包含三种类型 成员内部类、局部内部类和匿名内部类

  • 成员内部类 在一个类中定义的类,作为外部类的一个成员,与外部类的属性,方法级别是一样的,它可以访问外部类的私有成员和属性。但是外部类想要访问内部类的成员则需要建立内部类对象去访问。

注意:内部类和外部类之间有同名成员时,内部类可以以外部类名.this.变量名 访问外部类成员;在成员内部类不能存在static 关键字(不能有静态方法,静态属性,静态代码块等)

  • 局部内部类 从名字就可可指,这种类是一种局部的,和局部变量有些相似,一般局部内部类是定义在一个方法中定义的内部类,不能使用private,protected,public修饰符,也不能存在static 关键字

  • 匿名内部类 匿名类能够使代码更加简洁,它们能够同时声明和实例化一个类。它们就像本地类,只是它们没有名称(本地类是类声明,而匿名类是表达式)

public class Test {
   interface Hello{
       public void greet();
       public void greetToPeople(String name);
   }
   public void sayHello(){
       //局部内部类
       class EnglishGreeting implements Hello{
           String name = "wzy1";
           @Override
           public void greet() {greetToPeople(name); }
           @Override
           public void greetToPeople(String name) {System.out.println("Hello "+name); }
       }
   Hello hello1 = new EnglishGreeting();
       //匿名内部类
    Hello hello2 = new Hello() {
       String name = "wzy2";
        @Override
        public void greet() {greetToPeople(name);}
        @Override
        public void greetToPeople(String name) { System.out.println("Hello "+name);}
    };
    hello1.greet();
    hello2.greet();
   }

    public static void main(String[] args) {
        Test test = new Test();
        test.sayHello();
    }
}

运行结果: image.png

上面代码中使用了两种类型的内部类:一种是局部内部类EnglishGreeting,一种是匿名内部类hello2,局部内部类有自己的类名,使用时需要实例化,而匿名内部类是一个表达式,直接就可以new一个表达式。匿名内部类和局部内部类都可以访问外部类的所以成员

匿名内部类是没有类名字的内部类,是一个表达式,因此只能使用一次,但是要使用匿名内部类必须要继承或实现一个接口才能使用。

静态内部类

上面三种类型的内部类和静态内部类之间有什么区别呢?内部类是以外部类为前提的,没有外部类就无法谈内部类;静态内部类可以自己完全独立存在,但是他可以以外部类作为依托。

使用static修饰的内部类就是一个静态内部类。

public class Test {
    private String name1 = "wzy1";
    private static String name2 = "wzy2";
   public void testage(){
       System.out.println(new InnerClass().age1);
       System.out.println(InnerClass.age2);
   }
   static class InnerClass{
       private int age1= 18;
       private static int age2 = 20;
       public void hello(){
           System.out.println("Hello "+name2);
       }
   }
    public static void main(String[] args) {
       Test test  = new Test();
       test.testage();

       InnerClass in = new InnerClass();
       in.hello();
    }
}

静态内部类InnerClass 只能访问外部类的类成员 不能访问实例成员(如访问name1就问报错) 外部类可以使用静态内部类:类名.来访问类成员或者也可以使用对象的方式来访问。