Java中内部类使用

Posted nuist__NJUPT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中内部类使用相关的知识,希望对你有一定的参考价值。

Java中内部类使用

  • Java语言允许在一个类的内部定义另一个类(接口,枚举或注解),
  • 这种类称为内部类或者嵌套类,允许内部类的目的是增强两个类之间的联系,并且可以使程序代码清晰简介
  • 有多种类型的内部类,大致可以分为:成员内部类,局部内部类,匿名内部类和静态内部类
  • 成员内部类是没有用static修饰且定义在外层类的类体中
  • 成员内部类中不能定义static变量和static方法
  • 成员内部类中可以使用abstract和final修饰
  • 成员内部类还可以使用private,public,protected等访问修饰符
public class OuterClass {
    private int x = 200 ;
    public class InnerClass{ //成员内部类
        int y = 300 ;
        public int calculate(){
            return x + y ; //成员内部类可以访问外层类的成员
        }
    }
    public void makeInner(){
        InnerClass ic = new InnerClass() ; //创建内部类对象
        System.out.println(ic.calculate()) ; //使用成员内部类对象,调用内部类中的方法
    }
    public static void main(String[] args){
        OuterClass outer = new OuterClass() ; //创建一个外部类对象
        OuterClass.InnerClass inner = outer.new InnerClass() ;//通过外部类对象创建内部类对象
    }
}

  • 在方法体或者语句块中定义的类叫做局部内部类,局部内部类不能视作外部类的成员,
  • 只对局部块有效,同局部变量一样,在说明它的块之间完全不能访问,因此不能带有任何访问修饰符
  • 局部内部类也不能使用static修饰,可以使用final和abstract修饰,
  • 局部内部类可以访问外层类的成员,若要访问其所在方法的参数和局部变量,这些参数不能修改
  • static 方法中定义的局部内部类,可以访问外层类定义的static成员,不能访问外层类的实例成员
public class OuterClass2 {
    private String x = "hello" ;
    public void makeInner(int params){  //普通方法
            String y = "local variable" ;
            class InnerClass{ //局部内部类
                public void seeOuter(){ //局部内部类中的方法
                    System.out.println("x = " + x) ;
                    System.out.println("y = " + y) ;
                    System.out.println("params = " + params) ;
                }
            }
            new InnerClass().seeOuter() ; //调用内部类的方法
    }

    public static void main(String[] args){
        OuterClass2 oc = new OuterClass2() ; //创建外部类实例化对象
        oc.makeInner(68) ; //调用带一个参数的方法
    }
}
  • 定义类的最终目的是创建一个类的实例,如果某个类的实例只使用一次,可以将类的定义和实例的创建在一起完成,在定义类的同时就创建一个实例
  • 这样定义的一个没有名字的类叫做匿名内部类
  • 匿名内部类可以继承一个类或者实现一个接口,不需要使用extends或implements关键字
  • 匿名内部类不能同时定义一个类或者实现一个接口,也不能实现多个接口
  • 匿名内部类没有名字,所以在类体中不能定义构造方法
  • 下面创建的匿名内部类继承了Animal类,是Animal的子类,并覆盖了Animal中的eat()方法
  • 同时创建一个匿名内部类的实例,并用dog指向它
class Animal{
    public void eat(){
        System.out.println("I like eat anything.") ;
    }
}
public class AnimalTest {
    public static void main(String[] args){
       Animal dog = new Animal(){ //创建实例化对象时,同时定义一个没有名字的类
           @Override
           public void eat() { //重写eat()方法
               System.out.println("I like eat bones") ;
           }
       } ;
       dog.eat() ;
    }
}
  • 下面程序中程序中的匿名内部类实现了一个Printable接口
/**
 * 下面程序中程序中的匿名内部类实现了一个Printable接口
 */
interface Printable{
    public abstract void print(String message) ;
}
public class PrintableTest {
    public static void main(String[] args){
        Printable printable = new Printable(){ //匿名内部类实现一个接口,并重写接口中的方法
            @Override
            public void print(String message) {
                System.out.println(message) ;
            }
        } ;
    }
}
  • 与类的其它成员类似,静态内部类使用static修饰,静态内部类也称为嵌套类
  • 静态内部类与成员内部类的行为完全不同
  • 1.静态内部类可以定义静态成员,而成员内部类不能
  • 2.静态内部类只能访问外层类的静态成员,成员内部类可访问外层类的实例成员和静态成员
  • 创建静态内部类的实例不需要先创建一个外部类的实例,创建成员内部类的实例,必须创建一个外外层类的实例
public class MyOuter {
    private static int x = 100 ;
    public static class MyInner{ //静态内部类
        private String y = "hello" ;
        public void innerMethod(){
            System.out.println("x  = " + x) ; //可以访问外层类的静态成员
            System.out.println("y = " + y) ;
        }
    }
    public static void main(String[] args){
        //不需要创建外部类的实例就可以创建一个静态内部类实例
        MyOuter.MyInner snc = new MyOuter.MyInner() ;
        snc.innerMethod();
    }
}

  • 静态内部类实际上是一种外部类,它存在对外部类的引用
  • 不通过外部类的实例就可以创建一个对象,静态内部类也称为顶层类
  • 静态内部类具有对任何外层类实例的引用,静态内部类的方法不能this关键字访问外层类的实例成员
public class MyOuter2 {
    String s1 = "hello" ;
    static String s2 = "World" ;
    interface MyInterface{ //内部接口的声明
        void show() ;
    }
    static class MyInner2 implements MyInterface { //静态内部类实现接口,并重写接口中的方法
        @Override
        public void show() {
            System.out.println("s1 = " + new MyOuter2().s1) ;
            System.out.println("s2 = " + s2)  ; //可以访问外层类的static变量
        }
    }
    public static void main(String[] args){
        MyOuter2.MyInner2 inner2 = new MyOuter2.MyInner2() ;//创建静态内部类实例
        inner2.show();
    }
}

以上是关于Java中内部类使用的主要内容,如果未能解决你的问题,请参考以下文章

# Java 常用代码片段

在内部片段类中使用ListView

错误:这个片段内部类应该是静态的 [ValidFragment]

为啥片段类应该是公开的?

java内部类的匿名内部类

elasticsearch代码片段,及工具类SearchEsUtil.java