大部分引用自《Thinking in JAVA》(the 4th edtion)java
面向過程與面向對象編程
我要去承德jvm
面向過程:我開車,我開導航,我踩離合,我掛檔,我踩油門,我上五環,我上京承。。。。編程語言
面向對象:我命令車去承德,車怎麼去的不關我事編輯器
Smalltalk語言發明人Alan Kay所總結的面向對象特徵:ide
1萬物皆對象。將對象視爲奇特變量,能夠存儲數據,也能夠要求其在自身上進行操做測試
2程序是對象的集合,經過發送消息來告知彼此該作的。能夠把消息看做是某個對象的方法調用請求。this
3 每一個對象都有本身的由其餘對象所構成的存儲。能夠經過構建一個包含其餘對象的包的形式來建立新對象,好比組合的形式idea
4 每一個對象都擁有其類型。通用的說法是每一個對象(class)都是某個類的實例(instance)spa
5 某一特定類型的全部對象均可以接受一樣的消息。「圓形」類型的對象同時也是「幾何形」類型的對象,因此一個「圓形」類型的對象能夠接收發送給 「幾何形」對象的消息,好比「幾何形」能夠求面積,「圓形」也能夠。這就意味着能夠編寫與「幾何形」交互並自動處理全部與「幾何形」相關類型事物的代碼。(繼承、多態)
一般咱們總結出的java面向對象的特徵:
抽象:
抽象就是找出一些事物的類似和共性之處,而後將這些事物歸爲一個類,這個類只考慮這些事物的類似和共性之處,而且會忽略與當前主題和目標無關的那些方面,將注意力集中在與當前目標有關的方面。例如,看到一隻螞蟻和大象,你可以想象出它們的相同之處,那就是抽象。抽象包括行爲抽象和狀態抽象兩個方面。例如,定義一個Person類,以下:
class Person{
String name;
int age;
doSomething(){
……
}
}
人原本是很複雜的事物,有不少方面,但由於當前系統只須要了解人的姓名和年齡,因此上面定義的類中只包含姓名和年齡這兩個屬性,這就是一種抽像,使用抽象能夠避免考慮一些與目標無關的細節。我對抽象的理解就是不要用顯微鏡去看一個事物的全部方面,這樣涉及的內容就太多了,而是要善於劃分問題的邊界,當前系統須要什麼,就只考慮什麼。
封裝:
封裝是保證軟件部件具備優良的模塊性的基礎,封裝的目標就是要實現軟件部件的「高內聚、低耦合」,防止程序相互依賴性而帶來的變更影響。在面向對象的編程語言中,對象是封裝的最基本單位,面向對象的封裝比傳統語言的封裝更爲清晰、更爲有力。面向對象的封裝就是把描述一個對象的屬性和行爲的代碼封裝在一個「模塊」中,也就是一個類中,屬性用變量定義,行爲用方法進行定義,方法能夠直接訪問同一個對象中的屬性。
例如,人要在黑板上畫圓,這一共涉及三個對象:人、黑板、圓,畫圓的方法要分配給哪一個對象呢?因爲畫圓須要使用到圓心和半徑,圓心和半徑顯然是圓的屬性,若是將它們在類中定義成了私有的成員變量,那麼,畫圓的方法必須分配給圓,它才能訪問到圓心和半徑這兩個屬性,人之後只是調用圓的畫圓方法、表示給圓發給消息而已,畫圓這個方法不該該分配在人這個對象上,這就是面向對象的封裝性,即將對象封裝成一個高度自治和相對封閉的個體,對象狀態(屬性)由這個對象本身的行爲(方法)來讀取和改變。
一般狀況下,只要記住讓變量和訪問這個變量的方法放在一塊兒,將一個類中的成員變量所有定義成私有的,只有這個類本身的方法才能夠訪問到這些成員變量,這就基本上實現對象的封裝,就很容易找出要分配到這個類上的方法了,就基本上算是會面向對象的編程了。把握一個原則:把對同一事物進行操做的方法和相關的方法放在同一個類中,把方法和它操做的數據放在同一個類中。
繼承:是複用類的一種手段,子類繼承父類後,子類能夠直接得到父類的屬性和方法
老鼠的兒子會打洞
多態:子類對象能夠賦值給父類對象,在此父類對象調用方法時依然表現出子類的特徵.
鵝和企鵝都是鳥,他們如何移動?
鵝(天鵝也是鵝):飛,游泳,走路
企鵝:游泳,走路,潛水
這樣的場景,假設你不知道你面前的動物是鵝仍是企鵝,你只知道這是鳥,你攆這隻鳥,若是不是懶到家它確定會移動,它只能去作它能作的事情,即便企鵝是鳥也學不來鵝的飛翔
傳統意義上,JAVA技術體系包括(Sun官方):
l Java程序設計語言
l Java虛擬機
l Class文件格式
l Java Api類庫
l 來自商業機構和第三方社區的Api類庫
JDK(java development kit):Java程序設計語言、Java虛擬機、Java Api類庫
JRE(java runtime environment):Java虛擬機、Java Api類庫中的JavaSE Api類庫
根據業務領域來劃分:
l Java Card
l Java ME
l Java SE
l Java EE
Java的核心運行機制:jvm+GC
並且具備跨平臺性:
Java開發環境搭建
類:
class關鍵字定義,
class Person{
}
屬性
class Person{
int age;
String name;
}
方法(構造方法、成員方法與靜態方法):
class Person{
int age;
String name;
Person(){
age = 30;
name = 「Li Lei」
}
sayHello(){
System.out.println(「Hello! I am」 + name + 「,」 + age + 「year old!」);
}
static staticMethod(){
System.out.println(「staticMethod calling」);
}
}
抽象類、接口
abstract
interface
interface animal{
void eat();
}
封裝一個類 正方形square
class Square{
int edgeLen;
int edgeNum = 4;
Square(){
edgeLen = 10;
}
Square(int edgeLen){
this.edgeLen = edgeLen;
}
int perimeter(){
System.out.println("正方形周長");
return edgeNum*edgeLen;
}
int area(){
System.out.println("正方形面積");
return edgeLen*edgeLen;
}
}
測試下:
public class TestObject(){
public static void main(String[] args){
Square square = new Square(10);
System.out.println(square.perimeter());
System.out.println(square.area());
}
}
繼承
//正多邊形
class RegularPloygon{
int edgeLen;
int edgeNum;
RegularPloygon(int edgeLen, int edgeNum){
this.edgeLen = edgeLen;
this.edgeNum = edgeNum;
}
int perimeter(){
System.out.println("正多邊形周長");
return edgeNum * edgeLen;
}
int area(){
System.out.println("正多邊形面積");
return 0;
}
// void draw(){
// System.out.println("正多邊形繪製");
// }
// void erase(){
// System.out.println("正多邊形擦除");
// }
}
//正三角形,繼承正多邊形
class Triangle extends RegularPloygon{
int high;
//不能繼承父類構造器,但能夠經過super調用
Triangle(int edgeLen){
super(edgeLen, 3);
high = Math.sin( Math.PI/3 )*edgeLen;
}
//重寫父類方法
@Override
int area(){
System.out.println("正三角形面積");
return edgeLen * high / 2;
}
}
測試下:
public class TestExtends(){
public static void main(String[] args){
Triangle triangle = new Triangle(10);
System.out.println(triangle.perimeter());
System.out.println(triangle.area());
// 父類接收子類引用,再調用父類方法會發生什麼?
// RegularPloygon p = new Triangle(10);
// System.out.println(p.perimeter());
// System.out.println(p.area());
}
多態
實際上,java程序中多態最普遍的應用在於接口的調用
接口 幾何形 shape
public interface Shape{
void draw();
void erase();
}
改寫以上幾個類實現shape接口
class Square extends RegularPloygon{
int edgeLen;
int edgeNum = 4;
Square(int edgeLen){
System.out.println("正方形構造器調用");
this.edgeLen = edgeLen;
}
int perimeter(){
System.out.println("正方形周長");
return edgeNum*edgeLen;
}
int area(){
System.out.println("正方形面積");
return edgeLen*edgeLen;
}
void draw(){
System.out.println("正方形繪製");
}
void erase(){
System.out.println("正方形擦除");
}
}
//正多邊形
class RegularPloygon implements Shape{
int edgeLen;
int edgeNum;
RegularPloygon(int edgeLen, int edgeNum){
System.out.println("正多邊形構造器調用");
this.edgeLen = edgeLen;
this.edgeNum = edgeNum;
}
int perimeter(){
System.out.println("正多邊形周長");
return edgeNum * edgeLen;
}
int area(){
System.out.println("正多邊形面積");
return 0;
}
void draw(){
System.out.println("正多邊形繪製");
}
void erase(){
System.out.println("正多邊形擦除");
}
}
class Triangle extends RegularPloygon{
float high;
Triangle(int edgeLen){
super(edgeLen, 3);
System.out.println("正多邊形構造器調用");
high = Math.sin( Math.PI/3 )*edgeLen;
}
//重寫父類方法
@Override
int area(){
System.out.println("正三角形面積");
//四捨五入
return Math.round(edgeLen * high / 2);
}
void draw(){
System.out.println("正三角形繪製");
}
void erase(){
System.out.println("正三角形擦除");
}
}
//添加圓形
class Circle implements Shape{
void draw(){
System.out.println("圓形繪製");
}
void erase(){
System.out.println("圓形擦除");
}
}
測試一下
關於多態的應用,最多見的就是集合類的使用
諸如
List<String> list = new ArrayList<String>();
List<String> list = new LinkedList<String>();
Map<String,Object> XXXXmap = new HashMap<String,Object> ();
Map<String,Object> XXXXmap = new TreeMap<String,Object> ();