java编程思想读书笔记九(Final 关键字的用法&初始化与类的装载&继承情况下的初始化)
2007-02-15 17:29
489 查看
Final 关键字的用法&初始化与类的装载&继承情况下的初始化
1、Final的数据
可以是“编译时的常量”
也可以是运行时初始化的值,这个值你以后就再也别想改了。
一个既是static 又是final的数据成员会只占一段内存,并且不可
修改
当Final不是指primitive ,而是用于对象的引用时,意思是在初始
化的时候,一旦将这个引用链接到某个对象,那么这个引用进将永远
链接在这个对象上,不能改变。但是对象本身是可以改变的。
Final参数:java允许将参数申明为Final的,这样参数也变成了
final了,这样在方法里你不能让参数指向另一个对象了。
2、Final的方法
为方法上锁
效率问题(基本可以被忽略)
3、Final类
数据可以是final的,也可以不是final的
初始化与类的装载
java采用了一种新的装载模式,所有东西都是对象,因此很多事情都变得很简单,编译之后的每个类都保存在它自己的文件里,不到需要的时候,是不会装在的。可以这样说,类的代码总是在第一次实用的时候装载,类的装载通常都发生在第一次创建那个类的对象的时候,但是访问static 数据或static 方法的时候也会装载。
第一次使用static 数据的时候也是进行初始化的时候,装载的时候static 对象和static代码段会按照他们字面的的顺序进行初始化。
* 继承情况下的初始化
class Insect{
protected static Test temp = new Test();
private int i = 9;
Insect(){
System.out.println("ok");
i = 20;
}
}
public class Beetle extends Insect{
public Beetle(){
System.out.println("okok");
}
private static int x2 = 9;
public static void main(String[] args){
Beetle b = new Beetle();
}
}
当你用java运行Beetle的时候,第一件事就是访问了mian()方法,于是装载器就会为你寻找经编译的Beetle类的代码(.class文件)在转载过程中,装载器就注意到它有一个基类,于是它在装载基类,不管你创不创建基类对象,这个过程总会发生。如果基类还有基类,那么这第二个基类也会被装载,以此类推。
下一步,他会执行“根基类”的static 初始化,然后执行下个派生类的static初始化,以此类推,这个也非常重要,因为派生类的“静态初始化”可能依赖基类的成员正确初始化。
现在所有必要的类都已经装载结束,可以创建对象了,首先对象类的所有primitive都会被设成为他们的缺省值,而references也会被设置为null,这个过程会在一瞬间完成。对象的内存会被统一的设置为“二进制的0”
然后调用基类的构造函数,调用是自动发生的,但是你可以使用super来指定调用那个构造函数,基类的构造过程以及构造顺序,同派生类相同,基类构造函数运行完毕之后,会按照各个变量的字面顺序进行初始化,最后执行构造函数的其余各个部分。
继承和合成
合成是把已有的类当作新类底层实现的一部分来复用,而继承则是复用其接口。由于派生类拥有基类的接口,因此它可以被上传到基类。
尽管面向对象的编程反复强调继承,但是当你着手设计的时候,通常情况下还是先考虑合成,只有在必要的时候才使用继承。
1、Final的数据
可以是“编译时的常量”
也可以是运行时初始化的值,这个值你以后就再也别想改了。
一个既是static 又是final的数据成员会只占一段内存,并且不可
修改
当Final不是指primitive ,而是用于对象的引用时,意思是在初始
化的时候,一旦将这个引用链接到某个对象,那么这个引用进将永远
链接在这个对象上,不能改变。但是对象本身是可以改变的。
Final参数:java允许将参数申明为Final的,这样参数也变成了
final了,这样在方法里你不能让参数指向另一个对象了。
2、Final的方法
为方法上锁
效率问题(基本可以被忽略)
3、Final类
数据可以是final的,也可以不是final的
初始化与类的装载
java采用了一种新的装载模式,所有东西都是对象,因此很多事情都变得很简单,编译之后的每个类都保存在它自己的文件里,不到需要的时候,是不会装在的。可以这样说,类的代码总是在第一次实用的时候装载,类的装载通常都发生在第一次创建那个类的对象的时候,但是访问static 数据或static 方法的时候也会装载。
第一次使用static 数据的时候也是进行初始化的时候,装载的时候static 对象和static代码段会按照他们字面的的顺序进行初始化。
* 继承情况下的初始化
class Insect{
protected static Test temp = new Test();
private int i = 9;
Insect(){
System.out.println("ok");
i = 20;
}
}
public class Beetle extends Insect{
public Beetle(){
System.out.println("okok");
}
private static int x2 = 9;
public static void main(String[] args){
Beetle b = new Beetle();
}
}
当你用java运行Beetle的时候,第一件事就是访问了mian()方法,于是装载器就会为你寻找经编译的Beetle类的代码(.class文件)在转载过程中,装载器就注意到它有一个基类,于是它在装载基类,不管你创不创建基类对象,这个过程总会发生。如果基类还有基类,那么这第二个基类也会被装载,以此类推。
下一步,他会执行“根基类”的static 初始化,然后执行下个派生类的static初始化,以此类推,这个也非常重要,因为派生类的“静态初始化”可能依赖基类的成员正确初始化。
现在所有必要的类都已经装载结束,可以创建对象了,首先对象类的所有primitive都会被设成为他们的缺省值,而references也会被设置为null,这个过程会在一瞬间完成。对象的内存会被统一的设置为“二进制的0”
然后调用基类的构造函数,调用是自动发生的,但是你可以使用super来指定调用那个构造函数,基类的构造过程以及构造顺序,同派生类相同,基类构造函数运行完毕之后,会按照各个变量的字面顺序进行初始化,最后执行构造函数的其余各个部分。
继承和合成
合成是把已有的类当作新类底层实现的一部分来复用,而继承则是复用其接口。由于派生类拥有基类的接口,因此它可以被上传到基类。
尽管面向对象的编程反复强调继承,但是当你着手设计的时候,通常情况下还是先考虑合成,只有在必要的时候才使用继承。
相关文章推荐
- 【Java学习笔记之二十】final关键字在Java继承中的用法小结
- java笔记(四)[java中的import关键词&java中的javadoc用法及注释说明&java中的final关键字&java中的内部类详解]
- java中的继承,继承中方法的重写,继承的初始化顺序,final关键字,super关键字
- JAVA第七节-继承,继承中方法重写,继承的初始化顺序,final关键字,super关键字,object类
- Java对象初始化步骤&&子类继承父类后变量与方法调用情况
- Java第11次作业:什么是继承?继承的好处?什么是覆写?super()?构造代码块?子父类初始化顺序? 抽象类能用final声明吗?final关键字声明类 方法 变量以及全局常量?抽象类的构造方法?
- java复用类(组合、继承,代理,final关键字,初始化顺序) 知识点的总结
- final 关键字 和 static 用法<转>
- Java关键字final, static的用法总结
- Java知多少(34)final关键字:阻止继承和多态
- final关键字与继承的弊端
- php中$this、static、final、const、self 等几个关键字的用法
- Java中final关键字用法总结
- JAVA中的final关键字用法实例详解
- JAVA final 、super 关键字以及继承关系中父类与子类实例变量初始化的 理解
- java关键字final、static 用法
- think in java中的初始化,final,static,继承
- final 关键字 和 static 用法
- java继承情况下初始化顺序
- 黑马程序员_final关键字的用法