非静态内部类中能不能拥有静态方法或属性?

 我来答
天罗网17
2022-07-04 · TA获得超过6191个赞
知道小有建树答主
回答量:306
采纳率:100%
帮助的人:73.3万
展开全部
最近在重读 《Think in Java》的时候,发现了下面这段话:

自己先想了下为什么普通内部类不能够包含静态属性和方法,想了半天也想不通,就到网上搜了下相关问题,结果大部分答案都是如下所示:

但是上面这个答案是不正确的,类在以下几种情况下就会进行加载:

也就是说,如果我们主类需要使用到内部类的静态方法的时候,会先初始化这个内部类,上面答案说的调用先于加载的情况就不会发生。

那为什么 Java 中不能在内部类中有静态变量和方法呢?
我觉得应该从静态内部类和非静态内部类的定义来说明。

首先我们来说说内部类的作用。
内部类是为了弥补 Java 中没有多继承的缺陷而产生的。所以静态内部类用于那些与外部类关系不是特别大,不需要调用外部类中的非静态属性和非静态方法。换句话说,静态内部类就相当于一个可以获取到其他类的静态私有属性和私有方法的类,除此之外和放在外面的类不没有什么区别。

而非静态内部类则不一样了,非静态内部类比静态内部类更像多继承一些。其能够访问外部类的所有属性和方法。非静态内部类想要做到这一点需要持有一个外部类对象的引用。那么问题就来了,如果说我们允许非静态内部类中存在静态方法,那在调用重名方法的时候怎么知道调用的是哪个方法呢?
我们先看下外部类是如何处理这种情况的:

输出结果为:

可以看出,我们可以通过 Outer.a 和 Outer.Inner.a 来确定到底使用的是哪一个方法。

但是如果是非静态内部类呢?因为非静态内部类中持有外部类对象的引用,我们如何确定想要使用的是哪个方法呢?
先看下非静态方法:

输出为:

所以对于内部类与外部类存在方法名与参数列表都相同的方法时,我们能够准确地确定执行的是哪一个方法。对于内部类对象来说,执行的一定是自己内部的方法,而不是外部类的方法。

因为我们生成的是 Testb 对象,调用的是 Testb 类中的 b 方法,如果想要调用外部类中的方法,我们不能通过内部类对象直接调用,需要通过内部类方法调用。

输出:

到现在就很明显了,如果允许内部类中有静态方法,而外部类中又有一个相同名称和参数类型的静态方法,那我们就不知道如何确认调用的是哪一个方法了。而这才是为什么非静态内部类中不能拥有静态方法或者属性的原因。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
云创
2023-07-25 广告
要找到一家更省钱的代码静态分析服务,可以考虑以下几个方面:1. 了解自身的需求和预算:首先需要了解自己的项目对代码静态分析服务的需求,以及可承受的预算范围。这将有助于缩小选择范围,找到适合自己的服务。2. 调查市场上的竞争情况:了解市场上提... 点击进入详情页
本回答由云创提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式