• 一文搞懂内部类


    内部类分为:本地内部类,实例内部类,静态内部类,匿名内部类

    1.本地内部类

    其中,本地内部类用的最少,也不建议用。因为局限很大。例如

    1. public class Test {
    2. public void func(){
    3. class count{
    4. public int a;
    5. }
    6. // 内部类只能在当前方法使用
    7. }
    8. }

            内部类count只能在func()函数中使用,这就限制了这个类的使用,所以很少使用,这个类就是本地内部类。

    2.实例内部类

    例如:

    1. class OuterClass{
    2. public int data1 = 1;
    3. private int data2 = 2;
    4. public static int data3 = 3;
    5. //实例内部类,你可以把它当作 是外部类的普通的实例的成员
    6. public class InnerClass{
    7. public int data4 = 4;
    8. private int data5 = 5;
    9. //public static int data6 = 6;//一个东西是静态的话就是属于类的,不属于对象
    10. public static final int data6 = 6;
    11. public InnerClass(){
    12. System.out.println("不带参数的实例内部类的构造方法");
    13. }
    14. }
    15. public void func1(){
    16. System.out.println("OuterClass :: func1()");
    17. static int data7 = 7;
    18. }
    19. }

            其中,以上代码public class InnerClass{}就是实例内部类。可以看出,可以在类中定义静态(static)的变量,但不能在实例内部类中定义静态(static)的成员变量,非要定义的话,就是得定义常量(final),同样也可以在实例内部类定义构造方法,例如 public InnerClass()。     

      再观察如下代码

    1. class OuterClass{
    2. public int data1 = 1;
    3. private int data2 = 2;
    4. public static int data3 = 3;
    5. //实例内部类,你可以把它当作 是外部类的普通的实例的成员
    6. public class InnerClass{
    7. public int data4 = 4;
    8. private int data5 = 5;
    9. //public static int data6 = 6;//一个东西是静态的话就是属于类的,不属于对象
    10. public static final int data6 = 6;
    11. public InnerClass(){
    12. System.out.println("不带参数的实例内部类的构造方法");
    13. }
    14. }
    15. public void func1(){
    16. System.out.println("OuterClass :: func1()");
    17. static int data7 = 7;
    18. }
    19. public static void main(String[] args) {
    20. OuterClass outerClass = new OuterClass();
    21. OuterClass.InnerClass innerClass = outerClass.new InnerClass();
    22. }
    23. }

            可以看出,实例化实例内部类的对象,把内部类当作普通的成员变量就行。

            再看以下代码:

    1. class InnerClass{
    2. class Inner1{
    3. public int a = 10;
    4. class Inner2{
    5. public int a = 10;
    6. }
    7. }
    8. }

            以上代码可以看出,实例内部类可以多次嵌套。

    打开project文件的out->production

    可以看出,内部类的文件名称为OuterClass$InnerClass

            如果内部类中的成员变量与外部类的成员变量同名,那么在内部类的方法中调用这个名称的变量,输出的是哪一个呢?

    1. class OuterClass{
    2. public int data1 = 1;
    3. private int data2 = 2;
    4. public static int data3 = 3;
    5. //实例内部类,你可以把它当作 是外部类的普通的实例的成员
    6. public class InnerClass{
    7. public int data1 = 20;
    8. public int data4 = 4;
    9. private int data5 = 5;
    10. //public static int data6 = 6;//一个东西是静态的话就是属于类的,不属于对象
    11. public static final int data6 = 6;
    12. public void test(){
    13. System.out.println(data1);
    14. System.out.println(data2);
    15. System.out.println(data3);
    16. }
    17. public InnerClass(){
    18. System.out.println("不带参数的实例内部类的构造方法");
    19. }
    20. }
    21. public static void main(String[] args) {
    22. OuterClass outerClass = new OuterClass();
    23. OuterClass.InnerClass innerClass = outerClass.new InnerClass();
    24. innerClass.test();
    25. }
    26. }

    外部类OuterClass中data1 = 1,内部类InnerClass中data1 = 20,主函数中调用test()方法,输出为

    即就是此时的data1是内部类中的,那么如何调用外部类的data1呢? 

    可以用:外部类.this.该变量     就可以了

    即就是:System.out.println(OuterClass.this.data1);

    总结

    1.实例内部类本质上也是类,它有类的种种特性,如可以继承,

    2.在实例内部类中,不能定义一个静态的成员变量。非要定义,就要定义常量

    3.实例化 实例内部类的对象:OuterClass.InnerClass  innerClass = outerClass.new InnerClass();即就是:外部类名.内部类名  变量 = 外部类对象的引用.new  内部类()

    4.实例内部类中的"this":单独的"this"表示内部类,"外部类名.this"表示外部类。

    3.静态内部类

    1. class OuterClass2{
    2. public int data1 = 1;
    3. private int data2 = 2;
    4. public static int data3 = 3;
    5. static class InnerClass2{
    6. public int data4 = 1;
    7. private int data5 = 2;
    8. public static int data6 = 3;
    9. }
    10. }

    其中InnerClass2就是静态内部类,它与实例内部类区别就是,静态内部类前面有static。

    实例化静态内部类

    1. class OuterClass2{
    2. public int data1 = 1;
    3. private int data2 = 2;
    4. public static int data3 = 3;
    5. static class InnerClass{
    6. public int data4 = 1;
    7. private int data5 = 2;
    8. public static int data6 = 3;
    9. public void test(){
    10. System.out.println("没有参数的构造方法");
    11. }
    12. }
    13. }
    14. public class TestDome2 {
    15. public static void main(String[] args) {
    16. OuterClass2.InnerClass innerClass = new OuterClass2.InnerClass();
    17. innerClass.test();
    18. }
    19. }

            即就是:  外部类名.内部类   变量名 = new 外部类名.内部类()     

            观察test()方法,data1与data2的调用,需要在方法外实例一个out变量,才能调用外部类中的对象。

    1. class OuterClass2{
    2. public int data1 = 1;
    3. private int data2 = 2;
    4. public static int data3 = 3;
    5. static class InnerClass{
    6. public int data4 = 4;
    7. private int data5 = 5;
    8. public static int data6 = 6;
    9. public OuterClass2 out = new OuterClass2();
    10. public void test(){
    11. System.out.println(out.data1);
    12. System.out.println(out.data2);
    13. System.out.println(data3);
    14. System.out.println(data4);
    15. System.out.println(data5);
    16. System.out.println("没有参数的构造方法");
    17. }
    18. }
    19. }
    20. public class TestDome2 {
    21. public static void main(String[] args) {
    22. OuterClass2.InnerClass innerClass = new OuterClass2.InnerClass();
    23. innerClass.test();
    24. }
    25. }

    4.匿名内部类

    例如

    1. class Test{
    2. public void func(){
    3. System.out.println("haha");
    4. }
    5. }
    6. public class TestDome2 {
    7. public static void main(String[] args) {
    8. new Test();
    9. new Test(){
    10. }.func();
    11. }
    12. }

            上述代码中,main()函数中new Test();就是匿名对象,而new Test(){ };就是匿名内部类。再次调用Test类中的func(),即可输出。如下

     重写func方法:

    1. class Test{
    2. public void func(){
    3. System.out.println("haha");
    4. }
    5. }
    6. public class TestDome2 {
    7. public static void main(String[] args) {
    8. new Test();//匿名对象
    9. new Test(){//匿名内部类
    10. @Override//重写func方法
    11. public void func() {
    12. System.out.println("重写的func方法");
    13. }
    14. }.func();
    15. }
    16. }

    发现输出的是

    即就是输出:重写之后的func方法。

  • 相关阅读:
    hive,hbase集群拷贝注意事项
    django框架——sweetalert前端插件、序列化组件、批量数据操作、分页器、Forms组件(上)
    在centos上使用pyenv管理python及虚拟环境
    R语言lavaan结构方程模型在复杂网络分析中的科研技术新趋势
    【leetcode】905. 按奇偶排序数组 (简单)
    AOP 面向切面编程
    【C#语言】DataGridView隔行显示颜色
    JS教程之使用 ElectronJS、VueJS、SQLite 和 Sequelize ORM 从 A 到 Z 创建多对多 CRUD 应用程序
    java计算机毕业设计网上拍卖系统MyBatis+系统+LW文档+源码+调试部署
    Java面试八股之Java中为什么没有全局变量
  • 原文地址:https://blog.csdn.net/m0_57950108/article/details/127794603