java基础(3)---初始化与清理

随着计算机的发展,“不安全”的编程方式已逐渐成为编程代价高昂的主因之一。 初始化和清理正是涉及安全的两个问题

1用构造器确保初始化

Java中有默认构造器,是无参构造器,所以如果必要,还是使用无参构造器。也有带参数的构造器,以便指定如何创建对象。构造器确保对象被创建的时候初始化,而且Java会在用户有能力操作对象之前自动调用了相应的构造器。
  构造器命名规则:1)构造器采用与类相同的名称。2)“每个方法首字母小写”的编程风格不适用于构造器。
  注意点:在Java中,“初始化”和“创建”捆绑在一起,两者不能分离。 构造器没有返回值,如果没有构造器则为默认构造器。

2方法重载

既然构造器也是方法,那么就可以对构造器进行重载(有参构造器和无参构造器),构造器重载确保了创建对象的不同方式。当然也可以对类中的方法进行重载。这是最基本的。
  2.1区分重载方法
  1)每个重载的方法都必须有一个独一无二的参数类型列表。
  2)参数类型相同,但顺序不同也可以区分不同的方法,但是一般不要这么做,因为这会使代码难以维护。
  2.2涉及基本类型的重载
  1)如果传入的数据类型(实际参数类型)小于方法中声明的形式参数类型,实际数据类型就会被提。char类型稍有不同,如果无法找到适当的char参数的方法,就会把char直接提升为int。
  2)如果传入的实际参数大于重载方法中声明的参数,就会通过类型转化来执行窄化转化。
  2.3以返回值区分重载方法:这种方法行不通,所以还是不要用的好。

注意点:重载与重写的不同

1.重写必须继承,重载不用。
2.重写的方法名,参数数目相同,参数类型兼容,重载的方法名相同,参数列表不同
3.重写的方法修饰符大于等于父类的方法,重载和修饰符无关。
4.重写不可以抛出父类没有抛出的一般异常,可以抛出运行时异常

3. 默认构造器
  1)默认构造器的作用是创建一个“默认对象”。如果类中没有构造器,编译器自动帮你创建一个构造器。
  2)如果已经定义了构造器(无论是否有参数),编译器都不会帮你创建自动创建默认构造器。

4 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().increment().print();
  }
} /* Output:i = 3*///:~

将当前对象传递给其他方法。

class Person {
  public void eat(Apple apple) {
    Apple peeled = apple.getPeeled();
    System.out.println("Yummy");
  }
}

class Peeler {
  static Apple peel(Apple apple) {
    // ... remove peel
    return apple; // Peeled
  }
}

class Apple {
  Apple getPeeled() { return Peeler.peel(this); }
}

public class PassingThis {
  public static void main(String[] args) {
    new Person().eat(new Apple());
  }
} /* Output:Yummy*///:~


3)在构造器中调用另一个构造器,注意:this本身表示对当前对象的引用。在构造器中,如果为this添加了参数列表,这将产生对符合此参数列表的某个构造器的明确调用;这样,调用其他构造器就有了直接途径。
程序举例:

5. 清理:终结处理与垃圾回收
     一般情况下,Java的垃圾回收器负责回收无用对象占据的内存空间。但是也有特殊情况:假定你的对象(并非是用new创建)获得一块特殊的内存区域,由于垃圾回收器只知道释放那些由new分配的内存。为了应对这种情况,java允许在类中定义一个名为finalize()的方法。它的工作原理“假定”是这样的:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用该方法,并且再下一次垃圾回收动作发生时,才会真正回收对象占用的内存。所以要是打算使用该方法,就能在垃圾回收时刻做一些特殊的清理工作。
    这里的finallze()并不是C++中的析构函数。C++中的对象一定会被销毁,但是Java中的对象却并非总是被垃圾回收。或者换句话说:
    1)对象可能不被垃圾回收。
    2)垃圾回收并不等于”析构“。
    3)垃圾回收只和内存有关。  






猜你喜欢

转载自blog.csdn.net/qq_40182703/article/details/80217802