java 内部类和静态内部类的区别

【Android面试八股文】Java中静态内部类是什么?和非静态内部类的区别是什么? 在定义内部类时,如果内部类被static声明,则该内部类是静态内部类。// 外部类// 内部类// 静态内部类。 阅读详情

 

下面说一说内部类(Inner Class)和静态内部类(Static Nested Class)的区别:
定义在一个类内部的类叫内部类,包含内部类的类称为外部类。内部类可以声明public、protected、private等访问限制,可以声明 为abstract的供其他内部类或外部类继承与扩展,或者声明为static、final的,也可以实现特定的接口。外部类按常规的类访问方式使用内部 类,唯一的差别是外部类可以访问内部类的所有方法与属性,包括私有方法与属性。

(1)创建实例

   OutClass.InnerClass obj = outClassInstance.new InnerClass(); //注意是外部类实例.new,内部类

   AAA.StaticInner in = new AAA.StaticInner();//注意是外部类本身,静态内部类

(2)内部类中的this

   内 部类中的this与其他类一样是指的本身。创建内部类对象时,它会与创造它的外围对象有了某种联系,于是能访问外围类的所有成员,不需任何特殊条件,可理 解为内部类链接到外部类。 用外部类创建内部类对象时,此内部类对象会秘密的捕获一个指向外部类的引用,于是,可以通过这个引用来访问外围类的成员。

(3)外部类访问内部类

   内部类类似外部类的属性,因此访问内部类对象时总是需要一个创建好的外部类对象。内部类对象通过‘外部类名.this.xxx’的形式访问外部类的属性与方法。如:
       System.out.println("Print in inner Outer.index=" + pouter.this.index);
       System.out.println("Print in inner Inner.index=" + this.index);

(4)内部类向上转型

   内部类也可以和普通类一样拥有向上转型的特性。将内部类向上转型为基类型,尤其是接口时,内部类就有了用武之地。如果内部类是private的,只可以被它的外部类问,从而完全隐藏实现的细节。

(5)方法内的类

   方法内创建的类(注意方法中也能定义类),不能加访问修饰符。另外,方法内部的类也不是在调用方法时才会创建的,它们一样也被事先编译了。

(6)静态内部类

   定义静态内部类:在定义内部类的时候,可以在其前面加上一个权限修饰符static。此时这个内部类就变为了静态内部类。

通常称为嵌套类,当内部类是static时,意味着:

   [1]要创建嵌套类的对象,并不需要其外围类的对象;

   [2]不能从嵌套类的对象中访问非静态的外围类对象(不能够从静态内部类的对象中访问外部类的非静态成员);

   嵌 套类与普通的内部类还有一个区别:普通内部类的字段与方法,只能放在类的外部层次上,所以普通的内部类不能有static数据和static字段, 也不能包含嵌套类。但是在嵌套类里可以包含所有这些东西。也就是说,在非静态内部类中不可以声明静态成员,只有将某个内部类修饰为静态类,然后才能够在这 个类中定义静态的成员变量与成员方法。

   另外,在创建静态内部类时不需要将静态内部类的实例绑定在外部类的实例上。普通非静态内部类的 对象是依附在外部类对象之中的,要在一个外部类中定义一个静态的内部类,不需要利用关键字new来创建内部类的实例。静态类和方法只属于类本身,并不属于 该类的对象,更不属于其他外部类的对象。

(7)内部类标识符

   每个类会产生一个.class文件,文件名即为类名。同样,内部类也会产生这么一个.class文件,但是它的名称却不是内部类的类名,而是有着严格的限制:外围类的名字,加上$,再加上内部类名字。

(8)为何要用内部类?

   1.   内部类一般只为其外部类使用;

   2.   内部类提供了某种进入外部类的窗户;

   3.   也是最吸引人的原因,每个内部类都能独立地继承一个接口,而无论外部类是否已经继承了某个接口。因此,内部类使多重继承的解决方案变得更加完整。

 

加深印象,参考一下:

package com.test.xml;
public class OutClassTest {
    static int a;

    int b;

    public static void test() {
        System.out.println("outer class static function");
    }

    public static void main(String[] args) {
        OutClassTest oc = new OutClassTest();
        // new一个外部类
        OutClassTest oc1 = new OutClassTest();
        // 通过外部类的对象new一个非静态的内部类
        OutClassTest.InnerClass no_static_inner = oc1.new InnerClass();
        // 调用非静态内部类的方法
        System.out.println(no_static_inner.getKey());

        // 调用静态内部类的静态变量
        System.out.println(OutClassTest.InnerStaticClass.static_value);
        // 不依赖于外部类实例,直接实例化内部静态类
        OutClassTest.InnerStaticClass inner = new OutClassTest.InnerStaticClass();
        // 调用静态内部类的非静态方法
        System.out.println(inner.getValue());
        // 调用内部静态类的静态方法
        System.out.println(OutClassTest.InnerStaticClass.getMessage());
    }

    private class InnerClass {
        // 只有在静态内部类中才能够声明或定义静态成员
        // private static String tt = "0";
        private int flag = 0;

        public InnerClass() {
            // 三.非静态内部类的非静态成员可以访问外部类的非静态变量和静态变量
            System.out.println("InnerClass create a:" + a);
            System.out.println("InnerClass create b:" + b);
            System.out.println("InnerClass create flag:" + flag);
            //
            System.out.println("InnerClass call outer static function");
            // 调用外部类的静态方法
            test();
        }

        public  String getKey() {
            return "no-static-inner";
        }
    }

    private static class InnerStaticClass {
        // 静态内部类可以有静态成员,而非静态内部类则不能有静态成员。
        private static String static_value = "0";

        private int flag = 0;

        public InnerStaticClass() {
            System.out.println("InnerClass create a:" + a);
            // 静态内部类不能够访问外部类的非静态成员
            // System.out.println("InnerClass create b:" + b);
            System.out.println("InnerStaticClass flag is " + flag);
            System.out.println("InnerStaticClass tt is " + static_value);
        }

        public int getValue() {
            // 静态内部类访问外部类的静态方法
            test();
            return 1;
        }

        public static String getMessage() {
            return "static-inner";
        }
    }

    public OutClassTest() {
        // new一个非静态的内部类
        InnerClass ic = new InnerClass();
        System.out.println("OuterClass create");
    }

}

/**
 * 总结: 
 * 1.静态内部类可以有静态成员(方法,属性),而非静态内部类则不能有静态成员(方法,属性)。
 * 2.静态内部类只能够访问外部类的静态成员,而非静态内部类则可以访问外部类的所有成员(方法,属性)。
 * 3.实例化一个非静态的内部类的方法:
 *  a.先生成一个外部类对象实例
 *  OutClassTest oc1 = new OutClassTest();
 *  b.通过外部类的对象实例生成内部类对象
 *  OutClassTest.InnerClass no_static_inner = oc1.new InnerClass();
 *  4.实例化一个静态内部类的方法:
 *  a.不依赖于外部类的实例,直接实例化内部类对象
 *  OutClassTest.InnerStaticClass inner = new OutClassTest.InnerStaticClass();
 *  b.调用内部静态类的方法或静态变量,通过类名直接调用
 *  OutClassTest.InnerStaticClass.static_value
 *  OutClassTest.InnerStaticClass.getMessage()
 */

refs:
http://hi.baidu.com/zhumulangma/item/bcd478c140427b2cef466532
http://duqiangcise.iteye.com/blog/697476

ENVI5.6 自动化流程:GF系列卫星影像批处理与质量优化 本文详细介绍了如何利用ENVI5.6构建针对GF-2、GF-6、GF-7系列卫星影像的自动化批处理流水线。通过配置Batch Processing工具,实现从正射校正到图像融合的全流程批量处理,并分享参数设置、质量监控与故障排查的实战经验,旨在显著提升海量遥感影像的处理效率与成果质量。 阅读详情

