Java初始化与清理的一些琐碎知识

Java初始化与清理的一些琐碎知识

1.用构造器确保初始化

  • Java用构造器来时每一个对象初始化,编译器会调用构造器会在用户有能力操作之前对对象进行初始化。

    构造器:构造器的名称与类的名称完全相同,而且如果不手动写构造器的话,Java会产生一个默认的构造器,当手动书写构造器之后,Java将不再产生默认的构造器。构造器是可以有参数的,我们称之为含参构造。

  • 构造器是一种特殊类型的方法,因为他没有返回值,不是返回值为空(void) .

  • 在使用构造器时,可能为一个类写了多个构造器,有时可能在一个构造器中调用另外一个构造器, 以避免重复代码,this关键之可以实现。我们看下面一个例子更好的理解:

package nwpu;

import java.util.IntSummaryStatistics;

public class Flower{
	 int sum;
	 String s;

	 public Flower(int sum) {
    		System.out.println("这是一个含有int类型的构造"+sum);
    	}
    	 
    	 public Flower(String ss) {
    		System.out.println("这是一个含有String类型的构造"+ss);
    		s=ss;
    	 }	
    	 
    	 public Flower(String string, int sum) {
    		 this(sum);
    		 this.s=s;
    		 System.out.println("这是一个含有两个参数的构造");
    		}
    	 public Flower() {
    		this("hi",47);
    		System.out.println("无参构造");
    	}
    	 void printint() {
    		 //this(11);
    		 System.out.println("sun"+sum+"s"+s);
    	 }
    	 
    	 public static void main(String[] args) {
    		Flower xFlower=new Flower();
    		xFlower.printint();
    	}
    }

//out
/**
这是一个含有int类型的构造47
这是一个含有两个参数的构造
无参构造
sun0snull
*/

2.方法重载

  • 方法的重载是为了是的具有相应同名字的方法变得合法,例如当你想拥有多个构造方法时,你就会使用到方法的重载。

    重载的规则:每个重载的方法都必须拥有一个独一无二的参数列表,甚至说,参数的的孙旭不同也可以区分两个方法(这会使得代码难以维护)

    涉及基本类型的重载:我们会发现,在将基本类型传递给重载方法时,如果传入的数据类型小于方法声明的形式参数类型时,实际数据类型就会被提升。char类型比较特殊,它会被提升到int型。(例子p160)如果传入的实际参数较大,就得通过类型转换来执行窄化转换,否则编译器就会报错。

3.Java的垃圾回收器是如何工作

  • 首先,我们要明确一点垃圾回收只与内存有关。

    下面我们来了解一下Java垃圾回收器所依据的思想:对任何“活”的对象,一定追溯到其存活在堆栈或静态存储区中的引用。这个引用链条可能会穿过数个对象层次。由此如果从堆栈和静态存储区开始,遍历所有的引用,就能找到所有“活”的对象。对于发现的每个引用,必须追踪他引用的对象,然后是此对象多包涵的全部引用,如此反复进行,直到“根源于堆栈和静态存储区的引用”所形成的网络全部被访问为止。

    基于这种方式,Java虚拟机将采用一种自适应的垃圾回收技术,至于如何处理找到的存活对象,取决于不同java虚拟机的实现。有一种方法名为停止-复制 :显然这种方法就是先暂停程序的运行(所以它不属于后台回收模式),然后将所有存活的对象从当前堆复制到另一个堆,没有被复制的全部是垃圾。当对象被复制到新堆时,他们一个挨着一个紧凑排列(可以提高效率)。

    当然这种方式存在着问题,首先就是空间问题,再者程序稳定后垃圾产生就会减少,就会产生浪费。为了解决问题,一些Java虚拟机会进行检查:要是没有新的垃圾产生,就会转换到另外一种工作模式(即自适应),种种模式为标记-清扫 :这种方法思路都是遍历所有引用,进而找出所有存活对象。每当找到存货对象就会对其进行标记,完成全部标记任务后,就会清理未标记的对象。细节见(Java编程思想P180)

4.关于初始化的一些问题

  • 我们直接给出结论:具体例子p187

    (1)在一个不存在继承的类中:初始化static变量,执行static初始化快–>初始化普通成员变量(如果有赋值语句),执行普通初始化块–>构造方法
     (2)在一个存在继承的类中:初始化父类static成员变量,运行父类static初始化块–>初始化子类static成员变量,运行子类static初始化块–>初始化父类实例成员变量(如果有赋值语句),执行父类普通初始化块–>父类构造方法–>初始化子类实例成员变量(如果有赋值语句)及普通初始化块–>子类构造方法。

发布了12 篇原创文章 · 获赞 0 · 访问量 99

猜你喜欢

转载自blog.csdn.net/adressdeep/article/details/104868863