Java中的构造方法(构造函数)与普通方法区别及说明

 更新时间:2024年03月25日 09:29:26   作者:feng之锋  
这篇文章主要介绍了Java中的构造方法(构造函数)与普通方法区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

一、明白什么是构造方法,什么是普通方法?

所谓的构造方法,是一种特殊的方法,其作用是用来创建对象时初始化对象,即为对象成员变量赋初始值,总是与new运算符一起使用在创建对象的语句中。

特别的,一个类是可以有多个构造函数,可以根据参数个数的不同或者参数类型的不同来区分它们,即为构造函数的重载。

构造方法是类的一个特殊的成员,在类实例化时会自动调用,其构造方法定义格式如下:

修饰符 方法名(){}

其中需要注意的是:

  • 方法名与类名相同;
  • 没有返回值类型;
  • 没有具体的返回值

例如接下来这个例子,在创建对象的时候,对象成员可以由构造函数方法进行初始化。

new对象时,都是用构造方法进行实例化的;

例如;Test test = new Test("a");

 //Test("a");其中这个就是构造函数,“a”为构造方法的形参;

而普通方法是简单来说就是完成特定功能的代码块。

其定义的格式如下:

修饰符 返回值类型 方法名 (参数类型 参数名1,参数类型 参数名2,…)
{
函数体;
return 返回值;
}

其中:返回值类型用于限定返回值的数据类型。

二、 明白构造方法和普通方法的特点和作用是什么?

1.构造方法的特点

构造函数的主要作用是完成对象的初始化工作,(如果写的类里面没有构造函数,那么编译器会默认加上一个无参数且方法体为空的构造函数).

它能够把定义对象时的参数传给对象的域。意即当创建一个对象时,这个对象就被初始化.如果这时构造函数不为空,则会在创建对象时就执行构造函数里面的代码:

构造函数的名称必须与类名相同,包括大小写。

构造函数没有返回值的,也不能用void来进行修饰。如果不小心给构造函数添加了返回类型,那么这将使这个构造函数变成一个普通方法了,则在运行时将产生找不到构造方法的错误。

④一个类可以定义多个构造方法,如果在定义类时定义构造方法,则编译系统会自动插入一个无参数的默认构造器,这个构造器不执行任何代码。

构造方法可以重载,以参数的个数,类型,顺序来重载。例如:

public static void main(String[] args) {
        Phone p1 = new Phone();
        p1.show();
        
        System.out.println("----------------");
        
        Phone p2 = new Phone("vivoxplay5",2999);
        p2.show();
    }        
}

class Phone{
    private String brand;  //品牌
    private int price;       //价格
    
    //无参构造方法
    public Phone(){
        System.out.println("无参构造");
    }

    //有参构造器
    public Phone(String brand, int price) {
        this.brand = brand;
        this.price = price;
        System.out.println("有参构造");
    }
    
    public void show(){
        System.out.println(brand+"..."+price);
    }

    
}

构造方法给成员变量赋值的两种方式的区别:

/**
     * 无参构造方法:给属性进行初始化
     * set/get方法:修改属性值
     * @param args
     */
public static void main(String[] args) {
        //无参构造创建对象
        Phone p1 = new Phone();    
        p1.setBrand("vivoxplay5");
        p1.setPrice(2999);
        
        p1.setBrand("vivo");
        p1.show();
        
        System.out.println("----------------");
        //有参构造创建对象
        Phone p2 = new Phone("vivoxplay5",2999);
        //这种方式并不是改名,而是将原对象变成垃圾
        //p2 = new Phone("vivo",2000);
        p2.show();
    }        
}

class Phone{
    private String brand;  //品牌
    private int price;       //价格
    
    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    //无参构造方法
    public Phone(){
        System.out.println("无参构造");
    }

    //有参构造器
    public Phone(String brand, int price) {
        this.brand = brand;
        this.price = price;
        System.out.println("有参构造");
    }
    
    public void show(){
        System.out.println(brand+"..."+price);
    }

    
}

2.构造方法的作用

【1】 首先,构造函数用来生成并初始化对象;

【2】其次,构造函数可以通过函数的重写给对象赋初始值,简化代码,例如:

在这段代码中,本文创建了两个Person对象,分别赋给了初始值,但是如果创建的对象比较多的话,代码就显得很重复,这时可以重载Person类里面的构造方法,以在创建对象的时候就赋给它们初始值,这样就可以省去重复的代码了:

在这里有一个问题需要特别的注意

在默认的情况下,一个类会有一个默认的构造函数,这个构造函数没有内容也没有返回值,一般会省略。

在这种情况下,编译器在编译的时候会默认加上一个无参且方法体为空的函数。但是,如果类的构造函数被重写了,如上述的例子,Person类已经有了一个有参数有方法体的构造函数,这是编译器就不会再给它默认加上一个无参且方法体为空的构造函数,可以理解为无参的构造函数被覆盖了,这种情况称为没有默认构造函数。

而在函数的继承里,子类必须调用父类的构造函数。但是子类只能继承父类的默认的构造函数,如果父类没有默认的构造函数,那么子类不能从父类继承默认构造函数,这是子类必须使用super来实现对父类的非默认构造函数的调用。

因此,在创建对象的时候,需要先利用super来调用父类的默认的构造函数来对对象进行初始化,然后调用子类自己定义的构造函数。

3.普通方法的特点与作用

【1】普通方法的特点:

方法是解决一类问题的步骤的有序组合;

②一个方法必须属于某一个类的,独立于类的方法不存在的;

③Java的普通方法可以操作调用它从属的对象和参数列表中的参数;

