15-初始化和清理

2022-10-27 13:20:39 浏览数 (1)

初始化和清理

初始化和清理是涉及编程安全的两个重要问题,在C语言中一直采取由程序员直接控制变量的初始化和清理,极易导致内存耗尽等问题出现

C 和Java采用了构造器(构造方法)的概念来进行对象的创建,创建对象时,如果该类提供有构造方法,Java会在用户有能力操作对象前调用构造器,完成对类中每个对象的初始化

构造器与类同名的原因

  1. 调用构造器是编译器的任务,所以编译器必须清楚要调用哪个方法,这就要求所有类的构造器必须具有相同的方法名
  2. 所取的任何名字都可能与类中原有的方法名重复,产生冲突,为了避免这种情况,统一采用构造器与类同名这种方案

构造器没有返回值,这与返回值为空null(void)具有很大区别,构造器本质上不会返回任何东西,我们在创建对象时Object object=new Object();看似是构造方法返回了一个新对象,实质是new表达式返回了该对象的引用(虽然与该对象完全一致)。

因为有了构造器的存在,所以强制重载方法名就显得十分重要,这也是Java支持强制重载方法名的重要原因。区分重载方法的唯一规则是不同的参数列表(即便只是顺序不同),而返回值并不可以作为区分重载方法的规则,因为很多时候我们并不关心返回值,而是为了实现方法内的功能,这样就会出现这种单纯的调用func();这种情况下,Java便无法区分两个返回值不同的重载方法的区别了

我们为什么可以使用this关键字

在构造器或其他类方法中,我们常常通过this关键字来区分类中的变量或方法与传入的变量或方法。但我们在调用构造函数时,对象本身并不在参数列表中

代码语言:javascript复制
Apple apple=new Apple(int num);
apple.pick(int n);

那么Java是如何区分对象的?实质上我们在调用构造函数后编译器会对上述调用语句进行修改,最终的结果是

代码语言:javascript复制
Apple.pick(apple,n);

变量被作为第一个参数被默认传入方法中,这也就给了我们利用this关键字来区分对象的能力

在构造器中调用另一个构造器

当我们有多个不同参数列表的构造器后,在一个构造器中调用另一个构造器可以有效的避免代码重复,实现这种调用的方式就是通过this关键字

代码语言:javascript复制
public class Test {

    private int num;
    private String name;
    private double weight;

    public Test(int num){
        this.num=num;
        System.out.println("this is the default constructor");
    }

    public Test(int num, String name, double weight) {
        this(num);
        this.name = name;
        this.weight = weight;
        System.out.println("this is the rewrite constructor");
    }

    public static void main(String[] args) {
        Test test=new Test(5,"Leslie",90.0);
        System.out.println("name=" test.name ",num=" test.num ",weight=" test.weight);
    }
}
代码语言:javascript复制
this is the default constructor
this is the rewrite constructor
name=Leslie,num=5,weight=90.0

除构造器外,编译器禁止在其他任何方法中调用构造器

static方法

静态方法就是没有this的方法,在static内部不能调用非静态的方法,反之可以。静态方法可以在没有创建对象的情况下,直接通过类本身来调用,这恰恰是静态方法的主要作用。这使得static方法更类似于一个全局变量,当你在类中置入static方法就可以访问其他static方法或static域

0 人点赞