一直想写一篇介绍面向对象的文章,面向对象对于初学者来说,不好理解。于是设计了一个把大象装进冰箱的程序,先看代码。
如何把大象装进冰箱?
- (人或机器)把冰箱门打开
- (人或机器)把大象装进去
- (人或机器)把冰箱门关上
所以程序可以这样设计了:
冰箱是一个对象,大象也是一个对象,所以写两个类;
冰箱有门和放东西的空间,这是冰箱的属性;不需要用到大象的属性;
冰箱有开门和关门这两种行为;大象有走进冰箱这一种行为;
先写冰箱类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package com.rain.demo; public class Fridge { //冰箱类 private static String Goods;//冰箱里的物品属性 private boolean state; // 冰箱门的状态 public void OpenDoor(){ //打开冰箱 this.state = true; System.out.println("冰箱门打开"); } public void CloseDoor(){//关闭冰箱 this.state = false; System.out.println("冰箱门关闭"); } public void Set_Goods(String name){//放入物品 this.Goods = name; } public void Get_Goods(){ //获取里面的物品 System.out.println("里面是"+Goods); } } |
再写大象类:
1 2 3 4 5 6 7 8 9 10 |
package com.rain.demo; public class Elephant { //大象类 public void Walk_Fridge(){ Fridge fridge = new Fridge(); fridge.Set_Goods("大象"); System.out.println("大象走进了冰箱"); } } |
最后是main()方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package com.rain.demo; public class demo { //主类 public static void main(String[] args) { Fridge fridge = new Fridge(); Elephant elephant = new Elephant(); fridge.OpenDoor(); elephant.Walk_Fridge(); fridge.CloseDoor(); System.out.print("冰箱里有什么:"); fridge.Get_Goods(); } } |
运行结果:
1 2 3 4 5 |
冰箱门打开 大象走进了冰箱 冰箱门关闭 冰箱里有什么:里面是大象 |
在这里先简单说一下面向对象的三大特征,然后再说说代码中的体现。
-
封装:属性可以用来描述同一类事物的特征,行为可描述一类事物可做的操作,而封装就是把属于同一类事物的共性(包括属性和行为)归到一个类中,以方便使用。
-
继承:由于封装,使得有共同特征的一类事物的所有描述信息都被归于一个类之中,但有些事物虽然有共性,但还是存在区别的。比如把冰箱这个类的品牌、容量、制冷等共性封装起来,但有的冰箱还能智能控温。智能控温冰箱有普通冰箱一样的有共性,但我们不能把智能控温这一行为也封装到冰箱类里面去,智能控温是智能控温冰箱的特征行为之一。为了省事地封装智能控温冰箱(代码的复用,这也是继承存在的原因之一),可以让智能控温冰箱取继承冰箱类:
-
多态:能站在抽象的角度去描述一件事,而针对这件抽象的事, 对于每个个体(具体)又能找到其自身的行为去执行, 这就是多态.比如说冰箱按用途可分为冷藏箱、冷藏冰冻箱、冰冻箱。冷藏箱至少有一个冷藏室,但没有冰冻室;冷藏冰冻箱至少有一间冷藏室、一间冰冻室;冰冻箱至少有一间冰冻室,可有冷冻食品储藏室。它们都同属冰箱类,都有各自的行为去收纳物品。
分析代码中的面向对象思想的体现:
-
封装:通过访问修饰符private把冰箱里的东西、门的打开和关闭状态封装起来变为冰箱类的私有属性,外部只能通过公共的方法去访问这些属性。
-
继承:假如要把大象关进海尔冰箱,只需要写一个海尔冰箱类去继承冰箱类(冰箱类的所有属性和行为都会被海尔冰箱类继承过来),然后让大象走进海尔冰箱即可。
-
多态:大象有很多品种,每个品种进冰箱的方式也不一样。比如让亚洲象走进去、赶非洲草原象进去、把非洲森林象抬进去等。