七、面向对象基础
1. 概念
Object Oriented Programming(OOP)
先定义一个模板(类),开发一个个对象,把数据交给对象,调用对象的方法完成对数据的处理。new对象,赋值,调用方法。
面向对象遍程有啥好处?
万物皆对象——符合人类思维习惯、编程更简单、更直观
程序中的对象是什么?
对象本质上是一种特殊的数据结构——可以看成是一张表,数据就是值,方法就是用来处理这些数据的
对象是怎么出来的?
类,对象的设计图也就是对象的模板
2. 对象在计算机中的执行原理
问题:这里对象调用方法的时候,是将方法提到占内存?每个对象提一次?如果声明了static会怎样??
3. 类和对象的注意事项
类名首字母大写的驼峰命名法,且要有意义
类中定义的变量也称为成员变量(对象的属性),类中定义的方法也称为成员方法(对象的行为)
成员变量本身存在默认值,定义时一般不需要赋初始值
一个代码文件中可以有多个class类,但只能有一个public修饰,且该类名必须是代码文件名——是要包含main方法嘛??不一定,别的类无public也能被调用
对象与对象之间的数据不会相互影响,但多个变量指向同一个对象时就会相互影响了
如果某个对象没有一个变量引用它,则该对象无法被操作,会成为垃圾对象——s1 = null——Java存在自动垃圾回收机制,自动清除垃圾对象
4. this关键字
是什么?
this就是一个变量,可以用在方法中,来拿到当前对象
public class Test {
public static void main(String[] args) {
// 创建对象查看地址与this
Student s1 = new Student();
System.out.println(s1); // com.itheima.thisemo.Student@3b07d329
s1.printThis(); // com.itheima.thisemo.Student@3b07d329
System.out.println("----");
Student s2 = new Student();
System.out.println(s2); // com.itheima.thisemo.Student@41629346
s2.printThis(); // com.itheima.thisemo.Student@41629346
}
}
应用场景?
主要用来解决变量名称冲突问题
this.
5. 构造器
认识:
方法名与类名一致且没有返回值
public class Student {
// 构造器
public Student() {
}
}
特点:
创建对象时,对象会去调用构造器
应用场景:
创建对象的同时完成对对象成员变量的初始化赋值——有参数构造器,避免一个一个成员变量的赋值操作
注意事项:
- 类在设计时,如果不写构造器,JAVA会为类自动生成一个无参构造器
- 定义了有参数构造器,JAVA不会自动生成无参数构造器,要自己手写!!
6. 封装
概念: 将数据或方法等集合在一个个单元中(类),被封装的东西通常被称为抽象数据类型
设计规范: 合理隐藏、合理暴露——对象安全可靠
7. 实体类JAVABean
概念: 成员变量都为私有,且每个成员变量对外都提供get、set方法,必须有一个公共的无参构造器,不存在其他方法
本质、特点: 保存数据的JAVA类
应用场景:
实现数据和数据操作分离
例:
public class Student {
private String name;
private double score;
public Student() {
}
public Student(String name, double score) {
this.name = name;
this.score = score;
}
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;
}
}
8. 面向对象综合案例
电影系统:
- 展示系统中的全部电影(每部电影展示:名称、价格)
- 允许用户根据电影编号(id)查询出每个电影的详细信息
Test.java
public class Test {
public static void main(String[] args) {
// 展示系统中的全部电影(每部电影展示:名称、价格)
// 允许用户根据电影编号(id)查询出每个电影的详细信息
// 定义电影类的数组
Movie[] movies = new Movie[4];
movies[0] = new Movie(1,"水门桥", 38.9, 9.8, "徐克", "吴京", "12万人想看");
movies[1] = new Movie(2, "出拳吧", 39, 7.8, "唐晓白", "田雨", "3.5万人想看");
movies[2] = new Movie(3,"月球陨落", 42, 7.9, "罗兰", "贝瑞", "17.9万人想看");
movies[3] = new Movie(4, "一点就到家", 35, 8.7, "许宏字", "刘吴然", "10.8万人想看");
// 定义电影操作类的数组
MovieOperator operator = new MovieOperator(movies);
// // 展示全部电影
// operator.printAllMovies();
// // 根据id值查找电影
// operator.printAnyMovie(7);
// 界面展示
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("=====电影信息系统=====");
// 功能区
System.out.println("1. 查询全部电影信息");
System.out.println("2. 根据ID查询某个电影的详细信息");
System.out.print("请输入您想要进行的操作:");
// Scanner sc = new Scanner(System.in); // 移到循环外面
int command = sc.nextInt();
switch (command) {
case 1:
operator.printAllMovies();
break;
case 2:
System.out.print("请输入要查询电影的ID:");
operator.printAnyMovie(sc.nextInt());
break;
default:
System.out.println("暂未开通此功能,请重新输入!");
}
}
}
}
Movie.java
public class Movie {
private int num;
private String name;
private double price;
private double score; // 评分
private String director; // 导演
private String actor; // 演员
private String info; // 其他信息
// 无参构造器
public Movie() {
}
// 有参构造器
public Movie(int num, String name, double price, double score, String director, String actor, String info) {
this.num = num;
this.name = name;
this.price = price;
this.score = score;
this.director = director;
this.actor = actor;
this.info = info;
}
// get、set方法
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
public String getDirector() {
return director;
}
public void setDirector(String director) {
this.director = director;
}
public String getActor() {
return actor;
}
public void setActor(String actor) {
this.actor = actor;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}
MoveOperator.java
public class MovieOperator {
// 多部电影
private Movie[] movies;
// 无参构造器
public MovieOperator() {
}
// 有参构造器
public MovieOperator(Movie[] movies) {
this.movies = movies;
}
// get、set
public Movie[] getMovie() {
return movies;
}
public void setMovie(Movie[] movies) {
this.movies = movies;
}
// 其他操作
// 1. 展示系统中的全部电影
public void printAllMovies() {
System.out.println("-----系统中的全部电影信息如下:-----");
for (int i = 0; i < this.movies.length; i++) {
System.out.println("编号:" + movies[i].getNum());
System.out.println("名称:" + movies[i].getName());
System.out.println("评分:" + movies[i].getScore());
System.out.println("===========================");
}
}
// 2. 根据id展示某个电影的详细信息
public void printAnyMovie(int id) {
for (int i = 0; i < this.movies.length; i++) {
if (movies[i].getNum() == id) {
System.out.println("编号:" + movies[i].getNum());
System.out.println("名称:" + movies[i].getName());
System.out.println("评分:" + movies[i].getScore());
return; // 找到之后不执行后面的输出,如果时break后米娜还会输出,或者要再加个判断
}
}
System.out.println("没有要查询的电影!");
}
}
9. 成员变量和局部变量的区别
区别 | 成员变量 | 局部变量 |
---|---|---|
类中位置不同 | 类内、方法外 | 方法中 |
初始化值不同 | 有默认值 | 无默认值,使用前必须初始化 |
内存位置不同 | 栈 | 堆 |
作用域不同 | 整个对象 | 在所归属的大括号中 |
生命周期不用 | 与对象共存亡 | 随着方法的调用而生,方法结束而亡 |