日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

面向对象(OOP)

發(fā)布時間:2023/12/8 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面向对象(OOP) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 1. 概念
  • 2. 包
  • 3. 訪問控制
  • 4. 方法(函數(shù))中參數(shù)傳遞的方式
  • 5. 面向對象的特點
  • 6. 構造器特點
  • 7. 繼承
    • 7.1. 繼承設計技巧
  • 8. 多態(tài)
    • 8.2. 重載(Overload)
    • 8.3. 覆蓋(重寫Override)
  • 9. this、super 與 finally關鍵字
  • 10. 對象包裝器與自動裝箱/拆箱

1. 概念

  • 面向對象(Object Oriented Programming)程序由對象組成,每個對象對用戶公開特定功能并隱藏代碼實現(xiàn)的部分,其中很多的對象來自Java標準庫,也存在一部分對象是開發(fā)者自定義,只要當前對象能夠滿足要求,就不必去關心其功能具體是如何實現(xiàn)的。
  • 對象包含數(shù)據(jù)(屬性)函數(shù)(動作)
  • 面向對象將數(shù)據(jù)放在第一位,再去考慮操作數(shù)據(jù)的算法,操作數(shù)據(jù)的過程也就被稱為方法。
  • 對象之間的聯(lián)系通過消息傳遞實現(xiàn),也就是函數(shù)調用。
  • 是構建對象的模板,由類構造對象的過程稱為創(chuàng)建類的實例。創(chuàng)建時使用構造器(構造函數(shù))創(chuàng)建新實例(對象),如果希望構造的對象可以多次使用,那么就會將對象存放在一個變量中,如果聲明為一個對象變量,那么它就可以引用后面構造器所構造的對象。
  • 對象具有唯一性

2. 包

  • Java使用包將類組織在一個集合中,也是確保類名唯一性的主要原因,同名類放置在不同包中就不會產(chǎn)生沖突,為了保證包名的唯一性,一般使用因特網(wǎng)域名的逆序來進行命名。

3. 訪問控制

  • 缺省(default),同一個包中可見
  • private,在本類中可見
  • protected,在子類中可見
  • public,在任何情況都可見

