构造方法定义
需求:在创建对象的时候就明确属性值
解决方式:利用构造方法
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(); }