美文网首页Java
[Java]重学Java-内部类

[Java]重学Java-内部类

作者: AbstractCulture | 来源:发表于2021-09-07 11:59 被阅读0次

什么是内部类

一个类中定义了另一个类,被定义的类叫作内部类。
内部类可以将逻辑隐藏,使用好修饰符可以让实现逻辑对外隔离,并且内部类可以访问外部类的属性。在java8中,还引入了lambda表达式来优化匿名内部类的写法。
关于编译,有兴趣的小伙伴可以看看这篇文章: 点我前往

内部类例子

package com.tea.modules.java8.innerclass;

/**
 * com.tea.modules.java8.innerclass <br>
 * 内部类的理解
 *
 * @author jaymin
 * @since 2021/9/1
 */
public class Out {
    class Inner {
        private int i = 0;

        public int value() {
            return i;
        }
    }

    public void printInnerInfo() {
        Inner inner = new Inner();
        System.out.println(inner.value());
    }

    public static void main(String[] args) {
        Out out = new Out();
        out.printInnerInfo();
    }
}
  • Result
0

可以看到,内部类其实就是一个类中包含了另一个类.

直接获取内部类的类型

package com.tea.modules.java8.innerclass;

import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

/**
 * com.tea.modules.java8.innerclass <br>
 * 内部类的理解
 *
 * @author jaymin
 * @since 2021/9/1
 */
public class Out {
    @AllArgsConstructor
    @NoArgsConstructor
    class Inner {
        private int i = 0;

        public int value() {
            return i;
        }
    }

    public Inner setValue(int i){
        return new Inner(i);
    }

    public void printInnerInfo() {
        Inner inner = new Inner();
        System.out.println(inner.value());
    }

    public static void main(String[] args) {
        Out out = new Out();
        Out.Inner inner = out.setValue(2);
        System.out.println(inner.value());
    }
}

Out.Inner可以直接获取内部类的Class.

.new

使用.new来创建内部类

public static void main(String[] args) {
    Out out = new Out();
    Inner inner = out.new Inner();
    System.out.println(inner.value());
}

.this

使用.this访问外部类的属性

public class Out {
    private Integer value;

    @AllArgsConstructor
    @NoArgsConstructor
    class Inner {
        private int i = 0;

        public int value() {
            System.out.println(Out.this.value);
            return i;
        }
    }
}

局部内部类

package com.tea.modules.java8.innerclass;

import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

/**
 * com.tea.modules.java8.innerclass <br>
 * 内部类的理解
 *
 * @author jaymin
 * @since 2021/9/1
 */
interface Print {
    void print(String message);
}

public class Out {
    @AllArgsConstructor
    @NoArgsConstructor
    class Inner {
        private int i = 0;

        public int value() {
            return i;
        }
    }

    public Print printer() {
        final class MyPrinter implements Print {

            @Override
            public void print(String message) {
                System.out.println("我是隐藏在方法中的类:" + message);
            }
        }
        return new MyPrinter();
    }

    public static void main(String[] args) {
        Out out = new Out();
        out.printer().print("局部内部类");
    }
}

注意,我们这里在方法中隐藏了一个接口的实现,并返回了一个内部类的实例.

匿名内部类

package com.tea.modules.java8.innerclass;

/**
 * com.tea.modules.java8.innerclass <br>
 * 匿名内部类
 *
 * @author jaymin
 * @since 2021/9/6
 */
interface Inner {
    int value();
}

public class AnonymousInnerClass {
    public Inner innerClass() {
        return new Inner() {
            private int i;

            @Override
            public int value() {
                return ++i;
            }
        };
    }

    public static void main(String[] args) {
        System.out.println(new AnonymousInnerClass().innerClass().value());
    }
}

这种比较常见,像经典的Runnable就可以用这种方式写。

关于内部类的意义

贴一下Java编程思想的内容,或许以后编程经验上来后,再回来看这段话能够充分理解:

每个内部类都能独立地继承自一个(接口的)实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。

注意事项

  1. 内部类不能声明static方法。
  2. 内部类经过编译后,会自动带上"$"符号
bytecode

相关文章

  • [Java]重学Java-内部类

    什么是内部类 一个类中定义了另一个类,被定义的类叫作内部类。内部类可以将逻辑隐藏,使用好修饰符可以让实现逻辑对外隔...

  • Hello Java

    目录 Java-基础(1/6) Java-对象(2/6) Java-核心库类 上(3/6) Java-核心库类下(...

  • [Java]重学Java-继承

    复用 随着码代码的时间增长,程序员会越发需要"复用"这个能力,比如最简单的对String类进行判空: 我们需要每次...

  • [Java]重学Java-集合

    容器 很多时候,我们写程序需要进行批量的操作,比如说,新增一批学生列表.那么就需要有容器来装下这10个对象。Jav...

  • [Java]重学Java-接口

    接口是什么 首先接口不是类,它本身是无法被实例化的,只有实现类可以被实例化。它更像是一种功能的描述,程序输入什么值...

  • [Java]重学Java-多态

    从一个例子理解多态 对于一个不同特征的对象,使用接口可以隐藏子类的行为,对外暴露同一个接口,从而实现编程的解耦. ...

  • Java-内部类

    面试时偶尔会遇到的问题,一般情况下,我认为考点主要有以下两点: 内部类造成内存溢出问题 各种内部类之间的区别 1....

  • java-内部类

    内部类分为:成员内部类,静态内部类,局部内部类,匿名内部类。 内部类定义:innerclass,在类的里面定义类就...

  • java-内部类

    内部类与类的属性没有什么区别。静态内部类,非静态内部类在new时有区别。静态内部类类似于外部类的类变量,非静态内部...

  • Java-内部类

    Java-内部类 有时可以把一个类放在另一个类的内部定义,这个定义在其他类内部的类就是内部类,包含内部类的类被称为...

网友评论

    本文标题:[Java]重学Java-内部类

    本文链接:https://www.haomeiwen.com/subject/zvnuwltx.html