A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© sanguodouble1 中级黑马   /  2014-4-18 09:57  /  2719 人查看  /  30 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 sanguodouble1 于 2014-4-19 17:19 编辑

虽然我了解,非静态内部类不能定义静态成员变量(因为非静态内部类要依靠外部类实例存在,这与静态成员变量相矛盾)。
但我不理解,为什么static final 就可以了

代码如下所示:
  1. class Outer {
  2.         public void outMethod() {
  3.                 int outI = 10;
  4.                 class Inner {
  5.                         static int a = 5;  //编译报错
  6.                         static final int b = 10;  //编译不报错
  7.                 }
  8.         }
  9. }
复制代码
网上有人说,static final 在类加载时就被加载了,这句话在内部类中我无法理解,

求高手解释


评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

30 个回复

倒序浏览
本帖最后由 skill20 于 2014-4-18 10:25 编辑
  1. class Outer {
  2.         public void outMethod() {
  3.                 int outI = 10;
  4.                 class Inner {
  5.                         static int a = 5;  //这是一个变量;
  6.                         static final int b = 10;  //这是一个常量;常量是不是只要在其作用域就可以随便放?这里有static或没static都一样。
  7.                 }
  8.         }
  9. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

回复 使用道具 举报
static final用来修饰成员变量和成员方法,可简单理解为“全局常量”!
对于变量,表示一旦给值就不可修改,并且通过类名可以访问。
对于方法,表示不可覆盖,并且可以通过类名直接访问。
回复 使用道具 举报
本帖最后由 sanguodouble1 于 2014-4-18 10:49 编辑

可是单单final的生命期和普通变量是一样的啊(这个是其他地方查到的),
而static的生命周期在类一被加载就存在了。
所以,static final的生命周期也是类一被加载就存在了,但这与非静态类的生命周期相矛盾,
请问这个怎么解释?

换个问法,你说static final是常量,对,这个没问题。
问题是你把常量放在非静态内部类里,这个根本就是一个矛盾体啊,
就好比你能把一个static final 放在非静态方法里吗?答案当然是不能,因为非静态方法是要依靠类实例来存在的,在他还不存在的时候,里面就有一个已经存在的常量了,这根本就是荒谬。
但现在,你竟然说一个非静态内部类,可以放常量了,凭什么?


回复 使用道具 举报
Sniper_qiu 发表于 2014-4-18 10:20
static final用来修饰成员变量和成员方法,可简单理解为“全局常量”!
对于变量,表示一旦给值就不可修改 ...

问题是final的生命期和普通变量是一样的啊(这个是其他地方查到的),
而static的生命周期在类一被加载就存在了。
所以,static final的生命周期也是类一被加载就存在了,但这与非静态类的生命周期相矛盾,
请问这个怎么解释?
回复 使用道具 举报
sanguodouble1 发表于 2014-4-18 10:39
问题是final的生命期和普通变量是一样的啊(这个是其他地方查到的),
而static的生命周期在类一被加载就 ...

你这样考虑就行了,static静态,而final是最终,在一起,就表示这是一个静态的最终的变量,用在定义在类加载前就存在的,可以直接用类名访问,而且此方法可以表示在类的外面,也可以定在类内部,静态的可以访问静态的、
回复 使用道具 举报
本帖最后由 sanguodouble1 于 2014-4-18 12:11 编辑
Sniper_qiu 发表于 2014-4-18 11:29
你这样考虑就行了,static静态,而final是最终,在一起,就表示这是一个静态的最终的变量,用在定义在类 ...

兄弟,我不是要记住,我问的是原理

你就直接解释为什么
在非静态方法里 static final int a =0错的
而在非静态内部类 static final int a =0却是对的

因为这两个的生命的出生期都是一样的,都是需要依靠外部类实例被初始化的,你如果能解释就回答
回复 使用道具 举报
同求权威解答!
回复 使用道具 举报
  1. 参考链接:http://segmentfault.com/q/1010000000304968
复制代码

{:3_50:}这答案我也不会。。百度学习了下,这个答案说的不错:

每一个非静态内部类,必须维持一个对其外部类实例的应用,这就表明了非静态内部类的作用域是实例级别;而static关键字显式指定某个属性、方法或内部类的作用域是属于类级别。既然二者在语言层面要求的作用域不同,自然无法编译通过。
为什么添加final就可以了呢。final关键字的字面语义就是指明不可变,用在属性上,表示属性一旦赋值后即不可改变。与static关键字合用即表示定义一个常量,从这个角度看有点类似c++中的const。一旦作为常量,其作用域自然不再是实例级别了,而是全局级别了,只是java语言里面没有全局级别的作用域这个概念,类级别作用域其实就只是加了一个访问权限修饰的全局作用域而已。所以编译自然OK。
回复 使用道具 举报
本帖最后由 sanguodouble1 于 2014-4-18 13:01 编辑
Kelvinhu 发表于 2014-4-18 12:36
这答案我也不会。。百度学习了下,这个答案说的不错:

每一个非静态内部类,必须维持一个对其外 ...

照你这个解释,那同样的问题再问你一下好了

你就直接解释为什么
在非静态方法里 static final int a =0错的
而在非静态内部类 static final int a =0却是对的

因为这两者的作用域都是类实例级别的
回复 使用道具 举报
我觉得这个问题可以完美回答的人,应该给10分
回复 使用道具 举报
sanguodouble1 发表于 2014-4-18 13:00
照你这个解释,那同样的问题再问你一下好了

你就直接解释为什么

static只存在于类中,而不是在方法里
回复 使用道具 举报
静态变量属于类,为这个类所有对象而分享,在程序开始执行前就分配空间
回复 使用道具 举报
Kelvinhu 发表于 2014-4-18 13:12
static只存在于类中,而不是在方法里

就是问的你这个,为什么static只存在于类中,而不是在方法里
回复 使用道具 举报
sanguodouble1 发表于 2014-4-18 13:17
就是问的你这个,为什么static只存在于类中,而不是在方法里

因为static属于类啊,那你说方法里的变量作用域在哪里?不就只是在方法里面吗

那static修饰的又在哪里?任何类的实例对象都能访问,是共享的。

这样说难道不对吗 能反驳吗
回复 使用道具 举报
Kelvinhu 发表于 2014-4-18 13:27
因为static属于类啊,那你说方法里的变量作用域在哪里?不就只是在方法里面吗

那static修饰的又在哪里? ...

对啊,就是问你这个啊,


你说static的作用域是类级别,好,
那么static方法里为什么还是不能有static变量呢?
这逻辑有问题吗?
反正都是不需要实例对象就能使用的,为什么我里面不能有static变量呢?
回复 使用道具 举报
本帖最后由 Kelvinhu 于 2014-4-18 14:01 编辑

。。。。。。
回复 使用道具 举报
完了 我已晕。。。坐等答案{:3_63:}不要告诉我这是规定什么的。。。
回复 使用道具 举报
方法内部变量不能被除了Final以外的其他修饰符修饰。。。其他的我就不管了。。。{:3_47:}LZ有新答案了记得告诉下我。。。。
回复 使用道具 举报
这应该是java的编程规范规定的,内部类是被当成外部类的成员来看待的,当一个内部类不是非静态时,这个内部类必须依赖于外部类的实例对象,而如果在在内部类定义静态成员时,这个静态成员就不会依赖于外部类实例对象,这与类的成员变量的定义不符。既然java这样规定,我们只要照做就行了,
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马