zoukankan      html  css  js  c++  java
  • Java初始化与清理

    目录:
    1、方法重载
    2、this关键字
    3、垃圾回收
    4、Java初始化顺序

     1、方法重载

     产生的原因:构造器的名字已经由类所决定,如果想用多种方式创建一个对象,需要不同的构造器。为了让方法名相同而形式参数不同的构造器同时存在,就要用到方法重载。

     区分重载的方法:

    1. 每个重载方法都应该有一个独一无二的形参列表。
    2. 参数顺序不同,也可以区分两个方法。(但是这样难以维护代码,不推荐使用)

     注意事项:

    • 不能够以返回值的不同来区分重载方法;
    • 传入的数据类型,小于方法中形参类型,实际数据类型将会被提升;
    • 传入数据类型,大于方法中形参类型,会通过类型转换来执行窄化转换。

      2、this关键字

     定义: this关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用。
     当需要明确指出对当前对象的引用时,才需要使用this关键字。例如:

    public class Leaf{
    	int i = 0;
    	Leaf increment(){
    		i++;
    		return this;
    	}
    	void print(){
    		System.out.println("i = " + i);
    	}
    	public static void main(String[] args){
    		Leaf x = new Leaf();
    		x.increment().increment().print();
    	}
    }
    /*output:
    i = 3
    */
    

      2.1、在构造器中调用构造器

     使用this关键字,在一个构造器中调用构造器,避免重复代码。

     注意事项:

    • 在一个构造方法中,不能同时调用两个构造器;
    • 必须将构造器调用置于最起始处;
    • 除构造方法外,其他任何方法中都不得调用构造器;
    import static net.mindview.util.Print.*;
    
    public class Flower{
    	int petalCount = 0;
    	String s = "initial value";
    	Flower(int petals){
    		petalCount = petals;
    		print(petalCount);
    	}
    	Flower(String ss){
    		s = ss;
    		print(s);
    	}
    	Flower(String s, int petals){
    		this(petals);
    		this.s = s;//使用this.s,用来区分类成员变量与方法中的局部变量s
    		print("String and int");
    	}
    	Flower(){
    		this("hi",47);
    		print("no args");
    	}
    	public static void main(String[] args){
    		Flower x = new Flower();
    	}
    }
    
    /*OutPuts:
    47
    String and int
    no args
    */

      2.2、static的含义

      static方法又称为“类方法”。

    1. static方法是没有this的方法
    2. static方法内部不能调用非静态方法
    3. 非静态方法内部可以调用static方法
    4. 可以通过类本身来调用static方法

      3、垃圾回收机制

     垃圾回收不保证一定会发生。如果JVM并未面临内存耗尽的情形,它是不会浪费时间去执行垃圾回收以恢复内存的。
     垃圾回收器对于提高对象的创建速度,具有显著的效果。这也意味着Java从堆分配空间的速度,可以和其他语言从堆栈分配空间的速度相媲美。

    垃圾回收器至关重要。JVM主要采用了一下几种方式,进行垃圾回收:

    1. 停止-复制: 先暂停程序运行,将所有存活的对象从当前堆复制到另一个堆中。
      优点: 复制到新堆后,对象总是一个挨着一个的,保持紧凑排列,可以简单直接的分配新的空间。
      缺点: 需要两块堆空间;复制起来效率低;当只有少量垃圾产生时,会很浪费资源。
    2. 标记-清扫:遍历所有引用,找出存活的对象并设一个标记(这个过程不经行清理)。当全部标记完以后,没有标记的对象将被释放。但是剩下的堆空间不是连续的。
    3. 自适应技术:Java虚拟机进行监视,如果对象都很稳定,垃圾回收器效率低,会不采用停止-复制策略,而采取标记-清扫策略。

      Java及时编译技术:将全部或部分程序翻译成本地机器码,从而提升程序运行效率。
     当需要装载某个类时:1、编译器找到.class文件;2、将该类的字节码装入内存;3、可以采取Java及时编译技术或者进行惰性评估。

      4、初始化顺序

    1. 初始化静态对象
    2. 普通对象
    3. 静态方法、构造器
    4. 普通方法

      如下代码,展示了初始化顺序:

    class Bowl
    {
        Bowl(int marker)
        {
            print("Bowl(" + marker + ")");
        }
    
        void f1(int marker)
        {
            print("f1(" + marker + ")");
        }
    }
    
    class Table
    {
        static Bowl b1 = new Bowl(1);
    
        Table()
        {
            print("Table()");
            b2.f1(1);
        }
    
    
        void f2(int marker)
        {
            print("f2(" + marker + ")");
        }
    
        static Bowl b2 = new Bowl(2);
    }
    
    class Cupboard
    {
         Bowl b3 = new Bowl(3);
         static Bowl b4 = new Bowl(4);
    
         Cupboard()
         {
             print("Cupboard()");
             b4.f1(2);
         }
    
         void f3(int marker)
         {
             print("f3(" + marker + ")");
         }
    
         static Bowl b5 = new Bowl(5);
     }
    public class Staticlnitialization
    {
        public static void main(String[] args)
        {
            print("在main()中新建一个Cupboard");
            new Cupboard();
    
            print("在main()中再建一个Cupboard");
            new Cupboard();
    
            table.f2(1);
            cupboard.f3(1);
        }
    
        static Table table = new Table();//1
        static Cupboard cupboard = new Cupboard();
    
    }/*Output
        Bowl(1)
        Bowl(2)
        Table()
        f1(1)
    
        Bowl(4)
        Bowl(5)
        Bowl(3)
        Cupboard()
        f1(2)
    
        在main()中新建一个Cupboard
        Bowl(3)
        Cupboard()
        f1(2)
    
        在main()中再建一个Cupboard
        Bowl(3)
        Cupboard()
        f1(2)
    
        f2(1)
        f3(1)
        *///:~
  • 相关阅读:
    【结对开发】电梯调度 一(从电梯布局分配考虑)需求分析及设计思路。
    【结对开发】求一个整数数组的所有子数组中和的最大值。
    【测试用例选取及异常处理】 之 求一个数组中的最大整数。
    互测测评报告
    绩效考核
    冲刺5
    写个烂android一天到晚活累死,
    冲刺3
    冲刺2
    冲刺1
  • 原文地址:https://www.cnblogs.com/ryyy/p/14228180.html
Copyright © 2011-2022 走看看