Java面向对象

Java的祖师爷,詹姆斯高斯林认为,在这个世界中 万物皆对象!任何一个对象都可以包含一些数据,数据属于哪个对象,就由哪个对象来处理。

这样的话,只要我们找到了对象,其实就找到了对数据的处理方式。

所以面向对象编程的好处就是:面向对象的开发更符合人类的思维习惯,让编程变得更加简单、更加直观。

  • 注意事项

    • 第一:一个代码文件中,可以写多个class类,但是只能有一个是public修饰,且public修饰的类必须和文件名相同,如下面代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    假设文件名为`Demo1.java`,这个文件中假设有两个类`Demo1类和Student类`


    //public修饰的类Demo1,和文件名Demo1相同
    public class Demo1{

    }

    class Student{

    }
    • 第二:对象与对象之间的数据不会相互影响,但是多个变量指向同一个对象会相互影响。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      // 这种方式下对象与对象之间的数据不会相互影响
      Student stu1 = new Student();
      stu1.name = "小张";

      Student stu2 = new Student();
      stu1.name = "小李";

      // 多个变量指向同一个对象会相互影响
      Student stu1 = new Student();
      stu1.name = "小蓝";

      Student stu2 = stu1;
      stu2.name = "小飞";

this关键字

  • this是什么?this就是一个变量,用在方法中,可以拿到当前类的对象。
  • this有什么作用?通过this在方法中可以访问本类对象的成员变量。
  • 记住:哪一个对象调用方法,方法中的this就是哪一个对象

构造器

  • 什么是构造器?构造器其实是一种特殊的方法,但是这个方法没有返回值类型,方法名必须和类名相同。

  • 构造器什么时候执行?new 对象就是在执行构造方法;

  • 构造方法的应用场景是什么?在创建对象时,可以用构造方法给成员变量赋值

  • 构造方法有哪些注意事项?

    • 在设计一个类时,如果不写构造器,Java会自动生成一个无参数构造器。
    • 一定定义了有参数构造器,Java就不再提供空参数构造器,此时建议自己加一个无参数构造器。
  • 如何快速生成构造器

    • 在代码空白界面鼠标右键,然后选择Generate -> Constructor -> 生成无参数构造器的点None
    • 生成有参数的构造器按住shift全选

构造器练习

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.itcast;

public class Student {
// 练习构造器
String name; // 学生姓名
double score; // 学生成绩
public Student(){
// 无参数构造器(在设计一个类时如果不写构造器,Java会自动生成一个无参数构造器。
System.out.println("无参数构造器触发执行了!");
}
public Student(String name, double score){
System.out.println("有参数构造器触发执行了!");
this.name = name;
this.score = score; // 在构造方法中给对象赋值
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.itcast;

public class Demo {
//构造器练习
public static void main(String[] args) {
Student s = new Student(); // 实例化一个student对象s
s.name = "小威";
s.score = 89.0;

Student s2 = new Student("小李", 99);
System.out.println(s2.name);
System.out.println(s2.score);
}
}

封装

  • 1. 什么是封装呢?

    所谓封装,就是用类设计对象处理某一个事物的数据时,应该把要处理的数据,以及处理数据的方法,都设计到一个对象中去。

    比如:在设计学生类时,把学生对象的姓名、语文成绩、数学成绩三个属性,以及求学生总分、平均分的方法,都封装到学生对象中来。

  • 2. 封装在代码中的体现

    知道什么是封装之后,那封装在代码中如何体现呢?一般我们在设计一个类时,会将成员变量隐藏,然后把操作成员变量的方法对外暴露。

    这里需要用到一个修饰符,叫private,被private修饰的变量或者方法,只能在本类中被访问。

    如,private double score; 就相当于把score变量封装在了Student对象的内部,且不对外暴露,你想要在其他类中访问score这个变量就,就不能直接访问了;

    如果你想给Student对象的score属性赋值,得调用对外暴露的方法setScore(int score),在这个方法中可以对调用者传递过来的数据进行一些控制,更加安全。

实体JavaBean

  • 面向对象编程中,经常写的一种类——叫实体JavaBean类。JavaBean实体类,是一种特殊的;它需要私有化成员变量,有空参数构造方法、同时提供getXxx和setXxx方法;JavaBean实体类仅仅只用来封装数据,只提供对数据进行存和取的方法
  • JavaBean实体类,只负责封装数据,而把数据处理的操作放在其他类中,以实现数据和数据处理相分离。

JavaBean练习

  • Student1类。是一个javabean
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.itcast;

public class Student1 {
// 必须私有成员变量,并为每个变量提供get,set方法
private String name;
private double score;
//必须为类提供一个公开的无参的构造器
public Student1(){
}
public Student1(String name, double score){
// 类的有参数构造器
this.name = name; // 哪一个对象调用方法,方法中的this就是哪一个对象
this.score = score;
}
// 快速生成方法,鼠标右键选择Generate然后点击Getter and Setter
// 注意这是一个JavaBean(满足两个条件,1,有getXxx和setXxx方法 2,类中有一个公共的无参构造器)
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;
}
}
  • StudentOperator类,用来进行操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.itcast;

public class StudentOperator {
private Student1 student1; // 定义一个student类型的变量
public StudentOperator(Student1 student1){
this.student1 = student1; // 在有参数的构造器中给成员变量赋值
}
public void printPass(){
// 在printPass方法中调用Student对象的方法
if (student1.getScore() >= 60){
System.out.println("成绩合格");
}else {
System.out.println("成绩不合格");
}
}
}

面向对象之电影票信息管理

