来谈谈JAVA面向对象 - 鲁班即将五杀,大乔送他回家??
开发IDE为Eclipse或者MyEclipse。
首先,如果我们使用面向过程的思维来解决这个问题,就是第一步做什么,第二步做什么?
鲁班即将五杀,大乔送他回家
这个现象可以简单地拆分为两步,代码大概是这个样子的:
public class Test01 { public static void main(String[] args) { System.out.println("鲁班即将五杀"); System.out.println("大乔送他回家"); } }
面向过程的思维大概就是这样。
如果我们用面向对象的思维来看待这个问题,首先,得抽象出有哪几个对象。
鲁班类:
/*** 鲁班类* @author Administrator**/
public class Luban { private String name = "鲁班"; //英雄的名字 private int killCount = 0; //击杀个数 }
因为鲁班会有一个从 first blood 到 penta kill 的过程 , 在这个过程中,需要对killCount 这个变量一步步递增,所以,我们给它再加一个kill方法。
public void kill(){ killCount++; switch (killCount) { case 1: System.out.println("First Blood!"); break; case 2: System.out.println("Double Kill!"); break; case 3: System.out.println("Triple kill!"); break; case 4: System.out.println("Quadra kill!"); break; case 5: System.out.println("Penta kill!"); break; default: break; } }
这个时候,我们发现,访问不了私有变量。我们需要给name和killCount添加对应的get,set方法:
Alt + S --> Generator Getters and Setters -->
这样就自动生成了!
至此,鲁班类告一段落,接下来编写大乔类:
/*** 大乔类* @author Administrator**/
public class Daqiao { private String name = "大乔"; /** * 放大招的方法 */ public void DaZhao(Luban luban){ } }
大招方法需要把鲁班给装进去,大家思考如何实现送鲁班回家的过程?
这边我提供一个思路,给鲁班添加一个私有的布尔属性 isAtHome,默认是false。当鲁班被传递进大乔的大招方法里之后,就改为true。
private boolean isAtHome = false; //是否回泉水?
别忘了生成 get set 方法。
于是乎,大招方法就变成了这样:
/*** 放大招的方法*/
public void DaZhao(Luban luban){ luban.setAtHome(true); }
现在大家再想一个问题,当鲁班回泉水了,还能不能继续调用 kill 方法?
肯定是不能了,修改后的 kill 方法,在killCount++之前就应该return掉:
public void kill(){ if(this.isAtHome){ setName("鲁班七号"); System.out.println(name + ":我是谁,在干什么??"); return; } killCount++; switch (killCount) { case 1: System.out.println("First Blood!"); break; case 2: System.out.println("Double Kill!"); break; case 3: System.out.println("Triple kill!"); break; case 4: System.out.println("Quadra kill!"); break; case 5: System.out.println("Penta kill!"); break; default: break; } }
测试:
import bean.Daqiao; import bean.Luban; public class Test02 { public static void main(String[] args) { Luban luban = new Luban(); luban.kill(); luban.kill(); luban.kill(); luban.kill(); Daqiao dq = new Daqiao(); dq.DaZhao(luban); luban.kill(); } }
以上就是我们面向对象的一般思路,先抽象出有几个类,然后设计每个类中有哪些方法?
面向对象有三大特性,分别为继承,封装和多态。
继承
还是这个例子,思考:鲁班和大乔都属于王者峡谷里面的英雄。他们有很多共同的特性。我们可以抽象出一个通用的英雄类,Hero类 。
package bean;/** * 英雄类 * @author Administrator * */ public class Hero { protected String name; protected int killCount = 0; protected boolean isAtHome = false; public void kill(){ } public void DaZhao(){ } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getKillCount() { return killCount; } public void setKillCount(int killCount) { this.killCount = killCount; } public boolean isAtHome() { return isAtHome; } public void setAtHome(boolean isAtHome) { this.isAtHome = isAtHome; } }
然后让鲁班和大乔都继承这个类。
对鲁班而言,继承了Hero类以后,只需要重写kill即可,省去了很多代码:
package bean;/** * 鲁班类 * @author Administrator * */ public class Luban extends Hero{ public void kill(){ if(this.isAtHome){ System.out.println(name + ":我是谁,在干什么??"); return; } killCount++; switch (killCount) { case 1: System.out.println("First Blood!"); break; case 2: System.out.println("Double Kill!"); break; case 3: System.out.println("Triple kill!"); break; case 4: System.out.println("Quadra kill!"); break; case 5: System.out.println("Penta kill!"); break; default: break; } } }
大乔类也是同样的道理:
package bean;/** * 大乔类 * @author Administrator * */ public class Daqiao extends Hero{ /** * 放大招的方法 */ public void DaZhao(Luban luban){ luban.setAtHome(true); } }
这个时候,我们可以看到,继承的一个好处就是可以省去很多重复的代码,提高了代码的复用率。
封装
现在我们考虑如何让java程序来播放一个音乐?
经过改造后的鲁班 kill 方法:
public void kill(){ if(this.isAtHome){ setName("鲁班七号"); System.out.println(name + ":我是谁,在干什么??"); return; } killCount++; switch (killCount) { case 1: //解析音乐地址 try{ URL codebase = new URL("file:/E:/workspace/demos/1.wav"); AudioClip a = Applet.newAudioClip(codebase); a.play(); //播放音乐 Thread.sleep(2000); }catch(Exception e){ System.out.println("错就错呗,无所谓!"); } System.out.println("First Blood!"); break; case 2: //解析音乐地址 try{ URL codebase = new URL("file:/E:/workspace/demos/2.wav"); AudioClip a = Applet.newAudioClip(codebase); a.play(); //播放音乐 Thread.sleep(2000); }catch(Exception e){ System.out.println("错就错呗,无所谓!"); } System.out.println("Double Kill!"); break; case 3: //解析音乐地址 try{ URL codebase = new URL("file:/E:/workspace/demos/3.wav"); AudioClip a = Applet.newAudioClip(codebase); a.play(); //播放音乐 Thread.sleep(2000); }catch(Exception e){ System.out.println("错就错呗,无所谓!"); } System
转载于:https://www.cnblogs.com/banxian-yi/p/10579444.html
来谈谈JAVA面向对象 - 鲁班即将五杀,大乔送他回家??相关推荐
- 谈谈java面向对象之抽象,手把手带你搞定java面试之面向对象
计算机语言晦涩难懂,打算利用通俗易懂的文字带领大家学习java基础.如果文中有什么错误的地方,欢迎大家在评论区指正,免得我误人子弟. Question:当面试JAVA开发岗位的时候,面试官最爱问的问题 ...
- 谈谈java面向对象思想_对于Java面向对象思想的理解
在Java中,除了8种基本数据类型.其他皆为对象! 面向对象主要有 三个基本特征:封装,继承,多态. 封装 主要概念是指:隐藏对象的属性和实现细节,仅对外暴露公共的访问方式.封装是面向对象最基本的特征 ...
- 三篇文章彻底搞懂Java面向对象之一
写在前面,Java基础系列文章都是作者基于b站尚硅谷的Java基础视频所做的笔记,没有时间的同学可以认真看看,如果有时间的同学,还是建议看看视频,毕竟笔记说到底还是自己的东西,每个人的习惯也是不一样的 ...
- 面试轻松讲清楚 Java 面向对象的问题与知识(类与对象,封装,继承,多态,接口,内部类...)
写在最前面 这个项目是从20年末就立好的 flag,经过几年的学习,回过头再去看很多知识点又有新的理解.所以趁着找实习的准备,结合以前的学习储备,创建一个主要针对应届生和初学者的 Java 开源知识项 ...
- 如何讲清楚 Java 面向对象的问题与知识?(类与对象,封装,继承,多态,接口,内部类...)
二 Java面向对象 类和对象 1.1 什么是面向过程?什么又是面向对象? 面向过程--步骤化 面向过程就是分析出实现需求所需要的步骤,通过函数(方法)一步一步实现这些步骤,接着依次调用即可 面向对象 ...
- 孙卫琴:我为什么要写《Java面向对象编程》
孙卫琴:我为什么要写<Java面向对象编程> 特约作者:孙卫琴 策划 & 设计 & 制作:李大微 当<精通Struts>和<精通Hibernate> ...
- 谈谈Java与C#的区别
先听一个故事:Java与C/C++/C#的历史渊源 1972年的某一天,一个被称为"上帝的编程语言"的工具就此诞生,它是基于B语言的改进,并被正式命名为C语言.凭借着自身的优秀特性 ...
- java面向对象的全面分析
由于文章可能过长,看自己需要的部分即可-我尽量把java面向对象讲得全面一点,尽量让有一点点Java学习基础的同学也能看得懂,了解的深度也足够. 若在文章中发现了什么问题或者不太理解的地方-请及时评论 ...
- java封装是什么_java封装是什么?Java面向对象的封装
java封装是什么? 在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部份包装.隐藏起来的方法. 封装可以被认为是一个保护屏障,防止该类的代码和数据 ...
最新文章
- 错误 - 无法访问IIS元数据库
- msb Lesson00_Object_Class.scala
- 正确理解hibernate的inverse属性
- PHP Deprecated: Function ereg_replace() is deprecated in 的解决方法
- Android 5.0新特性
- web项目下的web.xml listener监听总结
- 华为一季度每天入账20亿,首次披露云业务用户超100万
- wps计算机一级考试提纲,2017计算机一级考试大纲:WPS Office (汇总)
- 【例9.7】友好城市
- Linux内核开发_2_Initramf
- c 语言基础笔试题1
- Filebeat Filter - Dissect/DNS Reverse
- C语言斐波那切数列数列求和
- 怎么查询上网帐号和上网口令_宽带上网账号和密码忘记了该怎么查询
- 博客实名与一年前的预言
- 分布式数据库CAP理论
- DBC文件的编辑方法
- Unreal Engin_画廊制作笔记 _004灯光处理,添加灯光
- 【98期】面试官:给我说说你对Java GC机制的理解?
- 行人重识别数据集Person Re-Identification Datasets(全)
热门文章
- 全国计算机等级考试题库二级C操作题100套(第02套)
- 阿里巴巴开发规范集合处理
- java lambda 表达式中的双冒号和箭头的用法 ::
- docker启动报错 (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 9876 -j DNAT --
- java关键字整理_【java基础知识整理】java基础语法之关键字
- Linux中Shell的转义用法笔记
- jsp java注释_jsp注释方式
- Python3的方法解析顺序(MRO)
- 印发 指南 通知_通知设计的综合指南
- web登录界面设计_出色的Web界面设计的7条规则