Java静态内部类(static class)[通俗易懂]

Java静态内部类(static class)[通俗易懂]在一个类中创建另外一个类,叫做成员内部类。这个成员内部类可以静态的(利用static关键字修饰),也可以是非静态的。一、静态内部类的使用目的。在定义内部类的时候,在其前面加上一个权限修饰符static。这个内部类就变为了静态内部类。如在进行代码程序测试的时候,如果在每一个Java源文件中都设置一个主方法(主方法是某个应用程序的入口,必须具有),那么会出现很多额外的代码。而且最主要的是这段主…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

在一个类中创建另外一个类,叫做成员内部类。这个成员内部类可以静态的(利用static关键字修饰),也可以是非静态的。

一、静态内部类的使用目的。

在定义内部类的时候,在其前面加上一个权限修饰符static。这个内部类就变为了静态内部类。如在进行代码程序测试的时候,如果在每一个Java源文件中都设置一个主方法(主方法是某个应用程序的入口,必须具有),那么会出现很多额外的代码。而且最主要的是这段主程序的代码对于Java文件来说,只是一个形式,其本身并不需要这种主方法。但是少了这个主方法又是万万不行的。在这种情况下,就可以将主方法写入到静态内部类中,从而不用为每个Java源文件都设置一个类似的主方法。这对于代码测试是非常有用的。在一些中大型的应用程序开发中,则是一个常用的技术手段。

二、静态内部类的使用限制

将某个内部类定义为静态类,跟将其他类定义为静态类的方法基本相同,引用规则也基本一致。不过其细节方面仍然有很大的不同。具体来说,主要有如下几个地方要引起各位程序开发人员的注意。

一是静态成员(包括静态变量与静态成员)的定义。

在非静态内部类中不可以声明静态成员。如现在在一个student类中定义了一个内部类Age,如果没有将这个类利用static关键字修饰,即没有定义为静态类,那么在这个内部类中如果要利用static关键字来修饰某个成员方法或者成员变量是不允许的。在编译的时候就通不过。故程序开发人员需要注意,只有静态内部类才能够定义静态的成员变量与成员方法。

二是在成员的引用上,有比较大的限制。

一般的非静态内部类,可以随意的访问外部类中的成员变量与成员方法。即使这些成员方法被修饰为private(私有的成员变量或者方法)。因为在其他类中是无法访问被定义为私有的成员变量或方法。但是如果一个内部类被定义为静态的,那么在引用外部类的成员方法或者成员变量的时候,就会有诸多的限制。如不能够从静态内部类的对象中访问外部类的非静态成员(包括成员变量与成员方法)。这是什么意思呢?如果在外部类中定义了两个变量,一个是非静态的变量,一个是静态的变量。静态内部类只能引用外部类中的静态的成员(变量或方法),而不能够访问非静态的变量。对于那些非静态的成员变量与成员方法,在静态内部类中是无法访问的。这就是静态内部类的最大使用限制。在普通的非静态内部类中是没有这个限制的。也正是这个原因,决定了静态内部类只应用在一些特定的场合。其应用范围远远没有像非静态的内部类那样广泛。

三是在创建静态内部类时不需要将静态内部类的实例绑定在外部类的实例上。

通常情况下,在一个类中创建成员内部类的时候,有一个强制性的规定,即内部类的实例一定要绑定在外部类的实例中。也就是说,在创建内部类之前要先在外部类中要利用new关键字来创建这个内部类的对象。如此的话如果从外部类中初始化一个内部类对象,那么内部类对象就会绑定在外部类对象上。也就是说,普通非静态内部类的对象是依附在外部类对象之中的。通常情况下,程序员在定义静态内部类的时候,是不需要定义绑定在外部类的实例上的。也就是说,要在一个外部类中定义一个静态的内部类,不需要利用关键字new来创建内部类的实例。

从以上的分析中可以看出,静态内部类与非静态的内部类还是有很大的不同的。一般程序开发人员可以这么理解,非静态的内部类对象隐式地在外部类中保存了一个引用,指向创建它的外部类对象

牢记两个差别:

一、如是否可以创建静态的成员方法与成员变量(静态内部类可以创建静态的成员,而非静态的内部类不可以)

二、对于访问外部类的成员的限制(静态内部类只可以访问外部类中的静态成员变量与成员方法,而非静态的内部类即可以访问所有的外部类成员方法与成员变量)。

这两个差异是静态内部类与非静态外部类最大的差异,也是静态内部类之所以存在的原因。了解了这个差异之后,程序开发人员还需要知道,在什么情况下该使用静态内部类。如在程序测试的时候,为了避免在各个Java源文件中书写主方法的代码,可以将主方法写入到静态内部类中,以减少代码的书写量,让代码更加的简洁。