相关推荐

从实习生到独立上手:我是如何用海思PQTool搞定IPC图像调试的

本文分享了从实习生到独立使用海思PQTool进行IPC图像调试的成长历程。通过工具搭建、核心参数调整和实战案例,详细介绍了如何高效解决图像质量问题,特别强调了ISP调试中的关键参数和实用技巧,适合刚入门的图像调试工程师参考。

weixin_33756596的博客 313

Java内部类:静态与非静态内部类

依赖关系成员内部类必须绑定到外部类实例(静态内部类独立存在(直接访问权限成员内部类可以访问外部类的所有成员(包括private实例字段/方法)。静态内部类只能访问外部类的static成员。静态成员支持成员内部类不能有static方法/字段(除非是常量)。静态内部类可以自由定义static成员。内存管理成员内部类隐式持有外部类引用(可能导致内存泄漏)。静态内部类不持有外部类引用,更安全。

SoulruiA的博客 1934

Calibre提参实战:如何用hcell和xcell文件精准屏蔽模块(附避坑指南)

本文详细解析了Calibre提参过程中hcell和xcell文件的应用技巧,帮助工程师精准屏蔽模块以优化寄生参数提取。通过对比hcell与xcell的核心差异、图形界面与命令行操作指南,以及常见问题排查方法,提升芯片后端设计效率。附避坑指南,解决EETOP论坛热议的模块丢失问题。

weixin_26795617的博客 440

java 中静态内部类与普通内部类的区别

注:static修饰的内部类,是一种较为特殊的内部类,Java文档中描述static修饰的内部类:一旦内部类使用static修饰,那么此时这个内部类就升级为顶类。也就是说,除了写在一个类的内部以外,static内部类具备所有外部类的特性,同外部类没有分别。一般之定义和使用静态内部场景:该内部类仅外部类用到,以此减少类文件数量,方便代码维护和管理。2)普通内部类可访问外部类的静态和非静态成员变量和方法(包括私有属性),因其在外部类内部;5)类的内部,可定内部接口,并且可定义一个内部类实现这个内部接口。

春风化雨 2204

2.4G/4G天线共存方案:Air8101多频段隔离设计实战(附波长计算表)

本文深入探讨了物联网设备中Wi-Fi 2.4GHz与4G LTE天线共存设计的实战方案。针对B40与2.4G频段紧邻带来的干扰挑战,文章系统性地提出了空间隔离、PCB布局优化、结构设计三重防线,并提供了关键的波长计算工具与系统级验证Checklist,旨在帮助工程师将多频段隔离设计从“玄学”变为可执行的工程规范。

weixin_29197051的博客 390

计量经济学(因果关系探究-空间双重差分模型: 破解空间溢出效应的因果分析工具)

本文介绍了传统双重差分(DID)模型及其局限性,重点阐述了空间DID模型的必要性。传统DID通过组间差分分离干预效应,但无法处理空间溢出效应。空间DID模型引入空间计量方法,包括三种类型:空间自回归模型(SDID-SAR)捕捉因变量溢出,空间误差模型(SDID-SEM)处理残差相关性,空间杜宾模型(SDID-SDM)同时考虑因变量和自变量的空间滞后。模型选择需结合空间相关性检验,适用于环境政策、房地产限购等存在空间交互效应的研究场景。

YBAdvanceFu的博客 2033

java内部类总结 问题:内部类、静态内部类区别、使用场景?

问题:内部类、静态内部类区别、使用场景? 1.静态内部类可以有静态成员(方法,属性),而非静态内部类则不能有静态成员(方法,属性)。 2.静态内部类只能够访问外部类的静态成员,而非静态内部类则可以访问外部类的所有成员(方法,属性)。 3.实例化方式不同: (1)实例化成员内部类“” 通过外部类对象创建 OutClassTest oc1 = new OutClassTest(); OutClassT...

