java内部类

Posted 羽哲

tags:

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

一、内部类:将一个类定义在另一个类或者方法中!

二、内部类可以分为4类:

1、成员内部类

public class SurfaceClass {// 外部类
    private static int a = 1;
    private int b = 2;

    /**
       可以访问我们外部类的所有属性和方法!
        如果我们想访问内部类!必须要有外部类! 只能通过外部类来
     */
    class InnerClass {// 成员内部类
        public void hello() {
            int a = 10;
            int b = 20;
            System.out.println(a);// 10
            System.out.println(b);// 20
            System.out.println(SurfaceClass.this.a);// 1
            System.out.println(SurfaceClass.this.b);// 2

        }
    }
}

/**
 * 测试类
 * @author lzw
 * 2017-8-4
 * 每个人都有自己的梦想。努力拼搏吧!不要让自己后悔!
 */
public class InnerClassTest {
    public static void main(String[] args) {
        /*访问内部类!
         1.创建外部类对象
            SurfaceClass surfaceClass = new SurfaceClass();
         2.通过外部类对象创建内部类对象
             InnerClass innerClass = surfaceClass.new InnerClass();
         3.调用对应的方法
            innerClass.hello();
        */
        SurfaceClass surfaceClass = new SurfaceClass();
        InnerClass innerClass = surfaceClass.new InnerClass();
        innerClass.hello();
    }

/*注意点:
01.内部类可以拥有private,protected访问权限修饰符!
02.如果外部类和内部类有相同的属性或者方法的时候, 默认是就近原则,取内部类的属性或者方法!
我们想调用外部类的属性和方法使用 ===>外部类名.this.属性/方法名*/


}

 

2、局部内部类

 

public class SurfaceClass {// 外部类
    // 外部类的方法
    public void getInner() {
        class InnerClass { // 这个类被定义在了一个方法中 ===》局部内部类
            public void sayBye() {
                System.out.println("再见了!老大哥!");
            }
        }
        InnerClass innerClass = new InnerClass(); // 仅限于本方法中使用
        innerClass.sayBye();

    }
}

/**
 * 测试类
 * @author lzw
 * 2017-8-4
 * 每个人都有自己的梦想。努力拼搏吧!不要让自己后悔!
 */
public class InnerClassTest {
    public static void main(String[] args) {

    局部内部类
      类被定义在一个方法体或者作用域中!
    注意点:
      001.这个类仅限于当前方法使用!
      002.可以理解成局部变量

        SurfaceClass surfaceClass = new SurfaceClass();
        surfaceClass.getInner();
    }
}

 

3、匿名内部类

 

/**
 * 匿名内部类的使用
 * @author lzw
 * 2017-8-4
 * 每个人都有自己的梦想。努力拼搏吧!不要让自己后悔!
 */
public class InnerClassTest {
    public static void main(String[] args) {
        /*注意点
        001.没有名字
        002.只能使用一次
        003.前提:必须继承一个类或者实现某个接口
        004.接口或者抽象类中的所有抽象方法必须全部实现!
        
        在我们的程序中,有一个类只使用了一次,那么我们没有必要单独去创建一个类!这时候就使用匿名内部类!*/
        Thread thread = new Thread(new Runnable() {// 匿名内部类
                    @Override
                    public void run() {
                        for (int i = 0; i < 10; i++) {
                            System.out.println("老大哥辛苦了");
                        }
                    }
                });
        thread.start();
    }
}

 

 

 

4、静态内部类

 

public class SurfaceClass {
    // 静态内部类
    static class InnerClass {
        public void hello() {
            System.out.println("InnerClass静态内部类");
        }
    }
}


/**
 * 静态内部类的使用
 * @author lzw
 * 2017-8-4
 * 每个人都有自己的梦想。努力拼搏吧!不要让自己后悔!
 */
public class InnerClassTest {
    /*静态内部类
       就是在内部类的修饰符上加了 static ! 静态了!不依赖于外部类了!
       不能访问外部类的所有非静态的属性和方法!*/
    public static void main(String[] args) {
        InnerClass innerClass = new InnerClass();
        innerClass.hello();
    }
}

 










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

# Java 常用代码片段

# Java 常用代码片段

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

片段 - 全局视图变量与本地和内部类侦听器和内存泄漏

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

ForegroundService没有从片段开始?