构造方法

构造方法定义

需求:在创建对象的时候就明确属性值

解决方式:利用构造方法

1、构造方法的格式:

修饰符 构造方法名(参数列表)

{

}

2、构造方法的体现:

①构造方法没有返回值类型。也不需要写返回值。因为它是为构建对象的,对象创建完,方法就执行结束。

②构造方法名称必须和类名保持一致。

③构造方法没有具体的返回值。

3、代码体现:

class Person {
    // Person的成员属性age和name
    private int age;
    private String name;

    // Person的构造方法,拥有参数列表
    Person(int a, String nm) {
        // 接受到创建对象时传递进来的值,将值赋给成员属性
        age = a;
        name = nm;
    }
}

构造方法的调用

创建对象时构造方法的调用

class Person {
    // Person的成员属性age和name
    private int age;
    private String name;

    // Person的构造方法,拥有参数列表
    Person(int a, String nm) {
        // 接受到创建对象时传递进来的值,将值赋给成员属性
        age = a;
        name = nm;
    }

    public void speak() {
        System.out.println("name=" + name + ",age=" + age);
    }
}

class PersonDemo {
    public static void main(String[] args) {
        // 创建Person对象,并明确对象的年龄和姓名
        Person p2 = new Person(23, "张三");
        p2.speak();
    }
}

注意:在创建对象时,会调用与参数列表对应的构造方法。

默认构造方法和细节

问题:

在没有学习构造方法之前,我们也可以通过new关键字创建对象,并调用相应的方法,同时在描述事物时也没有写构造方法。这是为什么呢?

答案:

在之前学习的过程中,描述事物时,并没有显示指定构造方法,当在编译Java文件时,编译器会自动给class文件中添加默认的构造方法。

如果在描述类时,我们显示指定了构造方法,那么,当在编译Java源文件时,编译器就不会再给class文件中添加默认构造方法。

class  Person {
    //如果没有显示指定构造方法,编译会在编译时自动添加默认的构造方法
    //Person(){}  //空参数的默认构造方法
}

构造方法的细节:

1、一个类中可以有多个构造方法,多个构造方法是以重载的形式存在的

2、构造方法是可以被private修饰的,作用:其他程序无法创建该类的对象。

class Person {
    private int age;
    private String name;

    // 私有无参数的构造方法,即外界不能通过new Person();语句创建本类对象
    private Person() {
    }

    // 多个构造方法是以重载的形式存在
    Person(int a) {
        age = a;
    }

    Person(String nm, int a) {
        name = nm;
        age = a;
    }
}

构造方法和一般方法区别

构造方法在对象创建时就执行了,而且只执行一次。

一般方法是在对象创建后,需要使用时才被对象调用,并可以被多次调用。

问题:

有了构造方法之后可以对对象的属性进行初始化,那么还需要对应的set和get方法吗?

答案:

需要相应的set和get方法,因为对象在创建之后需要修改和访问相应的属性值时,在这时只能通过set或者get方法来操作。

例题:

1、编写一个完整的Person类,使用this关键字给成员变量进行赋值在测试类中测试

public class Person {
    private String name;
    private int age;
    private String sex;
    public Person(String name,int age,String sex){
        this.name=name;
        this.age=age;
        this.sex=sex;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
public static void main(String[] args) {
        Person p1=new Person("萨曼莎",24,"女");
        System.out.println(p1.getName());
        System.out.println(p1.getAge());
        System.out.println(p1.getSex());
        Person p2=new Person("劳拉",21,"女");
        System.out.println(p2.getName());
        System.out.println(p2.getAge());
        System.out.println(p2.getSex());
    }

 2、根据需求,完成如下代码(按照标准格式写),并在测试类中进行测试。

标准格式包含: 私有属性   无参构造  有参构造  setter 和getter 需求中的方法

需求一:

  员工类Employee

    属性:姓名name,工号id,工资salary 

    行为:显示所有成员信息的方法show()

需求二:

  动物类Animal

    属性:姓名name,年龄age

    行为:吃饭eat,睡觉sleep

需求三:

  人类Person

    属性:姓名name,年龄age,性别gender

    行为:学习study,睡觉sleep

public class Employee {
    private String name;
    private int id;
    private double salary;
    public Employee(String name,int id){
        this.name=name;
        this.id=id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public double getSalary() {
        return salary;
    }
    public void setSalary(double salary) {
        this.salary = salary;
    }
    public void show(){
        System.out.println("年龄"+id+"姓名:"+name+"工资"+salary);
    }
}
public class Animal {
    private String name;
    private int age;
    public Animal(String name,int age){
        this.name=name;
        this.age=age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void eat(){
        System.out.println("我会吃饭");
    }
    public void sleep(){
        System.out.println("我会睡觉");
    }
}
public class Person {
    private String name;
    private int age;
    private String sex;
    public Person(String name,int age,String sex){
        this.name=name;
        this.age=age;
        this.sex=sex;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public void studay(){
        System.out.println("我会学习");
    }
    public void sleep(){
        System.out.println("我会睡觉");
    }
    
}
public static void main(String[] args) {
        Employee yg=new Employee("萨曼莎",24);
        yg.setSalary(5000);
        yg.show();
        Employee yg1=new Employee("劳拉",21);
        yg1.setSalary(3000);
        yg1.show();
        Animal dog=new Animal("乔治",4);
        System.out.println("我叫"+dog.getName()+"今年"+dog.getAge()+"岁");
        dog.eat();
        dog.sleep();
        Person p1=new Person("约拿",26,"男");
        System.out.println("姓名"+p1.getName()+"年龄"+p1.getAge()+"性别"+p1.getSex());
        p1.studay();
        p1.sleep();
    }
原文地址:https://www.cnblogs.com/Ace-suiyuan008/p/9372841.html