普通方法的调用方式为:对象.方法名(参数),如接下来的代码为例:

public void driverCar (int a,double b) {
    speed= 50;
    direction= "南方";
}

⑤Java方法只能有一个返回值,但是“值”的形式具有多样性 

【2】作用:

完成特定功能的代码块,即根据自己项目的需要,进行自己编码完成项目所需要的功能。

三、明白构造方法和普通方法的调用方式是怎样调用的?

1)构造方法的调用方式

构造方法分为:无参构造方法有参构造方法

A. 无参构造方法:

public class Student{
public  Student(){                    //无参构造方法

System.out.println("无参方法被调用");

}

}

public class Test {
public  static void main (String[]  args){
Student   stu = new Student();  //实例化Student对象

}

}//该方法是无参的构造方法,即构造方法不接收参数,执行后输出即可,无参的构造方法被调用。

B. 有参构造方法

为一个属性赋值有两种方法:

①直接访问对象属性

②通过setXxx()方法

如果想在实例化对象的同时就为了对象的属性进行赋值,可以通过带参数的构造方法来实现

public class Student{
private String name;
private int  age;
public  Student(String name,int age){             //有参构造方法
    this.name = name;
    this.age  = age ;
}
public  void show (){
System.out.println("姓名:"+name+"年龄:"+age);
}
}
public  class  Test02(){
public static void main (String[]   args)
{
Student  stu = new Student("王小五",25);     //实例化对象的同时赋值
stu.show();
}
}

2)普通方法的调用方式

普通方法分为 有明确返回值的方法没有明确返回值的方法

A. 有明确返回值的方法的调用

可以单独调用(无意义),输出调用,赋值调用(推荐)。

public static int sum (int a , int b)
{
    int c = a+b;
    return c ;
}
public static void main(String[] args)
{
           //sum(10,20); //单独调用
           //System.out.println(sum(10,20));  //输出调用
           int sum01 =sum(10,20); //赋值调用
}

B. 没有明确返回值的方法调用(void类型方法的调用)

只能单独使用。(如果一个方法没有明确的返回值类型,方法定义中“返回值类型”就可以用void代替,表示该方法无返回值类型。)

四、注意事项

① Java中的每一类至少有一个构造方法,如果我们没有去创建,系统自动会为我们创建一个默认的无参构造方法;

②但是如果我们定义了构造方法,系统就不会再为我们提供默认的无参构造方法了。这个时候想使用无参构造方法必须自己定义。因为实例化对象时,不一定会输入参数,那么没有无参的构造方法,又不输入参数,就会出错;

③构造方法需要用public来修饰,若使用private,在其他类中无法将其实例化;

④构造方法是可以重载的。所谓重载,是指一个类中可以定义多个方法名相同,但是参数不同的方法。调用时,会根据不同的参数自动匹配对应的方法。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 一文详解Java中的原子操作

    一文详解Java中的原子操作

    在Java中,原子操作尤为重要,尤其是在多线程环境中,想象一下,如果小黑在操作一个共享变量时,这个操作被其他线程打断,那会发生什么?可能会导致数据不一致,或者更糟糕的情况,本文将给大家详细介绍一下Java中的原子操作
    2024-01-01
  • IDEA插件FindBugs的使用详解

    IDEA插件FindBugs的使用详解

    这篇文章主要介绍了IDEA插件FindBugs的使用详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • SpringBoot+Querydsl 框架实现复杂查询解析

    SpringBoot+Querydsl 框架实现复杂查询解析

    本篇主要将介绍的是利用spring query dsl框架实现的服务端查询解析和实现介绍,对SpringBoot Querydsl 查询操作感兴趣的朋友一起看看吧
    2022-05-05
  • sentinel 整合spring cloud限流的过程解析

    sentinel 整合spring cloud限流的过程解析

    这篇文章主要介绍了sentinel 整合spring cloud限流,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • Java连接Redis的两种方式

    Java连接Redis的两种方式

    Redis 是一种高性能的键值存储数据库,广泛应用于缓存、消息队列、会话存储等场景,Java 作为一门广泛使用的编程语言,提供了多种方式来连接和操作 Redis,本文将介绍两种常用的 Java 连接 Redis 的方式,需要的朋友可以参考下
    2025-03-03
  • 浅谈Java中@Autowired和@Inject注解的区别和使用场景

    浅谈Java中@Autowired和@Inject注解的区别和使用场景

    本文主要介绍了浅谈Java中@Autowired和@Inject注解的区别和使用场景,@Autowired注解在依赖查找方式和注入方式上更加灵活,适用于Spring框架中的依赖注入,而@Inject注解在依赖查找方式上更加严格,适用于Java的依赖注入标准,感兴趣的可以了解一下
    2023-11-11
  • Java中List集合对象去重及按属性去重的8种方法

    Java中List集合对象去重及按属性去重的8种方法

    这篇文章主要介绍了Java中List集合对象去重及按属性去重的8种方法,本文给大家介绍的非常详细,对大家的学习或工作具有一地的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • java学生信息管理系统MVC架构详解

    java学生信息管理系统MVC架构详解

    这篇文章主要为大家详细介绍了java学生信息管理系统MVC架构的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • Java程序执行时间的2种简单方法

    Java程序执行时间的2种简单方法

    这篇文章介绍了Java程序执行时间的2种简单方法,有需要的朋友可以参考一下
    2013-09-09
  • Protobuf的简要介绍及使用详解

    Protobuf的简要介绍及使用详解

    这篇文章主要介绍了Protobuf的简要介绍及使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10

最新评论