- 浏览: 134177 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
jptiancai:
提供下第六种做法,多用些内存,遍历set的时候,用list删除 ...
解决ArrayList的ConcurrentModificationException -
langmanjian0212:
spring 2.5
spring中文文档下载 -
hoarhoar:
我已经更新了,现在是完整版了。请到csdn上下载,或者向我要。 ...
java编程思想第四版勘误下载 -
zzplovejava:
好,英文差有中文的先学学
spring中文文档下载 -
呆哥儿:
Service 确实 不过为什么没有得到广泛应用呢 !求教
使用泛型类简化服务层(Service)类的设计
1 非静态内部类为什么不能有静态成员,我自己总结了下,
如下代码
public class OuterClass{ class InnerClass{ private static int i; } }
对于java类加载顺序我们知道,首先加载类,执行static变量初始化,接下来执行对象的创建,如果我们要执行代码中的变量i初始化,
那么必须先执行加载OuterClass,再加载Innerclass,最后初始化静态变量i,问题就出在加载Innerclass上面,我们可以把InnerClass看成OuterClass的非静态成员,它的初始化必须在外部类对象创建后以后进行,要加载InnerClass必须在实例化OuterClass之后完成 ,java虚拟机要求所有的静态变量必须在对象创建之前完成,这样便产生了矛盾。
Verion 0.11:
对于红色标记的部分,当时理解上有误,我们知道InnerClass可以有静态常量(static final),那么InnerClass类加载一定在OuterClass对象创建之前完成,但这还不足以说明为什么非静态内部类里面不能有静态的变量(基本类型 或对象因用),这里面涉及到Java语言的定义以及JVM的类加载的原理方面的知识,我将进一步研究这个问题,技术是严谨的,也希望各位读者提出宝贵的意见。
下面是我验证的代码解释InnerClass加载是在OuterClass对象创建之前完成的:
public class OuterClass { static int k = printI(); static int printI(){ System.out.println("Inner Class is loading before creating OuterClass instance"); return InnerClass.i ; } OuterClass(){ System.out.println("OuterClass constructor"); } class InnerClass{ private static final int i = 1; } public static void main(String[] args) { OuterClass o; } } //* out: // Inner Class is loading before creating OuterClass instance
2 静态内部类可以有静态成员:
我们可以把静态内部类作为外部类OuterClass的一个静态成员,在执行类加载过程中,静态内部类在加载OuterClass后会进行初始化,同样的原理,静态内部类的静态成员也将被初始化,进行内存的分配,注意到,这时无论是内部类还是外部类,对象都没有实例化,这也说明了非静态内部类为什么不能有静态成员的原因。
public class OuterClass{ static class InnerClass{ private static int i; } }
评论
17 楼
logic
2010-06-14
对"非静态内部类不能有静态成员"发表一下自己的见解,还请大家多指教。
其实,根本原因在于sun怎么设计内部类怎么依附于外部类这个关系。
(大家可以对内部类抽象成为外部类的一个局部域,不要束缚在单独类的基本概念上,在这里是一个特殊类了。)
实际把非静态内部类比做外部类的非静态方法容易理解一点,原因和在非静态方法中定义静态成员一个道理。
其实,根本原因在于sun怎么设计内部类怎么依附于外部类这个关系。
(大家可以对内部类抽象成为外部类的一个局部域,不要束缚在单独类的基本概念上,在这里是一个特殊类了。)
实际把非静态内部类比做外部类的非静态方法容易理解一点,原因和在非静态方法中定义静态成员一个道理。
16 楼
Arron.li
2010-05-19
快乐柠檬 写道
class OuterClass{ { System.out.println(InnerClass.i);//在OuterClass类内部可能会访问InnerClass的静态成员,不保证InnerClass已初始化 System.out.println(InnerClass.ii); } class InnerClass{ private static int i; //error static final int ii=1;//OK,编译器常量,不需要对InnerClass初始化就可以读取 } }
这是因为static final是编译期常量,类加载之前就已经分配内存。
15 楼
raito_yagami
2010-05-18
回去翻翻 thinking in java 你就明白了
14 楼
快乐柠檬
2010-05-18
class OuterClass{ { System.out.println(InnerClass.i);//在OuterClass类内部可能会访问InnerClass的静态成员,不保证InnerClass已初始化 System.out.println(InnerClass.ii); } class InnerClass{ private static int i; //error static final int ii=1;//OK,编译器常量,不需要对InnerClass初始化就可以读取 } }
13 楼
Arron.li
2010-05-18
再次纠正问题:
通过进一步研究类加载的原理,我们知道Class对象仅在需要时才会被加载,static初始化是在类加载进行的,所以当我们没有使用内部类时不会加载,也就是说外部类的加载与创建于内部类的加载没有必然的联系,我们现在解释为什么非静态内部类不能有静态成员(排除静态常量)是一种java的约定,可能是sun程序员用以有别于静态内部类的考虑。
下面是解释Class对象仅在需要时才会被加载的例子:
引用
对于红色标记的部分,当时理解上有误,我们知道 InnerClass可以有静态常量(static final),那么InnerClass类加载一定在OuterClass对象创建之前完成
通过进一步研究类加载的原理,我们知道Class对象仅在需要时才会被加载,static初始化是在类加载进行的,所以当我们没有使用内部类时不会加载,也就是说外部类的加载与创建于内部类的加载没有必然的联系,我们现在解释为什么非静态内部类不能有静态成员(排除静态常量)是一种java的约定,可能是sun程序员用以有别于静态内部类的考虑。
下面是解释Class对象仅在需要时才会被加载的例子:
class Candy { static { print("Loading Candy"); } } class Gum { static { print("Loading Gum"); } } class Cookie { static { print("Loading Cookie"); } } public class SweetShop { public static void main(String[] args) { print("inside main"); new Candy(); print("After creating Candy"); try { Class.forName("Gum"); } catch(ClassNotFoundException e) { print("Couldn't find Gum"); } print("After Class.forName(\"Gum\")"); new Cookie(); print("After creating Cookie"); } } /* Output: inside main Loading Candy After creating Candy Loading Gum After Class.forName("Gum") Loading Cookie After creating Cookie *///:~
12 楼
czpsailer
2010-05-07
<pre name="code" class="java"> public class OuterClass {
public class InnerClass {
//基本数据类型和String,可以
static final int i = 0;
static final byte b = 0;
static final String str = "";
static final long l = 0;
static final double d = 0;
static final char c = 0;
static final short s = 0;
static final boolean bool = true;
static final float f = 0;
//其他类型对象,不可以
static final Object object = null; //这里编译错误
}
}</pre>
public class InnerClass {
//基本数据类型和String,可以
static final int i = 0;
static final byte b = 0;
static final String str = "";
static final long l = 0;
static final double d = 0;
static final char c = 0;
static final short s = 0;
static final boolean bool = true;
static final float f = 0;
//其他类型对象,不可以
static final Object object = null; //这里编译错误
}
}</pre>
11 楼
Aoogoo
2010-05-07
等lz研究清楚了,再来给我们讲解
10 楼
coffeesweet
2010-05-07
final定义了常量,可以直接初始化
9 楼
Arron.li
2010-05-07
查了下sun公司java language specification,提到内部类的规范:
Inner classes may not declare static initializers (§8.7) or member interfaces. Inner classes may not declare static members, unless they are compile-time constant fields (§15.28).
对于非静态内部,可以有编译常量,不过至于为什么,还有待于进一步研究。
参考网址:http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.1.3
Inner classes may not declare static initializers (§8.7) or member interfaces. Inner classes may not declare static members, unless they are compile-time constant fields (§15.28).
对于非静态内部,可以有编译常量,不过至于为什么,还有待于进一步研究。
参考网址:http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.1.3
8 楼
realcbb
2010-05-07
关注这个问题.非静态内部类的final静态成员是何时初始化的?
singleton有一种写法就是这样的,这种写法到底是否比饿汉式好一直没搞清楚.
singleton有一种写法就是这样的,这种写法到底是否比饿汉式好一直没搞清楚.
7 楼
chenxr
2010-05-07
加final变量为常量了,这要区别 静态常量 与 静态变量 吧
6 楼
玲cc
2010-05-07
为什么ls的这种写法可以呢?
求教了
求教了
5 楼
Arron.li
2010-05-06
Agrael 写道
Arron.li 写道
Agrael 写道
public class OuterClass{ class InnerClass{ private static final int i = 1; } }
这样写。
首先static 成员不直接赋值同样也会完成自动初始化,楼上的写法没有本质的区别。
呵呵,这个区别大了,你去试下吧。
才看清楚,原来多了个final,回去好好研究下,谢谢你
4 楼
Agrael
2010-05-06
Arron.li 写道
Agrael 写道
public class OuterClass{ class InnerClass{ private static final int i = 1; } }
这样写。
首先static 成员不直接赋值同样也会完成自动初始化,楼上的写法没有本质的区别。
呵呵,这个区别大了,你去试下吧。
3 楼
Arron.li
2010-05-06
Agrael 写道
public class OuterClass{ class InnerClass{ private static final int i = 1; } }
这样写。
首先static 成员不直接赋值同样也会完成自动初始化,楼上的写法没有本质的区别。
2 楼
Agrael
2010-05-06
public class OuterClass{ class InnerClass{ private static final int i = 1; } }
这样写。
1 楼
Arron.li
2010-05-06
对于非静态内部类不能有静态成员,核心问题是在内部类的加载原理,个人认为执行内部类加载,是在外部类对象创建之后。
发表评论
-
毕业两年我学到了什么
2010-06-04 14:34 1251明天就要离开我现在的 ... -
java反射机制与动态代理
2010-06-02 16:42 16711 java反射机制:运行时的类信息 Class类与java ... -
浅析java回调机制与观察者模式
2010-06-02 10:38 41731 java回调机制: 首先解释java回调机制,对象能够携 ... -
java编程思想第四版勘误下载
2010-05-25 17:08 1209此文档是在CSDN下载的,提供javaeye社区下载 -
java泛型通配符-协变与逆变
2010-05-24 12:36 5656周末研究了下java泛型,关于泛型通配符的协变与逆变问题,题目 ... -
java反射机制-通过非默认构造器创建对象
2010-05-21 12:27 3589今天研究了下java反射机制,并利用反射机制,通过非默认构造器 ... -
类的初始化顺序
2010-05-02 10:39 11571 对于继承来讲,初始化次序大致如下: 1)父类的静态变量和 ... -
解决ArrayList的ConcurrentModificationException
2010-04-15 22:19 250711 问题 :在list<String> 中清 ... -
日期的加减法
2010-03-24 15:30 1842今天小试了日期的加减法,功能实现了,但觉得代码很长,有更好的解 ... -
JDK1.5 新特性
2009-07-08 11:12 849"JDK1.5"的一个重要主题就是通过新增 ... -
JAVA反射机制的学习
2009-07-07 14:07 1058原文:http://www.iteye.com/t ... -
JAVA多线程
2009-07-02 14:14 933原文出处:http://www.iteye.com/topic ... -
java虚拟机的类装载
2009-06-25 17:19 791原文出处:http://webservices.ctocio. ... -
JAVA面试试题解惑系列(创建几个String对象)
2009-06-22 15:33 1123作者:臧圩人(zangweiren) 网址:http:/ ... -
JAVA面试题解惑系列(类的初始化顺序)
2009-06-22 10:57 789网址:http://zangweiren.iteye.com ... -
java参数传递总结
2008-12-13 12:53 905以前学习C的 时候参数传递的方式有两种,一种叫"值传 ...
相关推荐
Handler对象中使用匿名内部类或非静态内部类正确地释放消息避免内存泄漏或增加Native内存,在Android中,Handler对象通常会被用来在主线程(UI线程)中处理消息,以更新UI界面。当我们在Handler对象中使用匿名内部类...
一般地,线程要读写类的私有成员变量,只有两种方法:将全局函数声明为类友元friend,或者使用静态的成员函数static。...本例就是自己的研究成果,使用非静态的成员函数作为线程函数,还能修改类的非静态的数据成员。
java 利用反射获取内部类静态成员变量的值操作.docx
NULL 博文链接:https://xutao5641745.iteye.com/blog/939912
静态内部类
- 不同类型的内部类(静态内部类、成员内部类、局部内部类和匿名内部类)的区别和用法 - 内部类的优缺点以及使用场景 这些目标将帮助你理解和掌握内部类的概念,并能够在适当的时候使用内部类来解决问题...
java 静态内部类的使用规范 java 静态内部类的使用规范
java静态内部类(嵌套类)的实例 。嵌套类意味着: 1. 要创建嵌套类的对象,并不需要其外围类的对象。 2. 不能从嵌套类的对象中访问非静态的外围类对象。
浅谈Java内部类的四个应用场景,txt格式。 介绍了Java内部类,适合新手。
15.java静态内部类(相当于外部类).zip15.java静态内部类(相当于外部类).zip15.java静态内部类(相当于外部类).zip15.java静态内部类(相当于外部类).zip15.java静态内部类(相当于外部类).zip15.java静态内部...
内部类的相关知识-静态内部类,匿名内部类……内部类 静态内部类 匿名内部类 static inner
通过函数指针调用C++非静态成员函数通过函数指针调用C++非静态成员函数
C++类与对象:static静态数据成员静态成员函数.doc
静态函数成员与非静态函数成员都为类所有,对象并不存在函数的拷贝。静态成员函数和非静态成员函数的根本区别在于非静态函数由对象名.或者对象指针->调用,调用时编译器会向函数传递this指针;静态成员函数则有类名:...
直接调用类方法量:class::attribute/function,无论是静态/非静态都可以,静态static:声明类成员或方法为 static,就可以不实例化类而直接访问,不能通过一个对象来访问其中的静态成员(静态方法除外),静态成员属于类,不...
大家都知道C++中类的成员函数默认都提供了this指针,在非静态成员函数中当你调用函数的时候,编译器都会“自动”帮你把这个this指针加到函数形参里去。当然在C++灵活性下面,类还具备了静态成员和静态函数,即 ...
上次有朋友问我,java中的类可以是static吗?我给他肯定的回答是可以的,在java中我们可以有静态实例变量、静态方法、静态块。当然类也可以是静态的,下面小编整理了些关于java中的static class相关资料分享在脚本之...
首先呢我们知道c++类中的成员分为成员变量和成员函数两大类,如果再加上static给以区分的话那么会有以下四种:静态成员变量,非静态成员变量;静态成员函数,非静态成员函数 (1)成员变量 我们知道类的静态成员...
浅谈天线高对静态GPS的影响.pdf
其实我们从直观上可以很好的理解静态成员函数不能调用非静态成员变量这句话因为无论是静态成员函数还是静态成员变量,它们 都是在类的范畴之类的,及在类的整个生存周期里始终只能存在一份。然而非静态成员变量和非...