天天看點

面向對象怎樣了解?

"IT有得聊”是機械工業出版社旗下IT專業資訊和服務平台,緻力于幫助讀者在廣義的IT領域裡,掌握更專業、實用的知識與技能,快速提升職場競争力。 

作者:程式員大大

面向對象(一)

1.什麼是面向對象

1.1語言的分類

  • 第一代語言:機器語言
  • 第二代語言:彙編語言
  • 第三代語言:進階語言

1.2面向對象和面向過程的差別

1:面向過程

針對小問題的時候,面向過程可以很簡單的解決問題,事情複雜的時候面向過程就顯得力不從心。面向過程是微觀上解決問題的方式。

比如:上司出遊,司機開車。

  • 上司找司機開車
  • 司機取車
  • 司機加油
  • 定制出遊路線

這些問題都是面向過程解決的問題。

2:面向對象

面向對象是解決事情的另外一種方式,針對小問題的時候有點大才小用,問題複雜的時候就顯得很輕松。面向對象是宏觀上解決問題的方式。

比如:上司出遊,司機開車。

  • 上司和司機就是兩個對象
  • 上司:出錢,出車,管去哪
  • 司機:開車。

3:差別和聯系

面向對象和面向過程是互相依存的,人們思考問題是用面向對象的思維,最終去實作還是用面向過程。

在編碼的過程中,存在一個需求,我們應先從宏觀上去思考這個需求,再從微觀上去解決問題。

人開門這個需求,人和門都是對象,要實作這個需求隻需要人去調用開門這個功能即可。

1.3對象

1:什麼是對象

女朋友是對象,茶杯是對象,電腦是對象(萬物皆對象)

對象對完提供了很多功能,我們無需一一詳細了解他們是怎麼實作的,我們隻需要學會使用即可。

2:如何産生對象

現實生活中,找對女朋友很重要。

唯一見過的隻有類和方法。唯一可以肯定的就是類一定和對象有關系。

3:類和對象的關系

類:鳥類,人類,魚類

多個事物具有相同的特征,就将其歸為一類。一個類中存在很多事物。這些都是老祖先為了讓我們更好的認識這個世界,将很多具象事物歸為一類。

對象:是一個具象事物。比如:大象,洗衣機,電視。

類中存在許多對象,一個類相當于有相同特征或者行為的對象的集合。

在java語言中類和對象的關系

類:class修飾的 一個類可以産生很多個對象。

對象:基于類的一個執行個體化的表現形式。

類的産生是依賴于對象的,類是将對象中相同特征或者是行為抽取出來歸為一類;

對象的産生是依賴于類的,如果沒有類是無法産生該類的對象的,該類的執行個體。

類是對于對象的抽像(抽取像的部分),對象是類的具象化的表現形式。

2.如何編寫類和對象

2.1如何編寫類

類是為了産生對象的,對象是為了幫我們實作某一具體事務,對象對于使用者而言,能夠列出的有:

  • 外在的屬性:身高,性别,體重,年齡。。。。。。
  • 内在的個方法:吃飯,睡覺,走路。。。。。。
package com.mage.testww;


public class Person {
    String name="zs";
    int age=18;
    char gender='男';
    
    public void eat() {
        System.out.println("開始吃飯了");
    }
    public void sleep() {
        System.out.println("睡覺了");
    }
}      

2.2如何編寫對象

java中通過new關鍵詞來産生目前類的一個具體的執行個體、對象。

package com.mage.testww;


public class PersonTest {
    public static void main(String[] args) {
        Person zs=new Person();
        zs.eat();
        int age=zs.age;
        System.out.println(age);
                
    }
}      
  • 引用類型創造對象是用new關鍵字
  • 建立方式:類型名稱 變量名=new 類型名稱();

2.3new關鍵字的作用

  • 開空間(在堆記憶體中開空間)
  • 賦初值(給目前類中所有成員變量賦初始值)
  • 指向引用(将堆記憶體中的對象位址指派給局部變量)

3.構造器

構造器就是在java代碼中用來産生對象的特殊方法。将該方法稱之為該類的一個構造器。

3.1構造器的注意事項

1.構造器的聲明
  • 構造器的方法名稱和類名相同,首字母一定要大寫
  • 該方法沒有傳回值
  • 内部不需要寫傳回值
2.構造器注意事項
  • 如果在一個類中,沒有寫出任何構造器,那麼一定存在一個空構造器。
  • 一個類中存在帶參構造器,那麼如果無參構造器沒寫,則不存在,如果編寫了,則還有。
  • 構造器也存在重載

3.2 this關鍵詞

this關鍵詞有兩種用法:this.和this()

this.

代表是目前對象的,誰在調用誰就是目前對象

this大多數時候是可以省略的(出現了同名變量的時候,則不可以省略)。

this()
  • this() 用來實作構造器之間的互相調用
  • 其它不同方法中無法使用this(),this()隻能在構造器中使用。
  • this()在構造器中實作構造器的互相調用時必須要保證在構造器的第一行語句。

4.static

static稱為靜态的,共享的。

1.在static中使用非static修飾的

public class StaticTest {
    static int num = 10;
    public static void main(String[] args) {
        System.out.println(num);
    }
}      

不建議使用

public class StaticTest {


    int num = 10;


    public static void main(String[] args) {


        StaticTest t = new StaticTest();


        System.out.println(t.num);


    }


}      

建立目前類的對象,通過對象=方式通路非靜态内容。

在非static中使用static修飾的

public class StaticTest {


    static int num = 10;


    public static void main(String[] args) {


        StaticTest t = new StaticTest();
    
        t.method();


}


    public void method() {


        System.out.println(num);


    }


}      

