Java中的构造方法-创新互联

1、什么是构造方法,有什么用?

构造方法是一个比较特殊的方法,通过构造方法可以完成对象的创建,以及实例变量的初始化。换句话说,构造方法就是用来创建对象,同时给对象的属性赋值

创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都做网站、网站建设、外贸营销网站建设、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的蚌山网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!

(PS:当实例变量没有被我们手动去赋值的时候,系统会给实例变量赋默认值)

2、构造方法的语法结构

构造方法的语法结构

[修饰符列表] 构造方法名(形式参数列表){
    构造方法体;
    通常在构造方法体当中给属性赋值,完成属性的初始化
}

注意:

1、修饰符列表统一写:public

2、构造方法名和类名必须一致

3、构造方法不能写返回值的类型

对比普通方法的语法结构

[修饰符列表] 返回值类型 方法名(形式参数列表){
    方法体;
}

怎么调用构造方法

使用new运算符来调用构造方法

语法格式:

new 构造方法名(实际参数列表);

重点(需要记忆):当一个类没有提供任何构造方法,系统会默认提供一个无参数的构造方法(而这个构造方法被称为缺省构造器) 。

public class ConstructorTest01{
    public static void main(String[] args){
        //创建Student类型的对象
        Student s1 = new Student();
        
        //输出“引用”
        //只要输出结果不是null,说明这个对象一定是创建完成了
        System.out.println(s1);

        //调用Student类的无参数构造方法
        new Student();//结果:无参数的构造方法执行了!
    }
}

class Student{
    //学号
    int no;
    //姓名
    String name;
    //年龄
    int age;

    //当Student这个类当中并没有定义任何构造方法
    //但是我们创建对象的时候成功了,这里就是系统提供的缺省构造器
    //将无参数的构造方法(缺省构造器)写出来
    public Student(){
        System.out.println("无参数的构造方法执行了!");
    }
}
3、构造方法的重载

我们都知道普通方法能够重载,那构造方法能够重载吗?

答案:能,并且和普通方法重载一样,可以创建多个构造方法,方法名相同,参数列表不同

具体请参照方法重载:(6条消息) Java方法重写与重载的区别_徐念安的博客-博客_请简述方法重写和方法重载的区别

当一个类当中手动的提供了构造方法,那么系统将不再提供无参数构造方法

(建议:将无参数构造方法手动写出来,这样一定不会出问题)

public class ConstructorTest01{
    public static void main(String[] args){
        //这里将会报错,因为在Student中我们手动的定义了一个带参数列表的构造方法
        //所以缺省构造器已经没了,除非我们在Student当中再去手动的把无参构造方法定义出来
        new Student();
    }
}

class Student{
    //学号
    int no;
    //姓名
    String name;
    //年龄
    int age;

    public Student(int i){
        System.out.println("有参数的构造方法执行了!");
    }
}

当我们手动的定义了无参构造方法和有参构造方法之后,无参构造方法和有参构造方法都可以调用

public class ConstructorTest01{
    public static void main(String[] args){
        new Student();//无参数的构造方法执行了!
        new Studnet(100);//有参数的构造方法执行了!
        new Studnet("zhangsan");//有参数的String构造方法执行了!
    }
}

class Student{
    //学号
    int no;
    //姓名
    String name;
    //年龄
    int age;

    public Student(){
        System.out.println("无参数的构造方法执行了!");
    }
    public Student(int i){
        System.out.println("有参数的构造方法执行了!");
    }
    public Student(String name){
        System.out.println("有参数的String构造方法执行了!");
    }
}

实例变量没有手动赋值的时候,实际上系统会默认赋值

那么这个默认赋值操作是在什么时间进行的?

  是在类加载的时候给这些实例变量赋值吗?

  不是,实例变量是在构造方法执行的过程中完成初始化的,完成赋值的

public class ConstructorTest01{
    public static void main(String[] args){
        Student student = new Student();
        System.out.println(student.no);//输出结果30
        System.out.println(student.name);//输出结果zhangsan
        System.out.println(student.age);//输出结果10

        //由于有参构造方法我们并没有对实例变量进行赋值
        //所以在这里的输出依然是系统的默认值
        Student student1 = new Student(1);
        System.out.println(student1.no);//输出结果0
        System.out.println(student1.name);//输出结果null
        System.out.println(student1.age);//输出结果0
    }
}

class Student{
    //学号
    int no;//默认值0
    //姓名
    String name;//默认值null
    //年龄
    int age;//默认值0

    public Student(){
        //这里手动赋值,将不再使用系统默认值
        no = 30;
        name = "zhangsan";
        age = 10;
    }
    public Student(int i){
    }
}

除此之外,我们还可以在调用构造方法创建对象的时候对实例变量进行赋值

public class ConstructorTest01{
    public static void main(String[] args){
        Student student = new Student();
        System.out.println(student.no);//输出结果30
        System.out.println(student.name);//输出结果zhangsan
        System.out.println(student.age);//输出结果10

        //由于该构造方法我们设置了参数列表,所以我们可以在创建对象的时候传值

        //此处表示no = 20;name = lisi;age = 30;
        Student student1 = new Student(20,lisi,30);
        System.out.println(student1.no);//输出结果20
        System.out.println(student1.name);//输出结果lisi
        System.out.println(student1.age);//输出结果30
    }
}

class Student{
    //学号
    int no;//默认值0
    //姓名
    String name;//默认值null
    //年龄
    int age;//默认值0

    public Student(){
        //这里手动赋值,将不再使用系统默认值
        no = 30;
        name = "zhangsan";
        age = 10;
    }

    //这里使用传参的形式来赋值
    public Student(int xueHao,String mingZi,int nianLing){
        no = xueHao;
        name = mingZi;
        nianLing = age;
    }
}

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网站名称:Java中的构造方法-创新互联
浏览路径:http://pwwzsj.com/article/cspehc.html