栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

浅谈内部类(Java)

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

浅谈内部类(Java)

  • 内部类
    • 局部内部类
    • 成员内部类
    • 静态内部类
    • 匿名内部类

内部类

指的就是把类定义在另一个类的内部,类名不一样,在我们说内部类的时候一般都要加上他的前缀
当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构最好使用内部类。

局部内部类

局部内部类也称为本地内部类,是定义在方法当中的类,他是只能在当前方法中使用的

成员内部类

成员内部类也叫实例内部类,就是可以把它当做是一个普通的实例成员

//外部类
class OuterClass{
      public int data1 = 1;
      private int data2 = 2;
      public static int data3 = 3;

      //实例内部类
    class InnerClass{
        public int data1 = 999;
        public int data4 = 4;
        private int data5 = 5;
        public static final int data6 = 6;

        public InnerClass(){
            System.out.println("不带参数的内部类构造方法!");
        }

        public void func(){
            System.out.println(data1);
            System.out.println(this.data1);
            System.out.println(OuterClass.this.data1);
            System.out.println(data2);
            System.out.println(data3);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);

            System.out.println("InnerClass::func()");
        }
      }

}

public class TestDemo {
    public static void main(String[] args) {
        OuterClass.InnerClass innerClass = new OuterClass().new InnerClass();
        innerClass.func();
    }
}

注意:在实例内部类中不能定义一个静态的成员变量,如果非要定义,就只能定义一个静态常量,加上final即可

如何实例化成员内部类的对象:
外部类名.内部类名 变量 = 外部类对象的引用.new 内部类();

如果实例内部类当中,包含了和外部类同名的成员变量,那么如何在实例内部类当中访问:

补充:

继承内部类:

内部类的字节码文件:

静态内部类

被 static 修饰的内部成员类就称为静态内部类

class OuterClass2{
public int data1 = 1;
private int data2 = 2;
public static int data3 = 3;

//静态内部类
    static class InnerClass{
        public int data4 = 4;
        private int data5 = 5;
        public static int data6 = 6;

        public static OuterClass2 out = new OuterClass2();

    public InnerClass(){
        System.out.println("静态内部类构造方法");
    }

        public InnerClass(OuterClass2 out){
            this.out = out;
        }
        
        public void func(){
            System.out.println(out.data1);
            System.out.println(out.data2);
            System.out.println(data3);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);
            System.out.println("InnerClass::func()");
        }
}
}

public class TestDemo2 {
    public static void main(String[] args) {
        OuterClass2 outerClass2 = new OuterClass2();
        OuterClass2.InnerClass innerClass = new OuterClass2.InnerClass(outerClass2);
        innerClass.func();
    }

}

注意:

1:在静态内部类中只能访问外部类中的静态成员,不可直接访问外部类中的非静态成员
2:创建静态内部类对象时,不需要先创建外部类对象

如何实例化:
外部类名.内部类名 变量 = new 外部类名.内部类名();

匿名内部类

就是为了让代码更加简洁,你可以定义一个类的同时对其进行实例化,它与局部类很相似,不同的是它没有类名,如果某个局部类你只需要使用一次,就可以使用匿名类代替局部类。

import java.util.Comparator;
import java.util.PriorityQueue;

class Test {
    public void test() {
        System.out.println("test()haha!");
    }
}

public class TestDemo2 {
    public static void main(String[] args) {
        new Test(){
            @Override
            public void test() {
                System.out.println("我是重写的test方法");
            }
        }.test();

        PriorityQueue prio = new PriorityQueue<>(new Comparator() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return 0;
            }
        });
    }
}

再次强调:在说内部类的时候,得加上他的前缀进行说明…

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/984954.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号