编程思想中这一章很“沉着冷静”的起了个名字,叫做“初始化与清理”。实则这一章是非常直击内部原理性的一章,在对象初始化与GC方面,是一个做Java的程序员从初级晋升高级的必经之路。Java领域,你必须紧紧的扎实的学好初始化与GC,清晰的懂得这之中的很多原理性的知识,才能为以后的Java开发工作打下一个良好的基础。因为Java在效率方面的注重尤为重要。用好Java,效率可以大大的提升,用不好,嘿嘿~~~如何用好,这两个地方的知识是关键。在这一章的总结中,我先把书上面的知识梳理出来,然后我又在网上与技术微信公众号上面找了两篇文章来仔细阅读了下,我也在后面的博客中逐渐总结出来,分别是有关于Java对于内存的管理与JavaGC的原理与算法,很关键,以后会多多钻研~
进入和Gloria相处模式。熟话说:相爱容易,相处难。其实是这样的。虽然离一起住还有那么几天,不过以我长几nian的心智来看,我和她还有的磨合,未来的路还很长。不过就开端来看,我觉得不错,因为我们相互内心没有纠结,没有不满,没有填埋伤痕。在极为正常的境况下在一起,相处这事儿是对情侣就是难事儿,不要怕,慢慢来,都会过去,因为遇到你,我知足了~~
1、想先写写代码,来点无意义的代码联系,手部预热~就是一个带有构造器的简单类:class Rock{ Rock(){// This is the constructor System.out.println("Rock"); }}public class SimpleConstructor{ public static void main(String[] arg){ for(int i=0;i<10;i++){ new Rock(); } }}
无论出现什么类型的构造器(有参数或是无参数的),那么系统默认添加的构造器都将失效!构造器重载是促成方法重载一个重要的原因!因为类名就一个,可是我们想用不同的方式进行类的创建,必须进行构造器的重载。
2、区分重载的方法其实很简单:每个重载的方法都必须有一个独一无二的参数类型列表。参数顺序不同也可以算是重载
3、在有基本类型作为参数的方法上的重载,有几个要注意的点:在传进来的实参,遵循以下的重载方法的匹配顺序:首先找有没有本身的基本类型相匹配,如果没有将原实参基本类型提升至最小存在的形参类型,使用此形参类型的重载方法。如果实参均大于所有重载方法的形参,必须要显式的进行强制类型转换(窄化)。但是char类型有点特殊。如果char类型找不到恰好接受char参数的方法,就会把char直接提升至int类型。下面是我自己测试的代码:
public class PrimitiveOverLoading{ // void f1(byte a){System.out.println("byte")} // void f1(char a){System.out.println("char")} void f1(short a){System.out.println("short")} void f1(int a){System.out.println("int")} void f1(long a){System.out.println("long")} void f1(float a){System.out.println("float")} void f1(double a){System.out.println("double")} public static void main(String[] arg){ char b = 'a'; new PrimitiveOverLoading().f1(b); byte c = 3; new PrimitiveOverLoading().f1(c); }}
4、不能根据返回类型进行判断方法重载的原因是:如果是单纯的进行方法调用,而不进行返回值的赋值操作,那么编译器将不能区分到底调用哪个方法。
5、this关键字相当于对当前类对象的引用。通过this在本类中调用本类的构造器,只能在构造器中进行调用,并不能在本类其他地方(方法)中进行调用。而且如果在构造器中用this调用其他构造器,那么必须要在第一行进行调用,否则编译器会报错。
6、在static方法的内部不能调用非静态的方法。static关键字不能应用于局部变量,只能作用于域
7、有关于GC的东西,我会在另外一篇总结文章中具体来说说,在这里我就几个TIJ中重要的给出来:①一旦垃圾回收期准备好释放对象占用的存储空间,将首先调用其finalize()方法,并在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。②对象可能不被垃圾回收③垃圾回收并不等于析构④finalize()方法的真正用途,是由于在分配内存时可能采用了类似于c语言中的做法,而非Java中的通常做法,这种情况主要发生在使用“本地方法”的情况下,本地方法是一种在Java中调用的非Java代码的方法。在非Java代码中也许会调用c的malloc()函数系列来分配存储空间,而且除非调用了free()函数,否则存储空间将得不到释放,从而造成内存的泄露,所以需要使用finalize()方法,进行本地方法的调用,进行内存释放。⑤也可以在finalize()方法中进行一些条件验证,以发现一些问题。
8、对类的成员变量进行初始化有很多方法,可以在生面的地方进行初始化(C++11也加入了这种方式),甚至可以调用某个方法来进行初始化,测试代码如下:
public class InitialValue{ boolean bool = true; char ch = 'x'; byte = 2; short s = 0xff; int i = 3; float f = f(); float f(){return 0.34f}}
9、下面是一个类各种数据(static、非static),在对象创建的过程中,初始化的顺序:①即使没有显式的使用static关键字,构造器实际上也是静态方法,因此当首次创建类的对象时(构造器可以看成静态方法),或者类的静态方法\静态域首次被访问时,Java解释器必须查找类路径,以定位.class文件②然后载入.class文件(会创建一个Class类型的对象),有关静态初始化的所有动作都会执行。因此,静态初始化只在Class对象首次加载的时候进行一次③当用new 进行对象的创建的时候,首先将在堆上位对象分配足够的存储空间。④这块存储空间将被清零,这就是自动的将对象中的所有基本类型的数据都设置成了默认值(对数字来说就是0,对布尔和char类型也相同),而引用则被设置成了null⑤执行所有出现在字段定义处的初始化动作⑥执行构造器。
10、数组的两种方式初始化,直接上代码,有注释:
public class ArryString{ public static void main(String[] arg){ String[] str = {"jicheng","jasdkf"};//这种智能在定义数组的地方使用 String[] s = new String[]{"jicheng","jiasdjfiasd"};//这种可以在任何地方进行使用,例如参数传递的时候 }}
11、如果要使用可变参数这种方式,要遵循一个原则:只在重载方法的一个版本上使用可变参数列表,或者压根就不使用它