您的位置:首页 > 编程语言 > Java开发

五、JAVA中类的探究-类变量的初始化时机

2015-06-09 16:30 351 查看

一、类变量的初始化时机

(1)

JAVA的类不同于C++的类 能在类里执行main函数就是让我惊奇的一点

JAVA程序可以在这两个地方对类变量执行初始化:

定义类变量时指定初始值

静态初始化快中对类变量指定初始值

代码如下

public class StaticInitTest
{
static int count = 2;
static
{
System.out.print("StaticInitTest的静态初始化块:");
name = "JAVA编程";
}

static String name = "crazy JAVA";

public static void main(String[] args)
{
System.out.println("count类变量的值:" + StaticInitTest.count);
System.out.println("name类变量的值:" + StaticInitTest.name);
}

}


运行结果

StaticInitTest的静态初始化块:count类变量的值:2

name类变量的值:crazy JAVA

学习心得

针对name类:先赋值为”JAVA编程“ 再赋值为”疯狂JAVA讲义“ 

但运行程序一次 只初始化一次

——————————

百度知道上对于我的疑问的解释:

java属于边解释边执行的语言,java编译的结果是class文件,并能直接在机器上运行,而是又java虚拟机代理的,java虚拟机在解释时是先遍历class文件的,把class文件中所涉及到的类都会遍历到,直接加载到内存中

(2)

代码如下

class Price
{
final static Price INSTANCE = new Price(2.8);
static double initPrice = 20;
double currentPrice;

public Price(double discount)
{
currentPrice = initPrice - discount;

}

public static void main(String[] args)
{
System.out.println("通过Price的INSTANCE访问currentPrice实例变量:"
+ Price.INSTANCE.currentPrice);
Price P = new Price(3.5);
System.out.println("通过显示创建的Price实例P访问currentPrice实例变量:"
+ P.currentPrice);
}

}


运行结果

通过Price的INSTANCE访问currentPrice实例变量:-2.8

通过显示创建的Price实例P访问currentPrice实例变量:16.5

学习心得

对INSTANCE赋值时调用Price(2.8) 创建Price实例

此事立即执行currentPrice赋值 initPrice类变量的值=0

故currentPrice=0-2.8=2.8 程序再将initPrice赋为20

当Price类初始化完成后 INSTANCE类变量引用到一个currentPrice为-2.8的Price实例

此时initPrice=20.0

————————————

final方法

将方法声明为final,那就说明你已经知道这个方法提供的功能已经满足你要求,不需要进行扩展,并且也不允许任何从此类继承的类来覆写这个方法,但是继承仍然可以继承这个方法,也就是说可以直接使用。另外有一种被称为inline的机制,它会使你在调用final方法时,直接将方法主体插入到调用处,而不是进行例行的方法调用,例如保存断点,压栈等,这样可能会使你的程序效率有所提高,然而当你的方法主体非常庞大时,或你在多处调用此方法,那么你的调用主体代码便会迅速膨胀,可能反而会影响效率,所以你要慎用final进行方法定义。

final类

当你将final用于类身上时,你就需要仔细考虑,因为一个final类是无法被任何人继承的,那也就意味着此类在一个继承树中是一个叶子类,并且此类的设计已被认为很完美而不需要进行修改或扩展。对于final类中的成员,你可以定义其为final,也可以不是final。而对于方法,由于所属类为final的关系,自然也就成了final型的。你也可以明确的给final类中的方法加上一个final,但这显然没有意义。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: