張 楠
面向過程和面向?qū)ο筮@是兩種編程思路扩氢。
面向過程中函數(shù)是一等公民驶赏,面向?qū)ο笾?strong>對(duì)象是一等公民炸卑,且看解釋。
以造車為例:
面向過程大致是如下思路:
1煤傍、造一個(gè)發(fā)動(dòng)機(jī)
2盖文、造四個(gè)車輪子
...
3、組裝起來
/**
* @author zn
* @date 2020/1/30
*/
public class BuildCar {
public static void main(String[] args) {
String engine;
String[] wheels;
//1.創(chuàng)建發(fā)動(dòng)機(jī)
engine = buildEngine();
//2.創(chuàng)建輪子
wheels = buildWheels();
//3.組裝汽車
boolean flag = buildCar(engine,wheels);
//4蚯姆,查看汽車是否組裝成功
if (flag){
System.out.println("汽車組裝成功五续,可以上路了!");
}else{
System.out.println("汽車缺少零件龄恋,未組裝成功疙驾!");
}
}
//組裝汽車
private static boolean buildCar(String engine, String[] wheels) {
//組裝汽車時(shí)進(jìn)行判斷,如果沒有發(fā)動(dòng)機(jī)郭毕,沒有輪子荆萤,或者輪子數(shù)量不夠,就組裝失敗
if (engine.equals("") || wheels == null || wheels.length < 4){
return false;
}
System.out.println("開始安裝【" + engine +"】");
for (String wheel : wheels) {
System.out.println("開始安裝【" + wheel + "】");
}
return true;
}
//創(chuàng)建發(fā)動(dòng)機(jī)
private static String buildEngine() {
//省略創(chuàng)建的過程
return "地球夢(mèng)自然吸氣發(fā)動(dòng)機(jī)";
}
//創(chuàng)建輪子
private static String[] buildWheels() {
String[] wheels = new String[4];
wheels[0] = "左前輪";
wheels[1] = "右前輪";
wheels[2] = "左后輪";
wheels[3] = "右后輪";
return wheels;
}
}
??通過例子來看,在面向?qū)ο蟮木幊坍?dāng)中链韭,都是一直在調(diào)用方法偏竟,在面向過程編程中一般稱為函數(shù),每個(gè)函數(shù)封裝一些功能敞峭,做事情都是按序就班一步一步來踊谋。這里都是直接調(diào)用函數(shù),所以函數(shù)是一等公民旋讹,也就是就是函數(shù)最重要的組成部分殖蚕。
??我們?cè)跊]有學(xué)習(xí)面向?qū)ο笾八鶎懙男乐速Y管理和英雄者游戲就是使用面向過程寫的,典型的面向過程語言就是c語言沉迹。
面向?qū)ο蟠笾率侨缦滤悸罚?/h4>
??相比于面向過程睦疫,面向?qū)ο笮略隽艘粋€(gè)關(guān)鍵字new,這個(gè)關(guān)鍵字鞭呕,如同一個(gè)萬能的工人一樣蛤育,能夠按照說明書,制造任何東西葫松。
??1瓦糕、搞一個(gè)發(fā)動(dòng)機(jī)的說明書(Engine類)
??2、搞一個(gè)車輪子的說明書(Wheel類)
??3腋么、搞一個(gè)汽車的說明書咕娄,首先我們要明白車子一定有,一個(gè)發(fā)動(dòng)機(jī)珊擂,四個(gè)輪子圣勒,所以我們?cè)谌绾沃圃炱嚨恼f明(構(gòu)造方法)里就去使用new這個(gè)萬能功能直接造出一個(gè)發(fā)動(dòng)機(jī)和四個(gè)輪子并裝在汽車上。那么當(dāng)我們創(chuàng)建汽車的時(shí)候所有的東西就一并創(chuàng)建好了摧扇。
??4圣贸、直接創(chuàng)建一個(gè)汽車,或者讓汽車工廠生產(chǎn)一個(gè)汽車
/** 發(fā)動(dòng)機(jī)的說明書扳剿,這種更高級(jí)的封裝旁趟,分裝了發(fā)動(dòng)機(jī)的一些屬性比如品牌名稱,還有一些發(fā)動(dòng)機(jī)的功能庇绽,也叫行為锡搜,
* 也叫方法如發(fā)動(dòng)機(jī)要運(yùn)行。有了這個(gè)說明書我們就能使用new關(guān)鍵字瞧掺,隨意創(chuàng)建多個(gè)發(fā)動(dòng)機(jī)耕餐,并且所有的創(chuàng)建出來的 * 發(fā)動(dòng)機(jī)都有這些屬性和方法。
**/
public class Engine {
private String name;
public void run(){
System.out.println("【" + name + "】引擎發(fā)動(dòng)了辟狈!");
}
public Engine(String name) {
this.name = name;
}
}
//輪子的說明書
public class Wheel {
private String position;
public void run(){
System.out.println("【"+ position +"】開始轉(zhuǎn)動(dòng)了肠缔!");
}
public Wheel(String position) {
this.position = position;
}
}
//汽車的說明書
public class Car {
//汽車的品牌
private String type;
//汽車肯定有發(fā)動(dòng)機(jī)
private Engine engine;
//汽車還有幾個(gè)輪子
private Wheel wheels[];
//Car的構(gòu)造方法夏跷,定義了汽車是怎么被構(gòu)造的,造車時(shí)要有發(fā)動(dòng)機(jī)和輪子
public Car(String type) {
this.type = type;
this.engine = new Engine("地球夢(mèng)");
this.wheels = new Wheel[4];
this.wheels[0] = new Wheel("左前輪胎");
this.wheels[1] = new Wheel("右前輪胎");
this.wheels[2] = new Wheel("左后輪胎");
this.wheels[3] = new Wheel("右后輪胎");
}
//讓汽車跑起來的方法
public void run(){
System.out.println("----------第一步明未,啟動(dòng)發(fā)動(dòng)機(jī)----------");
this.engine.run();
System.out.println("------第二步槽华,發(fā)動(dòng)機(jī)帶動(dòng)輪胎轉(zhuǎn)動(dòng)-------");
for (Wheel wheel : wheels) {
wheel.run();
}
System.out.println("---【"+ this.type +"】汽車跑起來了---");
}
}
public class Test {
public static void main(String[] args) {
//這里邊一般不直接調(diào)用方法
System.out.println("------------------第一輛車-----------------");
//一般使用new這個(gè)萬能工匠,去創(chuàng)建一個(gè)對(duì)象
Car car = new Car("日產(chǎn)奇駿");
//我們使用對(duì)象去調(diào)用方法
car.run();
System.out.println("------------------第二輛車-----------------");
Car crv = new Car("本田CRV");
crv.run();
}
}
結(jié)果:
------------------第一輛車-----------------
----------第一步趟妥,啟動(dòng)發(fā)動(dòng)機(jī)----------
【地球夢(mèng)】引擎發(fā)動(dòng)了猫态!
------第二步,發(fā)動(dòng)機(jī)帶動(dòng)輪胎轉(zhuǎn)動(dòng)-------
【左前輪胎】開始轉(zhuǎn)動(dòng)了披摄!
【右前輪胎】開始轉(zhuǎn)動(dòng)了亲雪!
【左后輪胎】開始轉(zhuǎn)動(dòng)了!
【右后輪胎】開始轉(zhuǎn)動(dòng)了疚膊!
---【日產(chǎn)奇駿】汽車跑起來了---
------------------第二輛車-----------------
----------第一步义辕,啟動(dòng)發(fā)動(dòng)機(jī)----------
【地球夢(mèng)】引擎發(fā)動(dòng)了!
------第二步寓盗,發(fā)動(dòng)機(jī)帶動(dòng)輪胎轉(zhuǎn)動(dòng)-------
【左前輪胎】開始轉(zhuǎn)動(dòng)了灌砖!
【右前輪胎】開始轉(zhuǎn)動(dòng)了!
【左后輪胎】開始轉(zhuǎn)動(dòng)了贞让!
【右后輪胎】開始轉(zhuǎn)動(dòng)了周崭!
---【本田CRV】汽車跑起來了---
??在面向?qū)ο蟮乃枷氘?dāng)中柳譬,在main方法中喳张,一般不直接調(diào)用方法,而是通過new創(chuàng)建很多對(duì)象美澳,通過對(duì)象去使用方法销部,這也就解釋了為什么對(duì)象是一等公民。
面向?qū)ο罄餂]有面向過程嗎制跟?
??不對(duì)舅桩,我的理解是,面向?qū)ο笫欠庋b的也是過程雨膨,每一個(gè)方法都是封裝了一些過程擂涛,這不過使用面向?qū)ο笫刮覀兙幊痰慕嵌劝l(fā)生了改變,他更加適合完成一些大型的復(fù)制項(xiàng)目聊记。
比如拿我們的英雄者游戲舉例:
這里一定要重理解撒妈,重感受,閉著眼睛想排监,怎么寫慢慢來狰右。
我們脫離了面向過程,使用面向?qū)ο笪覀儜?yīng)該怎么寫舆床?
大致是:
定義一個(gè)英雄類棋蚌,他有屬性比如名字嫁佳,血量等,他還有方法谷暮,比如走路蒿往,攻擊,技能等能
再定義一個(gè)boss類湿弦,他依然有屬性熄浓,有方法。
最后在main方法里省撑,我們只需要new幾個(gè)英雄赌蔑,new幾個(gè)boss讓他們打架就行了。
注:在面向?qū)ο笾形覀円话悴唤泻瘮?shù)竟秫,這里的區(qū)別在于理朋,方法是有所屬的,他是屬于某個(gè)對(duì)象的方法兔魂,而函數(shù)是獨(dú)立的弛作,他不屬于任何其他的東西。