一、JavaBean
1. 它是什么
- 也可以称为实体类,其对象可以用于在程序中封装数据。
- 实体类是?比如:汽车类、学生类、用户类 …
2. 它的标准书写要求
-
成员变量使用 private 修饰。
-
提供成员变量对应的 setXxx() / getXxx() 方法。
-
必须提供一个 无参数构造器;有参数构造器是可写可不写的。
-
实体类: 用户类
package com.app.javabean;
// 用户类
public class User {
// 1.成员变量建议使用private私有
private String name; // 用户姓名
private double height; // 用户身高
private double salary; // 用户工资
/**
2.提供成员变量对应的 setXxx() / getXxx() 方法,暴露其取值和赋值
快捷键:鼠标右键 ——> Generate ——> Getter and Setter
*/
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
/**
3.必须提供无参数构造器: 默认存在的;
有参数构造器是可有可无的,如果你一旦定义了有参构造器,就必须也定义无参构造器
快捷键:鼠标右键 ——> Generate ——> Constructor
*/
// 无参
public User() {
}
// 有参
public User(String name, double height, double salary) {
this.name = name;
this.height = height;
this.salary = salary;
}
}
- 实现类:封装用户信息
package com.app.javabean;
/**
目标:学会JavaBean的书写要求
*/
// 测试类
public class UserTest {
public static void main(String[] args) {
// 1.无参构造器创建对象封装一个用户信息
User u1 = new User();
u1.setName("关羽");
u1.setHeight(189.6);
u1.setSalary(2500);
// 2.取值,输出
System.out.println("---------用户1的信息---------");
System.out.println("姓名:" + u1.getName());
System.out.println("身高:" + u1.getHeight() + "cm");
System.out.println("工资:" + u1.getSalary());
// 3.有参构造器创建对象封装一个用户信息
User u2 = new User("张飞", 178, 15000);
// 4.取值,输出
System.out.println("\n---------用户2的信息---------");
System.out.println("姓名: " + u2.getName());
System.out.println("身高: " + u2.getHeight() + "cm");
System.out.println("工资: " + u2.getSalary());
}
}
- 控制台
---------用户1的信息---------
姓名:关羽
身高:189.6cm
工资:2500.0
---------用户2的信息---------
姓名: 张飞
身高: 178.0cm
工资: 15000.0
Process finished with exit code 0
3. 它的书写快捷键
-
提供成员变量对应的 setXxx() / getXxx() 方法 的快捷键
-
必须提供无参数构造器;有参数构造器是可有可无,一旦定义了有参数构造器,就必须也定义无参数构造器
-
生成有参数构造器也是
-
空白处鼠标右键
-
单击Generate:生成的意思
-
单击Constructor:构造器的意思
-
左手按住Shift,右手单击最后一个属性
-
-
二、成员变量、局部变量的区别
1. 它们的区别
区别 | 成员变量 | 局部变量 |
---|---|---|
类中位置不同 | 类中,方法外 例如: public class Student { private String name; private int age; } | 常见于方法中 例如: public class Test{ public static void main(String[] args){ double score = 98.6; String name = “关羽”; System.out.println(name + ": " + score); } } |
初始化值不同 | 有默认值,无需初始化(赋值) | 没有默认值,使用之前需要完成初始化(赋值) |
内存位置不同 | 堆内存 | 栈内存 |
生命周期不同 | 随着对象的创建而存在,随着对象的消失而消失 | 随着方法的调用而存在,随着方法的运行结束而消失 |
作用域 | 很难界定,因为成员变量属于每个对象 | 在所归属的大括号中 |
三、面向对象综合案例:模仿电影信息展示
1. 需求
- 使用面向对象编程,模仿电影信息的展示。
2. 分析
- 一部电影是一个Java对象,需要先设计一个电影类,再无参构造器或有参构造器创建对象封装一个电影信息。
- 多部电影对象可以采用数组存储起来。
- 依次遍历数组中的每个电影对象,取出其信息进行展示。
3. 实现
1.实体类: 电影类
(1.1) 成员变量建议使用private私有
a: 电影名称
b: 电影评分
c: 地区
d: 类型
e: 导演
f: 主演
(1.2) 提供成员变量对应的 setXxx() / getXxx() 方法,暴露其取值和赋值
(1.3) 必须提供一个无参数构造器,有参数构造器是可有可无,一旦定义了有参,无参也必须定义
2.实现类:
(2.1) 动态初始化一个数组,类型为电影类,长度为3,用于存储3部需要展示的电影
(2.2) 有参构造器创建对象封装3部电影信息,并分别存入数组中
(2.3) 定义一个用于展示电影信息的方法showFilm,无返回值,设置一个形参: 类型是电影类,用于接收传入的电影数组
a: 定义for循环,遍历电影数组
(1) 取出每次遍历到的电影的信息并用变量接收
(2) 判断电影数组中的电影是否为空
(2.1) 不为空,展示所有电影信息
(2.2) 为空,结束展示
(2.4) 成功存入,调用showFilm方法,传入电影数组,展示所有电影信息
- 实体类: 电影类
package com.app.demo;
// 1.实体类: 电影类
public class Film {
// (1.1) 成员变量建议使用private私有
private String name; // a: 电影名称
private double score; // b: 电影评分
private String region; // c: 地区
private String type; // d: 类型
private String director; // e: 导演
private String starring; // f: 主演
/**
(1.2) 提供成员变量对应的 setXxx() / getXxx() 方法,暴露其取值和赋值
*/
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
public String getRegion() {
return region;
}
public void setRegion(String region) {
this.region = region;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getDirector() {
return director;
}
public void setDirector(String director) {
this.director = director;
}
public String getStarring() {
return starring;
}
public void setStarring(String starring) {
this.starring = starring;
}
/**
(1.3) 必须提供一个无参数构造器,有参数构造器是可有可无,一旦定义了有参,无参也必须定义
*/
// 无参
public Film() {
}
// 有参
public Film(String name, double score, String region, String type, String director, String starring) {
this.name = name;
this.score = score;
this.region = region;
this.type = type;
this.director = director;
this.starring = starring;
}
}
- 实现类
package com.app.demo;
/**
目标:完成电影信息的展示案例,理解面向对象编程的代码
*/
// 2.实现类
public class FilmTest {
public static void main(String[] args) {
// (2.1) 动态初始化一个数组,类型为电影类,长度为3,用于存储3部需要展示的电影
Film[] films = new Film[3];
// (2.2) 有参构造器创建对象封装3部电影信息,并分别存入数组中
films[0] = new Film("《长津湖》", 9.5, "中国",
"剧情 / 历史 / 战争", "陈凯歌 / 徐克 / 林超贤",
"吴京 / 易烊千玺 / 段奕宏 / 朱亚文 / 李晨");
films[1] = new Film("《我和我的父辈》", 9.4, "中国大陆", "剧情",
"吴京 / 章子怡 / 徐峥 / 沈腾",
"吴京 / 章子怡 / 徐峥 / 沈腾 / 韩昊霖");
films[2] = new Film("《五个扑水的少年》", 8.9, "中国大陆", "剧情 / 喜剧 / 运动",
"宋灏霖", "辛云来 / 冯祥琨 / 李孝谦 / 吴俊霆 / 王川");
// (2.4) 成功存入,调用showFilm方法,传入电影数组,展示所有电影信息
showFilm(films);
}
// (2.3) 定义一个用于展示电影信息的方法showFilm,无返回值,设置一个形参: 类型是电影类,用于接收传入的电影数组
public static void showFilm(Film[] films) {
// a: 定义for循环,遍历电影数组
for (int i = 0; i < films.length; i++) {
// (1) 取出每次遍历到的电影的信息并用变量接收
Film film = films[i];
// (2) 展示所有电影信息
System.out.println("电影名: " + film.getName() + "\n"
+ "评分: " + film.getScore() + "\n"
+ "地区: " + film.getRegion() + "\n"
+ "类型: " + film.getType() + "\n"
+ "导演: " + film.getDirector() + "\n"
+ "主演: " + film.getStarring());
System.out.println("—————————————————————————————————————————");
}
}
}
- 控制台
电影名: 《长津湖》
评分: 9.5
地区: 中国
类型: 剧情 / 历史 / 战争
导演: 陈凯歌 / 徐克 / 林超贤
主演: 吴京 / 易烊千玺 / 段奕宏 / 朱亚文 / 李晨
—————————————————————————————————————————
电影名: 《我和我的父辈》
评分: 9.4
地区: 中国大陆
类型: 剧情
导演: 吴京 / 章子怡 / 徐峥 / 沈腾
主演: 吴京 / 章子怡 / 徐峥 / 沈腾 / 韩昊霖
—————————————————————————————————————————
电影名: 《五个扑水的少年》
评分: 8.9
地区: 中国大陆
类型: 剧情 / 喜剧 / 运动
导演: 宋灏霖
主演: 辛云来 / 冯祥琨 / 李孝谦 / 吴俊霆 / 王川
—————————————————————————————————————————
Process finished with exit code 0
4. 执行内存图
5. 结论
- 数组中存储的元素并不是对象本身,而是对象的地址。
- 检验方法:将存有对象的数组打印输出看一下就知道了!!