BIGBAI的博客 1764

Jaspersoft Studio 6.20.0 免注册安装指南(附下载链接)

本文提供了Jaspersoft Studio 6.20.0社区版的免注册安装详细指南。文章介绍了绕过官网注册获取安装包的多种可靠途径,并逐步详解了从启动安装器到首次运行的全过程,帮助用户快速完成安装与基础配置,高效开启报表设计工作。

mars5的博客 1697

java普通内部类和静态内部类的区别

java普通内部类和静态内部类的区别

质量不太好的博客 5104

银河麒麟V10-ARM架构-postgresql安装与部署指南

本文详细介绍应用源码进行pgsql的安装步骤,本文以postgresql-12.0为例。提示:以下是本篇文章正文内容,下面案例可供参考银河麒麟系统安装程序比较繁琐,潜在问题比较多,个人建议均通过源码自定义编译安装。国产系统还需努力啊!

idols_man的博客 1万+

YOLOv8极速瘦身实战:LAMP剪枝让模型又快又准

一个庞大的模型虽然强大,但在实际部署,尤其是资源受限的边缘设备(如无人机、移动电话、嵌入式系统)上,却面临着严峻的挑战:高昂的内存占用、巨大的计算量以及随之而来的高延迟和高能耗。本教程从LAMP剪枝的深刻理论出发,详细解释了它如何通过最小化最坏情况下的L2失真,并借助巧妙的数学简化,最终推导出一种高效、无超参数、层自适应的剪枝策略。它如同为臃肿的模型进行一次精准的“瘦身手术”,通过移除网络中冗余或不重要的权重、神经元甚至整个结构,来显著降低模型的参数量和计算量(FLOPs),从而实现推理加速和资源节约。

FJN110的博客 259

Java--【面向对象】内部类和静态内部类的区别

内部类和静态内部类的区别 定义在一个类内部的类叫内部类,包含内部类的类称为外部类。 内部类可以声明public、protected、private等访问限制,可以声明为abstract的供其他内部类或外部类继承与扩展,或者声明为static、final的,也可以实现特定的接口。 外部类按常规的类访问方式使用内部类,唯一的差别是外部类可以访问内部类的所有方法与属性,包括私有方法与属性 创建...

姜皓的博客 512

安川机器人外部轴添加

本文详细介绍了如何在安川机器人本体上添加第7轴以及如何设置动作,本文以添加点焊枪为例进行讲解。

haier123888的博客 7895

kotlin静态内部类和java静态内部类的区别

