java为什么非静态内部类中不能有static修饰的属性,但却可以有常量?

如:publicclassInnerClassDemo{intx;classA{staticinta=0;//这样写是不合法的.staticfinalintb=0;//这... 如:
public class InnerClassDemo{
int x;
class A{
static int a = 0;//这样写是不合法的.
static final int b=0;//这样写是合法的

}
}

为什么呢?
展开
 我来答
脚气地苦奋享0W
2013-03-24 · TA获得超过132个赞
知道答主
回答量:88
采纳率:0%
帮助的人:42.1万
展开全部
说深入点吧,java类加载顺序,首先加载类,执行static变量初始化,接下来执行对象的创建,如果我们要执行代码中的变量int a 初始化,那么必须先执行加载外部类,再加载内部类,最后初始化静态变量 a ,问题就出在加载内部类上面,我们可以把内部类看成外部类的非静态成员,它的初始化必须在外部类对象创建后以后进行,要加载内部类必须在实例化外部类之后完成 ,java虚拟机要求所有的静态变量必须在对象创建之前完成,这样便产生了矛盾。
(有点绕,呵呵)
而java常量放在内存中常量池,它的机制与变量是不同的,编译时,加载常量是不需要加载类的,所以就没有上面那种矛盾。

其实常量使用是很随意的,内部类,静态内部类,匿名内部类就乱了。
但了解JVM特性你就知道有些地方为什么不让你这么用了。
沫神钢虚1F
2017-02-01 · TA获得超过2.4万个赞
知道大有可为答主
回答量:1.6万
采纳率:59%
帮助的人:1132万
展开全部
static变量初始值一定要是常量。 static变量中文名叫静态变量。它与普通的变量比起来有如下几个区别: 1)位置:静态局部变量被编译器放在全局存储区.data,所以它虽然是局部的,但是在程序的整个生命周期中存在。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
丿丶绝世好阿狸
2013-03-24
知道答主
回答量:58
采纳率:0%
帮助的人:26.7万
展开全部
对于逮捕累而言它是类属性,所以不行~望采纳~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
rayregister
2013-03-24 · TA获得超过339个赞
知道小有建树答主
回答量:100
采纳率:100%
帮助的人:65.8万
展开全部
定义一个静态的域或者方法,要求在静态环境或者顶层环境
这里静态环境具体说,你的例子里如果加上 static class A就ok

非静态内部类 依赖于一个外部类对象,而静态域/方法是不依赖与对象——仅与类相关
(细说了,就是加载静态域时,根本没有外部类对象)
因此,非静态内部类中不能定义静态域/方法,编译过不了

而常量之所以可以(不论有无static),因为java在编译期就确定所有常量,放到所谓的常量池当中。常量的机制和普通变量不一样
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友845f74e61
2013-03-24 · TA获得超过6929个赞
知道大有可为答主
回答量:4050
采纳率:50%
帮助的人:1626万
展开全部
你是想从存在的意义上来讨论这个问题吗?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 5条折叠回答
收起 更多回答(6)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式