Chinaunix首页 | 论坛 | 博客
  • 博客访问: 904013
  • 博文数量: 75
  • 博客积分: 6236
  • 博客等级: 准将
  • 技术积分: 726
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-03 14:43
文章分类

全部博文(75)

文章存档

2019年(1)

2018年(6)

2017年(4)

2015年(1)

2014年(9)

2013年(1)

2012年(3)

2011年(9)

2010年(3)

2009年(2)

2008年(4)

2007年(24)

2006年(8)

我的朋友

分类: Java

2014-03-13 11:39:46

(整理自: http://zangweiren.iteye.com/blog/241218)

1、类的初始化顺序

  • 对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态 变量、静态初始化块)>(变量、初始化块)>构造器
  • 那么对于静态变量和静态初始化块之间、变量和初始化块之间的先后顺序又是怎样呢?是否静态变量总是先于静态初始化块,变量总是先于初始化块就被初始化了呢?实际上这取决于它们在类中出现的先后顺序

2、到底创建了几个String对象

    String对象在JAVA虚拟机(JVM)中的存储,以及字符串池与堆(heap)和栈(stack)的关系。我们首先回顾一下堆和栈的区别:

  • 栈(stack):主要保存基本类型(或者叫内置类型)(char、byte、short、int、long、float、double、boolean)和对象的引用,数据可以共享,速度仅次于寄存器(register),快于堆。
  • 堆(heap):用于存储对象。

    我们查看String类的源码就会发现,它有一个value属性,保存着String对象的值,类型是char[],这也正说明了字符串就是字符的序列。
    当执行String a="abc";时,JAVA虚拟机会在栈中创建三个char型的值'a'、'b'和'c',然后在堆中创建一个String对象,它的值(value)是刚才在栈中创建的三个char型值组成的数组{'a','b','c'},最后这个新创建的String对象会被添加到字符串池中。如果我们接着执行String b=new String("abc");代码,由于"abc"已经被创建并保存于字符串池中,因此JAVA虚拟机只会在堆中新创建一个String对象,但是它的值(value)是共享前一行代码执行时在栈中创建的三个char型值值'a'、'b'和'c'。

3、变量(属性)的覆盖

  • 由于private变量受访问权限的限制,它不能被覆盖。
  • 属性的值取父类还是子类并不取决于我们创建对象的类型,而是取决于我们定义的变量的类型。
  • friendly、protected和public修饰符并不影响属性的覆盖。
  • 静态变量和静态常量属于类,不属于对象,因此它们不能被覆盖。
  • 常量可以被覆盖。
  • 对于基本类型和对象,它们适用同样的覆盖规律。                              

4、final、finally和finalize的区别

  • 如果一个变量或方法参数被final修饰,就表示它只能被赋值一次,但是JAVA虚拟机为变量设定的默认值不记作一次赋值。
  • 被final修饰的变量必须被初始化。初始化的方式有以下几种:
    1. 在定义的时候初始化。
    2. 在初始化块中初始化。
    3. 在类的构造器中初始化。
  • 静态变量也可以在静态初始化块中初始化。
  • final变量(常量)和静态final变量(静态常量)未被初始化时,编译会报错
  • 静态final变量可以在构造器中初始化,却不可以在初始化块中初始化。
  • final的类的所有方法都不能被重写,但这并不表示final的类的属性(变量)值也是不可改变的




阅读(456) | 评论(0) | 转发(0) |
0

上一篇:Activity的四种launchMode

下一篇:ProGuard相关

给主人留下些什么吧!~~