---------------概念-----------------
談談面向對象的思想
面向對象是一種程式設計思想,在面臨問題時跟面向過程的差別是:面向對象關注使用什麼工具去解決,而面向過程是關注解決問題本身。就好比面向對象是“調用者”,面向過程是執行者。例如:編寫一個生成随機數的函數,面向對象回去調用random方法,而面向過程會去編寫一個生成随機數的方法。
面向對象由三大特性:封裝,繼承,多态;
封裝:
把類的資料聲明為私有的,提供特定的方法去通路,就比如公有方法調用私有屬性;
繼承:
一個類可以去繼承一個類,被繼承的類是父類,另一個類是子類,子類擁有父類的方法,這樣就實作了代碼的複用,避免了重複的代碼,并且可以重寫和覆寫父類的方法。Java隻有單繼承,沒有想C++的多繼承。但是Java中的接口可以多重實作。
多态:
發生在子類繼承父類中,重寫父類的方法可以使同名的方法産生不同的結果,即一個操作産生多種狀态。
重寫的規則:同名方法,不同參數類型、參數個數、參數。。。、重寫方法區分度要夠,不同的傳回值類型不能算是重寫。
1、面向對象的程式設計語言
2、吸收了C++的優點,摒棄了C++難以了解的多繼承、指針等概念,是以Java語言具有功能強大和簡單兩大特性。
3、極好的實作了面向對象理論,使得程式員以優雅的方式進行複雜程式設計。
JDK1.5之後的三大版本
JavaSE(标準版):
允許開發和部署在桌面、伺服器、嵌入式環境和實時環境的Java應用程式。它包含了支援JavaWeb服務開發的類,為JavaEE、JavaMe提供了基礎。
JavaEE(企業版)
幫助開發和部署可移植性、健壯、可伸縮性、安全的服務端應用程式。
JavaME(微型版)
為移動裝置、嵌入式裝置上運作的應用程式提供健壯且靈活的環境。
JDK、JRE、JVM的關系
JDK(Java Development Kit,Java開發工具包)
提供給Java開發人員使用的,包含了Java的開發工具,包含了JRE,是以它是提供了Java的開發環境和運作環境的。
包含了編譯Java源檔案的編譯器,調試和分析工具。
JRE(Java Runtime Environment,Java運作環境)
包含了JVM和Java程式需要的核心類等
JVM(Java Virtual Machine,Java運作虛拟機)
JVM是跨平台的核心,但是JVM本身并不是跨平台的,即不同平台有不同的JVM;不同的平台需要安裝不同的JVM
提供了執行位元組碼(.class)的能力

