最新Java基础系列课程--Day06-类和对象(二)https://developer.aliyun.com/article/1423498
九、成员变量和局部变量的区别
各位同学,面向对象的基础内容咱们已经学习完了。同学们在面向对象代码时,经常会把成员变量和局部变量搞混。所以现在我们讲一讲他们的区别。
如下图所示,成员变量在类中方法外,而局部变量在方法中。
到这里,我们关于面向对象的基础知识就学习完了。面向对象的核心点就是封装,将数据和数据的处理方式,都封装到对象中; 至于对象要封装哪些数据?对数据进行怎样的处理? 需要通过类来设计。
需要注意的是,不同的人,对同一个对象进行设计,对象封装那些数据,提供哪些方法,可能会有所不同;只要能够完成需求,符合设计规范,都是合理的设计。
十、匿名对象的使用
以当一个对象被创建之后,在调用该对象的方法时,也可以不定义对象的引用变量(也就是没有变量名),而直接调用这个对象的方法,这样的对象叫做匿名对象。
示例:
将 Cylinder volu=new Cylinder(); volu.SetCylinder(2.5, 5,3.14); 改写为: new Cylinder().SetCylinder(2.5, 5,3.14); 则Cylinder()就是匿名对象。
以使用匿名对象通常有如下两种情况:
如果对一个对象只需要进行一次方法调用。
将匿名对象做为实参传递给一个方法调用。
示例:
一个程序中有一个getSomeOne()方法要接收一个MyClass类对象作为参数,方法的定义如下: public static void getSomeOne (MyClass c) { …… }
可以用下面的语句调用这个方法。
getSomeOne(new MyClass( ) ); //此时的参数就是匿名对象
十一、面向对象综合案例
学习完面向对象的语法知识之后。接下来,我们做一个面向对象的综合案例——模仿电影信息系统。
需求如下图所示
1. 想要展示系统中全部的电影信息(每部电影:编号、名称、价格) 2. 允许用户根据电影的编号(id),查询出某个电影的详细信息。
运行程序时,能够根据用户的选择,执行不同的功能,如下图所示
按照下面的步骤来完成需求
1. 第一步:定义电影类
首先每一部电影,都包含这部电影的相关信息,比如:电影的编号(id)、电影的名称(name)、电影的价格(price)、电影的分数(score)、电影的导演(director)、电影的主演(actor)、电影的简介(info)。
为了去描述每一部电影,有哪些信息,我们可以设计一个电影类(Movie),电影类仅仅只是为了封装电影的信息,所以按照JavaBean类的标准写法来写就行。
public class Movie { private int id; private String name; private double price; private double score; private String director; private String actor; private String info; public Movie() { } public Movie(int id, String name, double price, double score, String director, String actor, String info) { 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; } }
2. 第二步:定义电影操作类
前面我们定义的Movie类,仅仅只是用来封装每一部电影的信息。为了让电影数据和电影数据的操作相分离,我们还得有一个电影操作类(MovieOperator)。
因为系统中有多部电影,所以电影操作类中MovieOperator,需要有一个Movie[] movies;
用来存储多部电影对象;
同时在MovieOperator类中,提供对外提供,对电影数组进行操作的方法。如printAllMovies()
用于打印数组中所有的电影信息,searchMovieById(int id)
方法根据id查找一个电影的信息并打印。
public class MovieOperator { //因为系统中有多部电影,所以电影操作类中,需要有一个Movie的数组 private Movie[] 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]; System.out.println("编号:" + m.getId()); System.out.println("名称:" + m.getName()); System.out.println("价格:" + m.getPrice()); System.out.println("------------------------"); } } /** 2、根据电影的编号查询出该电影的详细信息并展示 */ public void searchMovieById(int id){ for (int i = 0; i < movies.length; i++) { Movie m = movies[i]; if(m.getId() == id){ System.out.println("该电影详情如下:"); System.out.println("编号:" + m.getId()); System.out.println("名称:" + m.getName()); System.out.println("价格:" + m.getPrice()); System.out.println("得分:" + m.getScore()); System.out.println("导演:" + m.getDirector()); System.out.println("主演:" + m.getActor()); System.out.println("其他信息:" + m.getInfo()); return; // 已经找到了电影信息,没有必要再执行了 } } System.out.println("没有该电影信息~"); } }
3. 第三步:定义测试类
最后,我们需要在测试类中,准备好所有的电影数据,并用一个数组保存起来。每一部电影的数据可以封装成一个对象。然后把对象用数组存起来即可。
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类中,所以接下来,创建MovieOperator类对象,调用方法就可以完成相关功能。
继续再main方法中,接着写下面的代码。
// 4、创建一个电影操作类的对象,接收电影数据,并对其进行业务处理 MovieOperator operator = new MovieOperator(movies); Scanner sc = new Scanner(System.in); while (true) { System.out.println("==电影信息系统=="); System.out.println("1、查询全部电影信息"); System.out.println("2、根据id查询某个电影的详细信息展示"); System.out.println("请您输入操作命令:"); int command = sc.nextInt(); switch (command) { case 1: // 展示全部电影信息 operator.printAllMovies(); break; case 2: // 根据id查询某个电影的详细信息展示 System.out.println("请您输入查询的电影id:"); int id = sc.nextInt(); operator.searchMovieById(id); break; default: System.out.println("您输入的命令有问题~~"); } }