Day12
需求:创建人类的对象,并操作对象
分析:
人类 - Person
属性:name、sex、age
方法:eat、sleep
场景:创建多个对象,去操作对象
//测试类:该类中有main方法,测试我们写好的代码
public class Test01 {
public static void main(String[] args) {Person p1 = new Person();Person p2 = new Person();p1.name = "巴得伟";p1.sex = '男';p1.age = 23;p2.name = "波多野结衣";p2.sex = '女';p2.age = 18;p1.eat();p1.sleep();p2.eat();p2.sleep();Person.method();}
}
public class Person {//成员变量String name;char sex;int age;//成员方法public void eat(){System.out.println(this.name + "吃饭饭");}//成员方法public void sleep(){System.out.println(this.name + "睡觉觉");}//静态方法public static void method(){System.out.println("静态方法");}
}
面向对象内存图:
注意:
1.class文件只加载一次
2.class文件中包含了该类中的所有信息(包含方法等)
3.new对象会在堆中开辟空间,存储成员变量
4.成员变量系统会赋默认值
5.每个对象共享一份成员变量
6.方法中的this表示调用该方法的对象(谁调用的,this - 就指向谁)
7.成员方法可以调用this
8.静态方法使用类名调用,所以静态方法内不能使用this
1.构造方法
前言 - 创建对象的语法:类型 引用 = new 构造方法;
含义:与类名相同,且没有返回项的方法(在类中定义的。方法名与类名字相同,无返回值类型声明(包括void)。)
作用:
1.和new关键字在一起表示创建对象
2.初始化数据
注意:
- 1.创建对象的过程(Person p = new Person()😉,也叫做实例化
- 2.当类中没有有参构造时,系统会默认实现无参构造
经验:类中编写了有参构造,我们记得把无参构造加上
需求:创建人类,操作对象
public static void main(String[] args) {//类型 引用 = new 构造方法;Person p = new Person("巴得伟", '男', 23);System.out.println(p.name);System.out.println(p.sex);System.out.println(p.age);p.eat();p.sleep();}
}
public class Person {//成员变量String name;char sex;int age;//构造方法 - 无参构造public Person(){System.out.println("无参构造");//初始化数据this.name = "默认值";this.sex = '男';this.age = 0;}//构造方法 - 有参构造public Person(String name,char sex,int age){System.out.println("有参构造");this.name = name;this.sex = sex;this.age = age;}//成员方法public void eat(){System.out.println(this.name + "吃饭饭");}//成员方法public void sleep(){System.out.println(this.name + "睡觉觉");}
}
构造方法内存图:
public class Person{//注意:这种不是构造方法,是成员方法public void Person(){}
}
1.1 构造方法的注意事项
* 构造方法的创建
如果没有定义构造方法,系统将给出一个默认的无参数构造方法
如果定义了构造方法,系统将不再提供默认的构造方法
* 构造方法的重载
如果自定义了带参构造方法,还要使用无参数构造方法,就必须再写一个无参数构造方法
* 推荐的使用方式
无论是否使用,都手工书写无参数构造方法
* 重要功能
可以使用带参构造,为成员变量进行初始化
每一个类中都有一个默认的无参的构造方法。
构造方法可以有多个,但参数不一样,就是重载。
1.2 赋值方式
创建对象并为其成员变量赋值的两种方式
1:无参构造方法创建对象后使用setXxx()赋值
2:使用带参构造方法直接创建带有属性值的对象
public class StudentDemo {public static void main(String[] args) {//无参构造方法创建对象后使用setXxx()赋值Student s1 = new Student();s1.setName("小彭");s1.setAge(21);s1.show();//使用带参构造方法直接创建带有属性值的对象Student s2 = new Student("小彭",21);s2.show();}}
1.3 idea直接生成构造方法
鼠标右键,选择生成,找到get、set,ctrl+a全选一键生成。
或者鼠标右键,选择 ptg to javaBean,一键生成。
2.标准类制作
① 类名需要见名知意
② 成员变量使用private修饰
③ 提供至少两个构造方法
无参构造方法
带全部参数的构造方法
④ get和set方法
提供每一个成员变量对应的setXxx()/getXxx()
⑤ 如果还有其他行为,也需要写上
案例:
public class User {//1.私有化全部的成员变量//2.空参构造//3.带全部参数的构造//4.针对于每一个私有化的成员变量都要提供其对应的get和set方法//5.如果当前事物还有其他行为,那么也要写出来,比如学生的吃饭,睡觉等行为private String username;//用户名private String password;//密码private String email;//邮箱private char gender;//性别private int age;//年龄//空参构造方法public User() {}//带全部参数的构造public User(String username, String password, String email, char gender, int age) {this.username = username;this.password = password;this.email = email;this.gender = gender;this.age = age;}//get和setpublic String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public char getGender() {return gender;}public void setGender(char gender) {this.gender = gender;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public void eat(){System.out.println(username + "在吃饭");}}
测试类:
public class Test {public static void main(String[] args) {//写一个标准的javabean类//咱们在课后只要能把这个标准的javabean能自己写出来,那么就表示今天的知识点就ok了//利用空参构造创建对象User u1 = new User();//如果利用空参创建对象,还想赋值只能用set方法赋值u1.setUsername("zhangsan");u1.setPassword("1234qwer");u1.setEmail("pcb@qq.cn");u1.setGender('男');u1.setAge(23);//获取属性的值并打印System.out.println(u1.getUsername() + ", " + u1.getPassword()+ ", " + u1.getEmail() + ", " + u1.getGender() + ", " + u1.getAge());u1.eat();System.out.println("=============================");//简单的办法//利用带全部参数的构造来创建对象//快捷键:ctrl + pUser u2 = new User("lisi","12345678","pcb@qq.cn",'女',24);System.out.println(u2.getUsername() + ", " + u2.getPassword()+ ", " + u2.getEmail() + ", " + u2.getGender() + ", " + u2.getAge());u2.eat();}
}
简答题
1. 构造器 Constructor 是否可被 override?
Constructor 不能被 override(重写),但是可以 overload(重载),所以你可以看到一个类中有多个构
造函数的情况。
2. 在 Java 中定义一个不做事且没有参数的构造方法的作用
Java 程序在执行子类的构造方法之前,如果没有用 super() 来调用父类特定的构造方法,则会调用父
类中“没有参数的构造方法”。因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又
没有用 super() 来调用父类中特定的构造方法,则编译时将发生错误,因为 Java 程序在父类中找不到
没有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数的构造方法。