面向對象是相對於面向過程來講的,面向過程是一種以「過程」爲中心的編程思想,分析出解決問題所需的步驟,而後用函數把這些步驟一步步的實現,使用的時候一個個依次調用就好。而面向對象,是一種以「對象」爲中心的編程思想,把問題當作一個個對象,經過對象的屬性和行爲,將問題解決的。面向過程強調的是模塊化,而面向對象強調的是把事物對象化。java
複雜來講面向對象是以「對象」爲基本單元構建系統,對象是把數據和數據操做方法放在一塊兒,做爲一個相互依存的總體。把同類的對象抽象出其共性,造成類。因此說類是對象的抽象,對象是類具體化的體現(類是大範圍的,一個類能夠有多個對象),類中的大多數數據只能經過本類的方法實現,類包含說明和實現,說明部分被外界所看到,經過簡單的外部接口與外界進行聯繫;實現部分不被外界所看到,在內部經過不一樣方法的構建,實現不一樣的功能。對象與對象之間經過消息進行溝通,程序流程由用戶在使用中決定。編程
面向對象用以解決愈來愈複雜的需求,提升了軟件的重用性,靈活性和拓展性。模塊化
static表示「靜態」的意思,能夠用來修飾成員變量和成員方法。 static的主要做用在於建立獨立於具體對象的域變量或者方法 簡單理解: 被static關鍵字修飾的方法或者變量不須要依賴於對象來進行訪問,只要類被加載了,就能夠經過類名去進行訪問, 而且不會由於對象的屢次建立而在內存中創建多份數據。函數
代碼示例:this
package com.vedio.highobject; public class Pool { public static int water=0;//靜態變量 public static void outlet() {//放水 if(water>=2) { water=water-2; }else { water=0; } } public static void inlet() {//進水 water=water+3; } public static void main(String[] args) { System.out.println("水池的水量:"+water); System.out.println("水池注水兩次。"); Pool.inlet(); Pool.inlet(); System.out.println("水池的水量:"+water); System.out.println("水池放水一次。"); Pool.outlet(); System.out.println("水池的水量:"+water); } }
注意:在類中調用靜態方法和靜態方法時,須要使用類名.變量名或類名.方法名調用,在本類中調用靜態方法和靜態方法時,能夠不加類名。spa
只有存在繼承關係,才能使用instanceof關鍵字,不然會報錯code
代碼示例:對象
//只有存在繼承關係,才能使用instanceof關鍵字,不然會報錯 public class Computer {//電腦類 public static void main(String[] args) { Pad ipad=new Pad(); LenovoPad lenovoPad=new LenovoPad(); System.out.println("Pad是否繼承自電腦?"+(ipad instanceof Computer)); System.out.println("LenovoPad是否繼承自Pad?"+(lenovoPad instanceof Pad)); System.out.println("Pad是否繼承自LenovoPad?"+(ipad instanceof LenovoPad)); // System.out.println("Pad是否繼承自人類?"+(ipad instanceof Person));//ipad與Person這個類沒有任何的繼承關係 } } class Pad extends Computer{//平板電腦 } class LenovoPad extends Pad{//聯想平板電腦 } public class Person { public Person(String name){ System.out.println("您好,我叫"+name); } }
ipad和Person兩個類沒有任何繼承關係,因此使用instanceof時,會直接報錯。blog
查看equals()源碼,以下繼承
public boolean equals(Object obj) { return (this == obj); }
因此在object類中equals方法只能用來比較地址是否同樣,與==做用同樣。但當咱們能夠本身重寫equals方法,使之知足咱們的需求。
好比咱們定義一個Person類,只有id和name都同樣時,才肯定他們是同一我的。代碼示例:
package com.vedio.highobject; public class Person { String name; String id; public boolean equals(Person p) { return this.name.equals(p.name)&&this.id.equals(p.id); } }
package com.vedio.highobject; public class Demo1 { public static void main(String[] args) { Person p1=new Person(); Person p2=new Person(); Person p3=new Person(); p1.name="小明"; p1.id="123"; p2.name="小紅"; p2.id="123"; p3.name="小明"; p3.id="123"; System.out.println(p1.equals(p2)); System.out.println(p1.equals(p3)); System.out.println(p2.equals(p3)); } }
能夠觀察到,只有id和name徹底同樣是,才爲true。經過重寫equals方法,知足了咱們的需求。
String可使用equals比較地址是由於它重寫了equals方法
查看String對equals方法的重寫源碼,以下:
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
equals是判斷兩個變量或者實例指向同一個內存空間的值是否是相同,而==是判斷兩個變量或者實例是否是指向同一個內存空間,
舉個通俗的例子來講,==是判斷兩我的是否是住在同一個地址,而equals是判斷同一個地址裏住的人是否是同一個
代碼示例:
package com.vedio.highobject; public class Demo2 { public static void main(String[] args) { String s1=new String("123"); String s2=new String("123"); System.out.println(s1.equals(s2)); System.out.println(s1==s2); String s3="123"; String s4="123"; System.out.println(s3.equals(s4)); System.out.println(s3.equals(s1)); } }
package com.object.high; //全部類的父類 --Object類 //在Java中,全部的類都直接或間接繼承了java.lang.Object類 //因爲全部的類都是Object類的子類,因此任何類均可以重寫Object類中的方法 public class Hello { //重寫toString()方法 public String toString(){ return "Say \""+getClass().getName()+"\" to Java";//getClass().getName()獲取類的名稱 } public static void main(String[] args) { System.out.println(new Hello());//當打印某個類對象時,將自動調用重寫的toString()方法 } }
感謝你看到這裏,文章有什麼不足還請指正,以爲文章對你有幫助的話記得給我點個贊,天天都會分享java相關技術文章或行業資訊,歡迎你們關注和轉發文章!