注意:
如果隻是運作Java程式,隻需要安裝JRE即可。
什麼是跨平台?原理是什麼?
**跨平台:**Java程式經過編譯,一次編譯,就可以在多個系統平台運作。
**原理:**Java程式是通過JVM在系統上運作的,即不同的平台隻要安裝了對應的虛拟機,就可以運作Java程式。
Java語言的特點
1、簡單易學(Java語言的文法與C語言和C++語言很接近)
2、面向對象(封裝,繼承,多态):
Java語言提供類、接口和繼承等原語,為了簡單起見,隻支援類之間的單繼承,但支援接口之間的多繼承,并支援類與接口之間的實作機制(關鍵字為implements)。
3、與平台無關(通過JVM實作了平台無關性)
4、支援網絡程式設計并且很友善(Java本身就是簡化了網絡程式設計)
5、支援多線程(多線程機制使應用程式可以同時運作多個不同的線程,執行不同的任務)
6、健壯性
- Java語言的強類型機制:強類型指的是程式中表達的任何對象所從屬的類型都必須能在編譯時刻确定。它可以通過類型檢查機制在編譯過程中發現許多容易被人忽視的錯誤,進而保證軟體的品質,使得大規模的軟體內建為可能。
-
異常處理:java把c++裡面很多警告變成錯誤 ,這樣設計的原則是為了讓劣質代碼不能寫出來
健壯性程式,1/9是核心代碼 2/9是注釋 **2/3是處理可能的異常。**就好比,某米手機系統經常出Bug,這樣讓人怎麼使用?
健壯性
- 垃圾的自動收集:程式員不用去關注垃圾的回收,隻需專注去寫代碼就可
等等…
6、安全性
7、**Java語言全面支援動态綁定,**而C++語言隻對虛函數使用動态綁定。總之,Java語言是一個純的面向對象程式設計語言。
動态綁定(運作時綁定、後期綁定):
編譯時類型:該對象編譯後在檔案裡的類型,也就是指對象聲明時的類型
運作時類型:程式運作時動态指定的類型,也就是對象定義時的類型
如果編譯時類型與運作時類型不一緻就會發生運作時動态綁定。
//這編譯時類型和運作時類型不一緻,這是就會出現動态綁定;
//重寫的方法在調用時,會動态綁定(即運作時綁定)到具體對象的類型上。
Fruit fruit = new Apple();
fruit.say();
Apple fruit = new Apple();//編譯時類型和運作時類型一緻
fruit.say();
靜态綁定(前期綁定、編譯時綁定):
在程式執行前方法已經被綁定(也就是說在編譯過程中就已經知道這個方法到底是哪個類中的方法),此時由 編譯器或其它連接配接程式實作。例如:C。
針對java簡單的可以了解為程式編譯期的綁定;這裡特别說明一點,java當中的方法隻有final,static,private和構造方法是前期綁定
總結:
有方法調用、變量通路在編譯時都會綁定到一個具體的對象上,但部分重寫的方法在調用時會涉及到動态綁定。
動态綁定
Java的靜态綁定和動态綁定
Java方法重寫與重載、動态綁定和靜态綁定的差別
-------------基本文法---------------
資料類型
Java是強類型語言,每一種資料都定義了明确的資料類型,在記憶體中配置設定了不同的記憶體空間
基本類型:
Java八種基本資料類型(圖文詳解)
引用類型:
編碼
Java語言采用何種編碼方案?有何特點?
Java語言采用Unicode編碼标準,Unicode(标準碼),它為每個字元制訂了一個唯一的數值,是以在任何的語言,平台,程式都可以放心的使用。
通路符
運算符
&&之是以稱為短路運算,是因為如果&&左邊的表達式的值是 false,右邊的表達式會被直接短路掉,不會進行運算。
注意:邏輯或運算符(|)和短路或運算符(||)的差别也是如此。
關鍵字
Java 有沒有 goto
goto 是 Java 中的保留字,在目前版本的 Java 中沒有使用。
final 有什麼用?
屬性上:
該屬性變為常量,不能修改。
對于基本類型是數值不能修改,對于引用類型是引用的指向,但是指向的位址裡的具體資料可修改。
方法上:
該方法不能被重寫,可用于模闆方法、固定我們的算法
類上:
該類不可被繼承
final finally finalize差別
-
final可以修飾類、變量、方法,修飾類表示該類不能被繼承、修飾方法表示該方法不能被重寫、修飾變量表
示該變量是一個常量不能被重新指派。
-
finally一般作用在try-catch代碼塊中,在處理異常的時候,通常我們将一定要執行的代碼方法finally代碼塊
中,表示不管是否出現異常,該代碼塊都會執行,一般用來存放一些關閉資源的代碼。
-
finalize是一個方法,屬于Object類的一個方法,而Object類是所有類的父類,該方法一般由垃圾回收器來調
用,當我們調用System.gc() 方法的時候,由垃圾回收器調用finalize()回收垃圾,一個對象是否可回收的
最後判斷。
this關鍵字的用法
this是自身的一個對象,代表對象本身,可以了解為:指向對象本身的一個指針。
this的用法在java中大體可以分為3種:
- 普通的直接引用,this相當于是指向目前對象本身。
- 形參與成員名字重名,用this來區分
- 引用本類的構造函數
class Person{
private String name;
private int age;
public Person() {
}
public Person(String name) {
this.name = name;
}
public Person(String name, int age) {
this(name);
this.age = age;
}
}
super的用法
super可以了解為是指向自己超(父)類對象的一個指針,而這個超類指的是離自己最近的一個父類。
super也有三種用法:
- 普通的直接引用
- 子類中的成員變量或方法與父類中的成員變量或方法同名時,用super進行區分
- 引用父類構造函數
- super(參數):調用父類中的某一個構造函數(應該為構造函數中的第一條語句)。
- this(參數):調用本類中另一種形式的構造函數(應該為構造函數中的第一條語句)。
this和super的差別
- super()和this()類似,差別是,super()在子類中調用父類的構造方法,this()在本類内調用本類的其它構造方法。
- super()和this()均需放在構造方法内第一行。
- 盡管可以用this調用一個構造器,但卻不能調用兩個。
- this和super不能同時出現在一個構造函數裡面,因為this必然會調用其它的構造函數,其它的構造函數必然也會有super語句的存在,是以在同一個構造函數裡面有相同的語句,就失去了語句的意義,編譯器也不會通過。
- this()和super()都指的是對象,是以,均不可以在static環境中使用。包括:static變量,static方法,static語句塊。
因為this代表的是調用這個函數的對象的引用,而靜态方法是屬于類的,不屬于對象,靜态方法成功加載後,對象還不一定存在
- 從本質上講,this是一個指向本對象的指針, 然而super是一個Java關鍵字。
static
static存在的主要意義
- 建立獨立于具體對象的屬性和方法,即使用類名就可以使用屬性和方法。
- static用于形成靜态代碼以優化程式性能,static代碼可在類中的任意地方。類初次被加載的時候會按照static代碼塊的順序執行每個static代碼,并且隻會執行一次
為什麼說static塊可以用來優化程式性能?
是因為它的特性:隻會在類加載的時候執行一次。是以,很多時候會将一些隻需要進行一次的初始化操作都放在static代碼塊中進行。
static的獨特之處
- 被static修飾的屬性和方法是獨立于該類對象的,不屬于任何一個執行個體對象,而是被類的執行個體對象所共享。
- 類在第一次加載時就回去加載static修飾的部分,隻在類第一次使用時加載并初始化,就是第一次用的時候初始化後面根據需要再指派。
- static變量再類加載的時候就配置設定了空間,之後建立對象時也不會再配置設定空間。指派的話可以任意指派。
- 被static修飾的變量或者方法是優先于對象存在的,也就是說當一個類加載完畢之後,即便沒有建立對象,也可以去通路。
static應用場景
- 修飾成員變量
- 修飾成員方法
- 靜态代碼塊
- 修飾類【隻能修飾内部類也就是靜态内部類】
-
靜态導包
意思是**導入這個類裡的靜态方法。*當然,也可以隻導入某個靜态方法,隻要把 . 換成靜态方法名就行了。然後在這個類中,就可以直接用方法名調用靜态方法,而不必用ClassName.方法名 的方式來調用。
static注意事項
- 靜态隻能通路靜态
- 非靜态能通路靜态和非靜态
-----------面向對象---------------
疑問:
- 隐藏是什麼