一、java是強制寫class關鍵字的語言,不能有獨立的函數遊離在類外出如今文件中,這和python c++ 都不一樣,後面的均可以單獨在類外寫函數,因此java被稱爲是純面向對象的語言,py和c++都不是強制向對象的寫法。java
二、儘管如此,有的笨瓜,仍是打死也寫不出類來,並且強烈的反對寫類,認爲面向過程已經能搞定一切了,發明c++這種語言的人就是閒的沒事,c++對於c來講是徹底的多餘不必。python
可是當被公司要求寫java時候,就會矇蔽,以爲沒有面向對象經驗,很難轉變,此篇演示徹底的面向過程的思惟來寫java。讓從不用面向對象的py人員能夠不用面向對象來寫java。c++
三、首先是兩個縮寫。面向對象編程 oop, 面向過程編程pop編程
四、先來一個面向對象的java常規寫法,再來一個徹底的反對面向對象的寫法。閉包
PersonOOP.java文件。函數
import java.util.logging.*; /** * 一個使用面向對象寫的人類 * @author bfzs */ public class PersonOOP { private String name; private int age; private final String eyeColor; private float weight; public float height; private static Logger logger = Logger.getLogger(PersonOOP.class.toString()); public PersonOOP(String personName, int age, String eyeColor, float weight, float height) { name = personName; this.age = age; this.eyeColor = eyeColor; this.weight = weight; this.height = height; } /** * 年齡增加 * @param growingAge 要增長的年齡 */ public void growAge(int growingAge) { age = age + growingAge; } /** * 展現年齡的方法 */ public void showAge() { logger.info(name + " 的年齡是 " + age); } /** * 體重增加 * * @param growingWeight 要增長的體重 */ public void growWeight(float growingWeight) { weight = weight + growingWeight; } public void showWeight() { logger.info(name + " 的體重是 " + weight); } /** * 身高增加 * * @param growingHeight 要增長的身高 */ public void growHeight(float growingHeight) { height = height + growingHeight; } public void showHeight() { System.out.println(name + " 的身高是 " + height); } public void showEyeColor() { logger.info(name + " 的眼睛顏色是 " + eyeColor); } public void walk() { logger.info(name + " 在走路"); } }
下面是調用PersonOOP類的方式:工具
TestOOP.java,主要是展現人的屬性,而後用一些方法來改變人的屬性,而後再展現人的屬性oop
public class TestOOP { public static void main(String[] args) { //xiaohong PersonOOP xiaohong = new PersonOOP("xiaohong", 16, "black", 40.0f, 153.1f); xiaohong.showAge(); System.out.println(xiaohong.height); xiaohong.showWeight(); xiaohong.showEyeColor(); xiaohong.walk(); xiaohong.growAge(2); xiaohong.growWeight(10.0f); xiaohong.growHeight(5.0f); xiaohong.showAge(); System.out.println(xiaohong.height); xiaohong.showWeight(); // ******************************************************************************************* //xiaomin PersonOOP xiaomin = new PersonOOP("xiaomin", 18, "blue", 50.0f, 163.1f); xiaomin.showAge(); System.out.println(xiaomin.height); xiaomin.showWeight(); xiaomin.showEyeColor(); xiaomin.walk(); xiaomin.growAge(3); xiaomin.growWeight(10.0f); xiaomin.growHeight(5.0f); xiaomin.showAge(); System.out.println(xiaohong.height); xiaohong.showWeight(); } }
五、下面來展現的是用徹底面向過程的思惟來寫人類this
PersonPOP.javaspa
import java.util.logging.*; /** * 一個使用100%純面向過程寫的人類 * @author bfzs */ public class PersonPOP { private static Logger logger = Logger.getLogger(PersonOOP.class.toString()); /** * 設置爲私有方法,禁止此類調用構造函數進行實例化,僅能由類名調用方法不能用實例調用方法,看成工具類使用 */ private PersonPOP() { } public static int growAge(int age, int growingAge) { age = age + growingAge; return age; } public static void showAge(String name, int age) { logger.info(name + " 的年齡是 " + age); } public static float growWeight(float weight, float growingWeight) { weight = weight + growingWeight; return weight; } public static void showWeight(String name, float weight) { logger.info(name + " 的體重是 " + weight); } public static float growHeight(float height, float growingHeight) { height = height + growingHeight; return height; } public static void showHeight(String name, float height) { System.out.println(name + " 的身高是 " + height); } public static void showEyeColor(String name, String eyeColor) { logger.info(name + " 的眼睛顏色是 " + eyeColor); } public static void walk(String name) { logger.info(name + " 在走路"); } }
下面是TestPOP.java文件,主要是調用PersonPOP,來展現人的屬性和改變人的屬性。
public class TestPOP { public static void main(String[] args) { //xiaohong String xiaohongName = "xiaohong"; int xiaohongAge = 16; String xiaohongEyeColor = "black"; float xiaohongWeight = 40.0f; float xiaohongHeight = 153.1f; PersonPOP.showAge(xiaohongName, xiaohongAge); System.out.println(xiaohongHeight); PersonPOP.showWeight(xiaohongName, xiaohongWeight); PersonPOP.showEyeColor(xiaohongName, xiaohongEyeColor); PersonPOP.walk(xiaohongName); xiaohongAge = PersonPOP.growAge(xiaohongAge, 2); xiaohongWeight = PersonPOP.growWeight(xiaohongWeight, 10.0f); xiaohongHeight = PersonPOP.growHeight(xiaohongHeight, 5.0f); PersonPOP.showAge(xiaohongName, xiaohongAge); System.out.println(xiaohongHeight); PersonPOP.showWeight(xiaohongName, xiaohongWeight); // ******************************************************************************************* //xiaomin String xiaominName = "xiaomin"; int xiaominAge = 18; String xiaominEyeColor = "blue"; float xiaominWeight = 50.0f; float xiaominHeight = 163.1f; PersonPOP.showAge(xiaominName, xiaominAge); System.out.println(xiaominHeight); PersonPOP.showWeight(xiaominName, xiaominWeight); PersonPOP.showEyeColor(xiaominName, xiaominEyeColor); PersonPOP.walk(xiaominName); xiaominAge = PersonPOP.growAge(xiaominAge, 3); xiaominWeight = PersonPOP.growWeight(xiaominWeight, 10.0f); xiaominHeight = PersonPOP.growHeight(xiaominHeight, 5.0f); PersonPOP.showAge(xiaominName, xiaominAge); System.out.println(xiaominHeight); PersonPOP.showWeight(xiaominName, xiaominWeight); } }
六、用面向過程來寫人類,主要寫法方式就是不使用任何的成員變量/實例屬性,類中全部方法所有都用static修飾。
七、調用面向過程的人類時候,須要在類外設置不少變量來保存屬性。調用面向對象的時候是把屬性綁定到對象上,因此不須要更多的類外數據,假設人類有100個屬性,須要操做10我的,面向過程須要在類外設置1000個變量,使用面向對象在類外只須要設置10我的類實例變量就能夠了
八、並且面向對象是屬性一次綁定就完了,若是使用面向過程,n個方法中都要重複傳參,因爲面向過程沒有new一個對象,就沒有對象的屬性來保存中間狀態,須要在更多的方法中反覆地return結果供類外的變量來保存它。
九、就算有人說面向對象太複雜了,不必用面向對象,但那是寫起來複雜,一旦作爲基礎類被調用起來,那是比調用面向過程的類爽多了。並且在寫人類的時候,面向對象也只是多了成員變量聲明和初始化設置,並無比面向過程的寫法難不少,只是思惟不同。
十、若是是在任何狀況場景下打死也不肯意使用oop的人,那麼能夠用此篇的面向過程思惟來寫java,面向對象最最基本的一點是封裝(繼承和多態是可選的,封裝是必須的),oop是數據和方法的封裝,PersonPOP類徹底沒有對人的屬性有任何封裝,因此不算是面向對象。沒有什麼是隻有面向對象能搞定,面向過程搞不定了的任務。
十一、不論是python java 就算代碼中寫了class關鍵字,不能百分之百的保證是使用了面向對象思惟。反之同樣,在python中使用閉包函數同樣能夠模擬面向對象的封裝的特色,但那樣作有什麼必要,除了更難懂之外,尚未缺乏不少類特有的魔法屬性,尤爲是閉包模擬對象缺乏了繼承的用法。