目录
1、小美与麻辣烫的故事
小美同学上了一天的课,今天想放松放松吃个麻辣烫,于是在美团外卖上下了一份订单。该订单被分配给了骑手小帅哥,由于配送时长会影响个人绩效,因此小哥以三步并作两步之势,飞快地骑着电动车赶到了店家。
此时老板娘正开始准备小美同学的麻辣烫。
小美所选材料如下:(供参考模仿后果自负~呵呵)
配料:多辣、多麻、盐正常。
配菜:金针菇、鱼丸、鱼豆腐、蟹肉棒、杏鲍菇、猪肝、鹌鹑蛋。
老板娘一看,这美女真会吃~很娴熟地在菜架上为小美挑选完了食材。
准备好食材后开始下锅。5分钟后,一份热气腾腾香味扑鼻的麻辣烫就出炉了。是不是你也开始馋了,别急,学完这篇你再去学校旁边的店里去吃……
骑手小哥再次以讯雷不及掩耳之事把餐送到了满怀期待的小美手里。
小哥和小美都很开心:一个绩效达标了;一个及时享受到了美食。
好了,小美吃麻辣烫的故事结束了。
是不是你的心早已飘到麻辣烫店去了…… 赶紧回来!
让我们把思维拉回到本篇的学习主要目的Java面向对象的三大特性讲解。
2、场景技术实现
首先,我们要对前面的场景进行简要梳理,以便为后面的讲解内容做准备。
出场人物:客户小美、骑手小张、麻辣烫店老板娘
剧情道具:一个麻辣烫订单、一个麻辣烫秘方(非独家~哈哈)
我们就从麻辣烫定单本身来聊聊三大特性。
小美要求的微辣微辣可以看着是“封装”和“多态”的体现;盐正常可以看着是对原配料的正常“继承”;
2.1 最终效果图
2.2 奉上源码
美团订单信息:
/**
* 美团订单信息
*/
public class MeiTuanOrderInfo extends MaLaTangInfo {
// 订单名称
private String orderName;
// 订单用户名称
private String userName;
@Override
protected String massTaste() {
String s = super.massTaste();
return "["+userName+"]的订单["+orderName+"]信息: "+s;
}
public String getOrderName() {
return orderName;
}
public void setOrderName(String orderName) {
this.orderName = orderName;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
麻辣烫信息:
import java.io.Serializable;
/**
* 麻辣烫信息(非独家秘方)
*/
public abstract class MaLaTangInfo implements Serializable {
private Double hotePpper = 1.0; //辣椒 (单位: 两)
private Double pepper = 1.0; //花椒 (单位: 两)
private Double salt = 1.0; //咸盐(单位: 两)
private String taste = "普通";
// 大众口味
protected String massTaste() {
return "辣椒"
+this.hotePpper + "两,花椒"
+this.pepper + "两,咸盐"
+this.salt+"两,口味"+getTaste()
+";"+featureCheck();
}
// 口味判断
private String getTaste() {
Double ts = this.hotePpper
+ this.pepper
+ this.salt;
if (ts > 3.0) {
return "较重";
}
if (ts <= 2.0) {
return "较轻";
}
return taste;
}
private String featureCheck(){
return "\n使用到的Java特性:[口味信息->继承][口味判断->封装]"
+"[辣椒->"+hotePpperFeature+"]"
+"[花椒->"+hotePpperFeature+"]"
+"[盐->"+hotePpperFeature+"]";
}
// 三个Feature仅为演示Java特性使用
private String hotePpperFeature = "继承"; // 辣椒Java特性
private String pepperFeature = "继承"; // 花椒Java特性
private String saltFeature = "继承"; // 盐的Java特性
public Double getHotePpper() {
return hotePpper;
}
public void setHotePpper(Double hotePpper) {
this.hotePpper = hotePpper;
}
public Double getPepper() {
return pepper;
}
public void setPepper(Double pepper) {
this.pepper = pepper;
}
public Double getSalt() {
return salt;
}
public void setSalt(Double salt) {
this.salt = salt;
}
public String getHotePpperFeature() {
return hotePpperFeature;
}
public void setHotePpperFeature(String hotePpperFeature) {
this.hotePpperFeature = hotePpperFeature;
}
public String getPepperFeature() {
return pepperFeature;
}
public void setPepperFeature(String pepperFeature) {
this.pepperFeature = pepperFeature;
}
public String getSaltFeature() {
return saltFeature;
}
public void setSaltFeature(String saltFeature) {
this.saltFeature = saltFeature;
}
}
测试类:
public class TestMaLaTang {
public static void main(String[] args) {
getOrderInfo("小美", "麻辣烫", 1.0, 1.0, null);
getOrderInfo("小东", "麻辣烫", 2.0, null, 1.0);
getOrderInfo("小宝", "麻辣烫", 4.0, 0.0, 0.0);
getOrderInfo("小讯", "麻辣烫", null, 1.0, 0.0);
}
private static void getOrderInfo(String userName,
String orderName,
Double hotePpper,
Double pepper,
Double salt) {
MeiTuanOrderInfo meiTuanOrderInfo = new MeiTuanOrderInfo();
meiTuanOrderInfo.setOrderName(orderName);
meiTuanOrderInfo.setUserName(userName);
if(null != hotePpper) {
meiTuanOrderInfo.setHotePpperFeature("多态");
meiTuanOrderInfo.setHotePpper(hotePpper);
}
if(null != pepper) {
meiTuanOrderInfo.setPepperFeature("多态");
meiTuanOrderInfo.setPepper(pepper);
}
if(null != salt) {
meiTuanOrderInfo.setSaltFeature("多态");
meiTuanOrderInfo.setSalt(salt);
}
System.out.println(meiTuanOrderInfo.massTaste()+"\n");
}
}
3、回头看技术
故事看完了,估计你的麻辣烫也吃完了,现在需要开启属于你自己的思考空间了。以下问题答案建议给自己几秒思考时间~~ 因为你思考后的结果才是真正属于你自己的。
3.1 封装
1) 体现在三个方面:属性->方法->类。(思考几秒)
2) 隐藏细节:修饰为private或仅暴露接口方法,使代码更安全以及外部只关注核心业务逻辑即可。(思考几秒)
3.2 继承
1)体现在两个方面:父类属性->父类方法。(思考几秒)
2) 继承关系常用的关键字:extends
说明:如果我们定义的类没有显式继承某个类,系统默认为我们继承Objects。
3)提高了代码的复用性和可扩展性。(思考几秒)
3.3 多态
1)多态的三个必要条件是:A、有继承或实现关系 B、有方法的重写 C、父类引用指向子类对象
2)常见关键字:重写override。
3)提高程序的扩展性。父类可实现公共部分、由子类完成个性化部分。(例如麻辣烫的信息)
4) 父类不能使用子类的特有成员。通常解决方案通过向下转型:格式为子类型 对象名 = (子类型)父类引用;
4、面试官想知道什么
这才是大名鼎鼎的江湖四剑客(小美、小宝、小东和小讯) 内心的真实想法。
1)入门基础-考察基本功
2)与其他编程语言的优劣对比-考察知识面的广度
3)站在Java这门语言视角思考-考察看问题的高度