总 之,静态内部类在Java语言中是一个很特殊的类,跟普通的静态类以及非静态的内部类都有很大的差异。作为程序开发人员,必须要知道他们之间的差异,并在 实际工作中在合适的地方采用合适的类。不过总的来说,静态内部类的使用频率并不是很高。但是在有一些场合,如果没有这个内部静态类的话,可能会起到事倍功半的反面效果。

非静态内部类实例:

package common.lang;

public class Student {

    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public class Child{
        private String name1;
        private int age1;

        public String getName1() {
            return name1;
        }
        public void setName1(String name1) {
            this.name1 = name1;
        }
        public int getAge1() {
            System.out.println(age);
            return age1;
        }
        public void setAge1(int age1) {
            this.age1 = age1;
        }


    }

    public static void main(String[] args) {
        Student s = new Student();
        s.setAge(12);
        s.setName("yao");
        Child c = s.new Child();
        System.out.println(c.getAge1());
    }
}

静态内部类实例:

package common.lang;

public class Student {


    private String name;
    private static int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    public static int getAge() {
        return age;
    }

    public static void setAge(int age) {
        Student.age = age;
    }


    public static class Child{
        private String name1;
        private int age1;

        public String getName1() {
            return name1;
        }
        public void setName1(String name1) {
            this.name1 = name1;
        }
        public int getAge1() {
            System.out.println(age);
            return age1;
        }
        public void setAge1(int age1) {
            this.age1 = age1;
        }


    }

    public static void main(String[] args) {
        Student s = new Student();
        Child c = new Child();
    }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/183093.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 卷积操作的参数量和FLOPs

    卷积操作的参数量和FLOPs卷积操作的参数量和FLOPs  这里首先需要辨析一个概念就是FLOPs和FLOPS可以看到简写的差别仅仅是一个字母大小写的区别。  FLOPS(floating-pointoperationspersecond),这个缩写长这个样子确实也很奇怪,大致概念就是指每秒浮点数运算次数,最后一个S是秒(second)的缩写,是计组中的概念,用来描述计算机的运算速度。  FLOPs(floati…

  • 永恒之蓝(MS17010)漏洞复现

    永恒之蓝(MS17010)漏洞复现文章目录介绍:准备开始复现正式开始利用介绍:永恒之蓝是指2017年4月14日晚,黑客团体ShadowBrokers(影子经纪人)公布一大批网络攻击工具,其中包含“永恒之蓝”工具,“永恒之蓝”利用Windows系统的SMB漏洞可以获取系统最高权限。恶意代码会扫描开放445文件共享端口的Windows机器,无需用户任何操作,只要开机上网,不法分子就能在电脑和服务器中植入勒索软件、远程控制木马、虚拟货币挖矿机等恶意程序准备1.kali的ip:192.168.0.1282.WindowsServer

  • 怎样才算得上是全栈程序员?

    与其他互联网热词一样,”全栈“程序员也是英译过来的,英文全文是:Full-Stack Developer,你想啊,中国人民怎么会用客栈的栈、堆栈的栈来形容工程师呢? 谈论一个概念,…

    2020年10月17日
  • epplus 速度_【推荐套件】Excel利器 NPOI VS EPPLUS

    epplus 速度_【推荐套件】Excel利器 NPOI VS EPPLUS【工具】Excel利器—NPOIVSEPPLUS由于最近客户端不停抱怨,查询会宕机。其实,这算是老问题了,主要原因是:Query性能不佳由于该查询会使用到的Table事务量很大,容易会有Wait的现象到最后就TimeOut了。查询数据量太大,目前是放到DataSet之后直接用GridView绑定。其实,以上种种造成因素太多了。再加上,查询出来的结果使用端整批下载或是自订下载成Excel。最一开…

  • IT公司速查手册 近日被上海公安勒令关闭

    IT公司速查手册 近日被上海公安勒令关闭IT公司速查手册,为很多程序员提供了一个不错的了解IT公司的窗口,获得了众多普通IT员工的好评,可近日却被上海公安勒令关闭,理由是:散布不良信息,对用户造成的不便.很是不解,也很无奈.

  • iptable详解

    一:前言防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种。无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘。而我们的任务就是需要去定义到底防火墙如何工作,这就是防火墙的策略,规则,以达到让它对出入网络的IP、数据进行检测。目前市面上比较常见的有3、4层的防火墙,叫网络层的防火墙,还有7层的防火墙,其实是代理层的网关。对于TCP/IP的七层模型来讲

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号