  • Movie类,是一个JavaBean
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package com.itcast;

public class Movie {
// 电影类仅仅只是为了封装电影的信息,所以为Javabean
/*
1. 想要展示系统中全部的电影信息(每部电影:编号、名称、价格)
2. 允许用户根据电影的编号(id),查询出某部电影的详细信息。
*/
/*
首先每一部电影,都包含这部电影的相关信息,
比如:电影的编号(id)、电影的名称(name)、电影的价格(price)、
电影的分数(score)、电影的导演(director)、电影的主演(actor)、电影的简介(info)。
*/
private int id; // 电影的编号(id)
private String name; // 电影的名称(name)
private double price; // 电影的价格(price)
private double score; // 电影的分数(score)
private String director; // 电影的导演(director)
private String actor; // 电影的主演(actor)
private String info; // 电影的简介(info)

public Movie(){
// 定义无参构造器
// new 对象就是在执行构造方法
}
public Movie(int id, String name, double price, double score, String director, String actor, String info){
// // new 对象就是在执行构造方法
this.id = id;
this.name = name;
this.price = price;
this.score = score;
this.director = director;
this.actor = actor;
this.info = info;
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

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;
}
}
  • MovieOperator类,用来封装一些查找,打印电影票信息的操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package com.itcast;

public class MovieOperator {
/*
前面我们定义的Movie类,仅仅只是用来封装每一部电影的信息。
为了让电影数据和电影数据的操作相分离,我们还得定义一个电影操作类(MovieOperator)。

因为系统中有多部电影,所以电影操作类中MovieOperator,需要有一个Movie[] movies; 用来存储多部电影对象;

同时在MovieOperator类中,提供对外提供,对电影数组进行操作的方法。
printAllMovies()用于打印数组中所有的电影信息,searchMovieById(int id)方法根据id查找一个电影的信息并打印。
*/
//因为系统中有多部电影,所以电影操作类中,需要有一个Movie的数组
private Movie[] movies; // 这是定义数组的方式嗷
// 定义构造器,用于接收参数,并将收到的参数赋值给movies数组
public MovieOperator(Movie[] movies) {
this.movies = movies;
}
/** 1、展示系统全部电影信息 movies = [m1, m2, m3, ...]*/
public void printAllMovies(){
System.out.println("-----系统全部电影信息如下:-------");
for (int i = 0; i < movies.length; i++) {
Movie m = movies[i]; // 将一部电影的所有信息变为一个movie对象
System.out.println("编号:" + m.getId());
System.out.println("名称:" + m.getName());
System.out.println("价格:" + m.getPrice());
System.out.println("------------------------");
}
}
public void searchMovieById(int id){
// 通过参数(id)查询电影信息
for (int i = 0; i < movies.length; i++) {
Movie m = movies[i];
int mvid = m.getId();
if (mvid == id){
System.out.println("找到了");
System.out.println("编号:" + m.getId());
System.out.println("名称:" + m.getName());
System.out.println("价格:" + m.getPrice());
}else continue;
}
}
}
  • Test类,对接用户,接收用户的输入并调用对象方法对数据进行处理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package com.itcast;

import java.util.Scanner;

public class Test {
public static void main(String[] args) {
// 我们需要在测试类中,准备好所有的电影数据,并用一个数组保存起来。
// 每一部电影的数据可以封装成一个对象。然后把对象用数组存起来即可
//创建一个Movie类型的数组
Movie[] movies = new Movie[4];
//创建4个电影对象,分别存储到movies数组中
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 mvop = new MovieOperator(movies); // 创建MovieOperator类对象,并将数组传递进去
mvop.printAllMovies();
Scanner sc = new Scanner(System.in); // 接收用户输入
while (true){
System.out.println("==电影信息系统==");
System.out.println("1、查询全部电影信息");
System.out.println("2、根据id查询某个电影的详细信息展示");
System.out.println("请您输入操作命令:");
int choice = sc.nextInt(); // 接收用户输入
switch (choice){
case 1:
mvop.printAllMovies();
break;
case 2:
System.out.println("请您输入这个电影的id:");
int i = sc.nextInt();
mvop.searchMovieById(i); // 通过id查询电影信息
break;
default:
System.out.println("您输入的id有问题!");
}
}
}
}