4. 方法(函數(shù))中參數(shù)傳遞的方式

  • 按值調用—接收調用者提供的值
  • 按引用調用—接收調用者提供的地址
    • Java對對象采用按值調用并不是按引用調用,實際上對象的引用就是按值傳遞的。

    5. 面向對象的特點

  • 封裝性(數(shù)據(jù)隱藏)
  • 核心思想,絕不能讓其他類直接訪問實例字段,程序只能通過對象的方法與對象進行數(shù)據(jù)交互。

  • 繼承性
  • 類與類之間的關系,可以基于已存在的類派生新的類,并復用繼承的已存在父類的方法

  • 多態(tài)性
  • 一個對象變量可以指示出多種實際類型的現(xiàn)象,例如一個類中的方法和屬性被繼承后會有不同的數(shù)據(jù)類型或行為

    6. 構造器特點

  • 構造器與類同名
  • 每個類可以有多個構造器
  • 每個構造器可以有0、1或多個參數(shù)
  • 構造器總是伴隨著new操作符一起調用,通過new命令分配空間且無返回值
  • String str = new Test().toString();System.out.println(str);Test test = new Test();//所有Java的對象都存儲在堆中,此時new Test()的值是對所創(chuàng)建對象的一個引用,存儲在對象變量test中System.out.println(test);

    7. 繼承

    • 父類也被稱為超類、基類;子類也被稱為派生類、孩子類。
    • 一般情況下子類比父類擁有的功能會更多,如果在子類中定義了與父類簽名相同的方法,那么這個方法就會覆蓋父類中擁有相同簽名的方法。
    • 子類方法不能低于父類方法的權限。
    • Object類:所有類的父類,Java中每個類都擴展了Object類,包括基本數(shù)據(jù)類型,因為基本數(shù)據(jù)類型都有一個與之對應的類(并且除了Boolean其它六個類還有一個公共的父類Number)稱為包裝器,自然Object類型的變量可以引用所有類的對象 ,當然,Object類引用子類對象只是作為一個泛型容器,要想對子類對象進行相應的操作還是要用強制類型轉換來進行。
    class Animal {String name = "我是動物";void shout() {System.out.println("動物叫!");} }class Dog extends Animal {String name = "我是小狗";void shout() {super.shout();System.out.println("小狗汪汪叫");} }public class test {public static void main(String[] args) {Animal animal = new Dog();System.out.println(animal.name);animal.shout();} }

    7.1. 繼承設計技巧

  • 將公共字段與方法放在父類中
  • 不使用受保護的字段,避免破壞封裝性
  • 除非所有繼承的方法都具有意義,否則不要使用繼承
  • 覆蓋父類方法時不要改變預期的行為
  • package xyz.tylt.test;public class Test {public String name() {System.out.println("哈哈哈");return "我是name方法";}public static void main(String[] args) {Object object = new Test();Test test = (Test) object;System.out.println(test.name());}}

    8. 多態(tài)

    • 對象變量是多態(tài)的,一個父類對象既可以引用一個父類對象,也可以引用子類的對象。

    8.2. 重載(Overload)

    發(fā)生在同一個類中
    這里注意,重載是靜態(tài)的,在這里只是實現(xiàn)多態(tài)的一種方式,它并不屬于多態(tài),也不屬于面向對象

    • 類可能有多個同名的方法,包括構造方法,它們有相同的方法名,但是卻有不同的參數(shù),這時就會根據(jù)函數(shù)參數(shù)傳遞的參數(shù)類型進行匹配,選擇適合的相同參數(shù)類型的方法。因此要完整的描述一個方法就需要展示其相同方法名以及不同的參數(shù)類型,這就叫做方法的簽名。

    • 對于構造方法,僅當當前類中沒有其它有參構造函數(shù)時才會得到一個默認的無參構造器,但是只要有一個有參構造函數(shù),但是卻沒自定義一個無參構造器的話就必須給定有參的初始值。

    8.3. 覆蓋(重寫Override)

    發(fā)生在父子類中

    • 子類繼承父類后對父類方法進行重新編寫。

    靜態(tài)方法為了區(qū)分一般使用類名進行調用,而不是使用與它無直接關系的對象進行調用,雖然也可以,這只是一個建議,常見的例如工廠方法。當然靜態(tài)方法也可以直接進行調用而不需要任何對象,例如main方法。

    9. this、super 與 finally關鍵字

    • this 關鍵字有兩個含義,一是指向當前對象(隱式參數(shù))的引用,二是調用該類的其他構造器。this可以調用本類對象所有的方法與屬性,用來區(qū)分成員變量與局部變量的重名問題。this();指向本類的構造方法,只能寫在構造方法中并且必須是第一句。
    • super 關鍵字也有兩個含義,一是調用超類的方法,二是調用超類的構造器。super可以調用超類對象所有的方法與屬性,super();指向父類的構造方法,只能在子類構造方法的第一條語句出現(xiàn),以便參數(shù)可以傳遞到另一個構造器。
    • final
    • 修飾類后不可被繼承
    • 修飾方法后子類不能再進行覆蓋,但是可以重載
    • 修飾變量后就變?yōu)槌A?#xff0c;不可再更改它的值
    • 局部、匿名內(nèi)部類只能訪問局部final修飾的變量,因為怕外部類銷毀或變動后還要訪問外部變量

    10. 對象包裝器與自動裝箱/拆箱

    拆箱與裝箱是編譯器要做的工作,而不是虛擬機的工作,虛擬機用來執(zhí)行編譯器生成的字節(jié)碼。

    ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(10);arrayList.add(Integer.valueOf(10));if (arrayList.add(10) == arrayList.add(Integer.valueOf(10))) {//兩者等價證明實現(xiàn)了自動裝箱System.out.println("true");} else {System.out.println("false");}System.out.println(arrayList.get(0).intValue());System.out.println(arrayList.get(1));//這里將一個Integer對象賦給一個int值就是自動拆箱int i = arrayList.get(0);System.out.println(i);

    靜態(tài)字段屬于類,并不屬于某個對象,對此類的所有對象進行共享,所以靜態(tài)方法沒有this參數(shù)的方法,也就是說它沒有隱式參數(shù)(方法名前所構造的對象),顯示參數(shù)指方法傳入的形參。

    private static final或構造器定義的方法可以讓編譯器準確的知道是哪一個方法,這樣的行為稱為靜態(tài)綁定,而對象調用的方法虛擬機需要先計算方法表,稱為動態(tài)綁定。
    最好將類中的字段定義為private方法定義為public。

    package com.tylt.tyltdemo.test;import java.time.LocalDate;public class Test {private String name;private String sex;private int age;private LocalDate localDate;public Test(String name, String sex, int age, int year, int month, int day) {this.name = name;this.sex = sex;this.age = age;this.localDate = LocalDate.of(year, month, day);}@Overridepublic String toString() {return "Test{" +"name='" + name + '\'' +", sex='" + sex + '\'' +", age=" + age +", localDate=" + localDate +'}';}public static void main(String[] args) {Test test = new Test("小明", "男", 10, 2000, 01, 01);System.out.println(test.toString() + test.localDate);}}

    總結

    以上是生活随笔為你收集整理的面向对象(OOP)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。