今天我们来梳理下Java构造器,有地方也称呼为构造方法。
有的人可能会说,构造器不就是new个对象用么?这个有什么好研究的呢?等看完本篇对于构造方法的阐述,我们再回头认识下构造方法。
最常见的崩溃—空指针
新手写代码时候,经常会出现类似这样的一种崩溃,作为新手以后看到这种问题,首先要淡定,因为这种类型的崩溃是最好解决的问题之一。
为什么会出现java.lang.NullPointerException呢?
这里就要说下引用和对象的概念:
对于java 内存分配不了解的同学,可以看前面 2019零基础学Android第3课——Java存储和基本数据类型。
// 这个s是个引用,他还没有指向任何一个对象。
// 引用是存储在栈里面
String s ;
// 这个s引用已经关联了一个新生成的对象,栈里面的引用指向堆里的对象。
String s = new String("test");
出现java.lang.NullPointerException 的原因在于你没有为引用关联到一个具体的对象,说白了他是空的。对一个空的引用直接调用方法就会导致空指针。
那么怎么去关联到一个对象?
就是我们今天说的构造方法,我们用 new 关键字调用构造方法,获得实例对象。
构造方法
首先系统会默认给我们构造一个无参的构造方法,如下:
class Dog{
// 系统会默认给我们构造,无需显示去写
public Dog() {
}
}
构造方法有什么特征?
-
无任何返回类型
-
方法名和类名相同
利用构造方法,我们能做什么?
有了构造方法后,我们能直接生成一个类的对象。同时我们可以对类里面的成员变量赋默认值,如下:
class Dog{
String name;
int age;
public Dog(String name,int age){
this.name = name;
this.age = age;
}
}
public static void main(String args[]){
// 我们构造出了一只姓名为小黄,3岁的狗狗
Dog dog = new Dog("小黄",3);
}
刚才说java会自动为我们构造一个无参的构造方法,这句话其实并不严谨,当我们自己主动的声明了构造方法(无论是否有参),这时候java就不会为我们构造无参方法了。这一点一定要注意。
在实战开发中,我们会用到一些json序列化库,有些库序列化时会主动调用我们类的无参构造方法。如果我们这个类只主动构造了有参的构造方法,这些json库由于找不到无参构造方法,就会直接崩溃!
那这时候该怎么办呢?
class Dog{
String name;
int age;
public Dog(String name,int age){
this.name = name;
this.age = age;
}
// 当你构造上面的有参构造方法, 请务必注意此时Java不会再给我们自动生成
// 无参构造方法了,这时候需要我们自己主动写一个无参构造方法
public Dog(){
}
}