首先我们看下RecyclerView的ViewHolder的写法,java和kotlin分别用静态内部类进行实现,代码是随意找的: java静态内部类: static class EndViewHolder extends BlocksView.ViewHolder { public EndViewHolder(View itemView) { super(itemView); itemView.setMinimumHeight

王温暖的博客 8151

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

java的静态成员和静态方法,非静态内部类和静态内部类的区别

这里的静态,指以static关键字修饰的,包括类,方法,块,字段。非静态,指没有用static 修饰的。静态有一些特点:1.全局唯一,任何一次的修改都是全局性的影响2.只加载一次,优先于非静态3.使用方式上不依赖于实例对象。4.生命周期属于类级别,从JVM 加载开始到JVM卸载结束。 静态方法和实例方法的区别主要体现在两个方面: 在外部调用静态方法时,可以使用"类名.方法名"的方式,也

xieliang0717的博客 881

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

java:静态内部类和内部类区别及作用

1背景 看SM之前给我重构的kafka消费者的代码,kafka消费者的初始化、订阅主题、消息拉取聚合到一个静态内部类当中,外部类的中的单例和消息map再以实例的方式注入到静态内部类当中,代码结构大致如下: class KafkaService { //单例 public static SingltonHoler{ private static KafkaService singlton=new ...

jeason_chan_zju的博客 649

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java面试题—内部类和静态内部类的区别

内部类: 1、内部类中的变量和方法不能声明为静态的。 2、内部类实例化:B是A的内部类,实例化B:A.B b = new A().new B()。 3、内部类可以引用外部类的静态或者非静态属性及方法。 静态内部类: 1、静态内部类属性和方法可以声明为静态的或者非静态的。 2、实例化静态内部类:B是A的静态内部类,A.B b = new A.B()。 3、静态内部类只能引用外部类的静态的属性及...

weixin_43770982的博客 288

Java中静态内部类和非静态内部类的区别

在一个类中定义的类叫内部类,内部类可以为静态内部类(用static关键字修饰),也可以为非静态内部类(普通类)。 区别一: 静态内部类可以有静态成员变量和方法,非静态内部类只能有非静态的成员变量和方法。也就是说,在内部类中如果要定义静态成员,则该内部类一定要用static关键字声明为静态的。(跟抽象类类似,如果要在类中定义抽象方法,则该类一定要声明为抽象类)。 区别二:...

yuncaidaishu的博客 1830

java 内部类 静态方法_java 内部类和静态内部类的区别

下面说一说内部类(Inner Class)和静态内部类(Static Nested Class)的区别:定义在一个类内部的类叫内部类,包含内部类的类称为外部类。内部类可以声明public、protected、private等访问限制,可以声明 为abstract的供其他内部类或外部类继承与扩展,或者声明为static、final的,也可以实现特定的接口。外部类按常规的类访问方式使用内部 类,唯一的...

weixin_39889481的博客 318

Java内部类和嵌套静态类区别

Java 必知必会 第 54 篇 java inner class and static nested class Java内部类和嵌套静态类 问题 Java 当中的内部类和静态嵌套类有什么主要区别? 在这两者中有什么设计或者实现么? 回答 嵌套类分为两类: 静态和非静态. 用static装饰的嵌套类叫做静态类, 非静态的嵌套类叫做内部类. 静态嵌套类使用外围类名来访问: OuterClass.S...

十年互联网开发老兵,陪你一起学技术 331

Java中静态内部类和非静态内部类有什么区别?

Java中的内部类是在Jdk1.1版本之后增加的,内部类是Java语言中一个比较重要的概念,如果能把内部类运用好,那么会明显增强Java程序的灵活性。 要想清楚static内部类和非static内部类的区别,首先要了解内部类的概念及特点,然后再进行一个全面的对比。 什么是内部类呢?简单的说就是在一个类的内部又定义了一个类,这个类就称之为内部类(Inner Class)。看一个简单的例子: 内...

vcliy的博客 7万+

6 定义静态类_Java基础:Java 内部类和静态内部类的区别

java 内部类和静态内部类的区别下面说一说内部类(Inner Class)和静态内部类(Static Nested Class)的区别:定义在一个类内部的类叫内部类,包含内部类的类称为外部类。内部类可以声明public、protected、private等访问限制,可以声明 为abstract的供其他内部类或外部类继承与扩展,或者声明为static、final的,也可以实现特定的接口。外部类按常...

weixin_35995951的博客 99

Java基础:Java 内部类和静态内部类的区别

内部类(Inner Class)和静态内部类(Static Nested Class)的区别: 定义在一个类内部的类叫内部类,包含内部类的类称为外部类。内部类可以声明public、protected、private等访问限制,可以声明 为abstract的供其他内部类或外部类继承与扩展,或者声明为static、final的,也可以实现特定的接口。 外部类按常规的类访问方式使用内部 类,唯一的差别是...

TuT 1万+

java中内部类和静态内部类区别

java中内部类和静态内部类的区别

qq_35368296的博客 1304

Java 成员内部类和静态内部类有什么区别?

Java成员内部类和静态内部类有什么区别?解答。。。

Regino的博客 733
上一篇: 文件操作liunx
下一篇: 前面 FLink 的文章中我们已经介绍了说 Flink 已经有很多自带的 Connector。
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值