在一個類中非靜态内容通路靜态内容直接通過變量名或者是方法名稱就可以通路了。

public class Test02 {


    public static void main(String[] args) {


        System.out.println(StaticTest.num);


    }


}      

在其他類中通路靜态内容可以直接通過類名.方法名/變量名直接通路。

靜态内容在其他類中通路時可以通過類名直接 . ,也可以通過對象 . (不推薦使用)

2.static的注意事項

  • static修飾的内容是隸屬于類的,類被加載,靜态内容就被加載到記憶體中了。
  • 非static修飾的内容是隸屬于對象的,對象存在,非static的内容才能被調用。
  • 類資訊是先于對象存在的。建立對象時類一定被加載到記憶體中了,但是如果類被加載到記憶體中,對

    象不一定存在。

5.繼承

5.1繼承

繼承就是子承父業,描述類和類之間的關系,編寫類時,我們發現類和類之間可以存在父子關系的,通過extends來繼承,子類extends父類。

package com.mage.Extends;


public class Animal {
    String name;
    int age;
    
    public Animal() {
        
    }
    
    public void run() {
        System.out.println("我要跑步了");
    }
}




package com.mage.Extends;


public class Dog extends Animal {
    String color;
    
    public Dog() {
        
    }
    
    public void shout() {
        System.out.println(this.color+","+this.name+","+this.age+"汪汪");
    }
}      

java中,一旦發生了繼承關系,子類就會擁有父類的方法和屬性,無需再次去聲明,達到了代碼的複用性。

java中一個類隻有一次繼承機會,如果不能完全确定,最好不要輕易使用。

5.2記憶體分析

  • 建立子類對象時,父類的空構造器被調用。子類要建立對象一定會先建立父類對象。
  • 在記憶體中,要new子類時,會先在記憶體中給父類開辟一個存儲空間。存儲父類的内容。
  • 子類調用父類中定義的屬性時,子類對象中維護了和父類存儲空間的關系(紫色),給父類定義的屬

    性指派時,能夠找到對應的父類對象。

5.3方法的重寫

當子類繼承父類之後,不滿足父類提供的功能,子類對于父類的一些方法可以重寫,對于父類的一些行為進行拓展。

重寫的前提:

  • 一定要發生繼承關系,子類方法和父類方法要同名。
  • 參數清單要一模一樣。
  • 傳回值類型要一模一樣。
public class Person {
    String name;
    int age;
    
    public Person() {
        System.out.println("我是父類構造器");
    }
    
    public int info(int num) {
        System.out.println("姓名:"+this.name+"年齡:"+this.age);
        return 2;
    }
}
public class Student extends Person{
    int id;
    
    public Student() {
        System.out.println("我是子類構造器");
    }
    
    @Override
    public int info(int num) {
        System.out.println("姓名:"+name+"年齡:"+age+"學号"+id);
        return 2;
    }
}
public class Test {
    public static void main(String[] args) {
        Student stu=new Student();
        stu.age=18;
        stu.id=01;
        stu.name="marry";
        stu.info(2);
    }
}      

如何判斷父子關系下的兩個方法是否重寫,在子方法的同名方法前面加一個@Override,不報錯就是發生了重寫。

面向對象怎樣了解?

調用子類對象的功能以及屬性的時候,先在目前本類對象中進行查找,如果找到了則執行,如果沒有找到去父類中進行查找。沿着繼承鍊會一直往上找。

5.4 object

object是根基類,是所有類的父親。java中的類如果沒有明确繼承關系,那麼他的父類都是object。

i.常見方法

  • 擷取到一個對象對應的Class對象(反射章節)
  • 計算目前對象的hash值(一個對象的唯一值) 【集合】
  • 克隆方法,建立對象的一種方式。【克隆模式】
  • 喚醒、喚醒所有、等待。線程通信。【多線程】
  • GC(垃圾回收器)在回收堆記憶體時,自動調用的方法。【GC】

ii.重要方法

toString():
  • 列印對象内容
  • 一般情況下将Object中的toString列印的内容可以看做是:包名.類名@位址值;
  • 對于對象而言,很多時候我們都是想通過toString()方法檢視該對象中存在哪些資訊,而不單單值

    是簡單的看看記憶體位址。是以此時需要在目前類中重寫toString()方法

  • 當直接列印一個對象時,預設情況下就調用的是目前對象的toString方法。如果目前對象沒有

    toString方法,直接執行的是父類的(Object)的toString。

equals():

比較對象是否相等​

  • equals()方法是用來比較兩個對象是否相等
  • equals 方法在使用時一定要注意調用者一定要保證不是null值,否則出現空指針異常。
  • null可以給任意的引用類型指派,但是null都不屬于任意的引用類型。null通過instanceof判定從

    屬時一定為false。

  • 如果一個類中沒有重寫equals方法,那麼使用Object内部定義的equals方法,在Object中的

    equals方法通過 == 比較相等

  • 有時對象需要比較内部的屬性,進而判定是否兩個對象是一緻的。比如對于一個User使用者對象,

    如果它的使用者名和密碼是相同的時候,那麼我們覺得這兩個賬戶資訊是相同的。此時就一定要在當

    前類中重寫equals方法。否則将執行Object的equals方法。

  • instanceof 是用來比較對象是否屬于某個類型的 如果屬于則傳回true 如果不屬于傳回false。
  • Object是所有類的父類,當Object作為形式參數時,所有的子類都可以傳入。
  • java.lang.NullPointerException 空指針異常:對象.方法/屬性時如果對象是null值,則一定會空指

    針。

  • java.lang.ClassCastException 類型轉換異常:在進行引用類型轉換時可能由于類型不一緻導緻轉

    換過程中出現問題。