天天看點

JAVA特性-跨平台/面向對象

JAVA特點概述

一,跨平台

這無疑是java最大的特點了,我相信大多數人第一次聽說java語言大都從跨平台開開始的。實際上java跨平台特性主要展現在兩個方面:編碼和運作機制。

1,編碼

java語言相比較其他語言很特殊一點就是在java中基本類型char占兩個位元組(16位),即在java中一個漢字就是一個char,如圖:

這是由于jvm内部統一使用unicode編碼,unicode本就是一種統一的字元集編碼格式,其為每種語言中的每個字元設定了統一并且唯一的二進制編碼,以滿足跨語言、跨平台進行文本轉換、處理的要求。

2,JVM

我們知道java并不是直接運作在作業系統中的,而是運作在java虛拟機(jvm)中,也就是說jvm是java代碼和作業系統之間的過渡。

編譯在c語言中,是指把c語言代碼分析解釋為二進制的機器指令,而java中的編譯隻是把.java檔案解釋成了.class檔案,并沒有變成機器指令,而.class檔案要變成什麼樣的機器指令要由具體的jvm來決定。

我感覺jvm就像是一個擴充卡,在java代碼和作業系統之間連接配接

二,面向對象

現在談及進階語言,哪有不是面向對象的,java當然也不例外,當然也具有面向對象的基本特點——封裝、繼承、多态。我最開始接觸面向對象的思想是在C++程式設計的課堂上,是以,我會把java和C++中的面向對象做對照。

1,封裝

什麼是封裝:封裝就是把資料和對資料的操作封裝在一起,資料被保護在内部,程式的其他部分隻有通過被授權的操作,才能對資料進行操作。

封裝的表現:每一個類都是對某一類事物的屬性和方法的抽象,都是一個封裝;類中的每一個方法都是對一種操作的抽象,是以每一個方法也是一種封裝。

授權——通路控制修飾符:前面說程式其他部分要經過授權才能對資料進行操作,要實作對不同情況的授權,java中有四種通路控制修飾符,如下圖:

2,繼承

什麼是繼承:在現實生活中,我們知道,兒子可以繼承父親的樣貌,可以和父親長的很像,也可以長得有點像母親,還可以有點自己的特點,這其實就是繼承。兒子繼承父母的相貌,在程式中就是子類繼承父類的屬性和方法。

java中繼承的特點:

1,隻支援單繼承,即一個子類隻能繼承一個父類,這點和C++不同,C++可以多繼承

2,子類可以擁有父類的屬性和方法

3,子類可以擁有自己的屬性和方法

4,子類可以重寫覆寫父類的屬性和方法

5,父類裝載子類,即new的是子類,但引用确是父類,這也叫子類到父類的自動轉型,如下:

Parent p=new Child();

這種情況下,p調用的方法看上去是父類方法,但運作的是子類Child的方法。

這種情況也是可以強制轉型的,如代碼:

Child c=(Child)p

注意:強制轉型永遠隻能向上轉,比如這裡new的是Child,你可以将其轉換為Parent或Child,但不能轉為Grandson,編譯不會報錯但會引起運作時異常:java.lang.ClassCastException

繼承的優點

1,提高代碼複用性,表現為子類和父類相同的方法不用在寫一遍

2,是程式設計更符合人類正常思維方式,利于程式開發

java繼承補充知識點

1,繼承的類加載:父靜态代碼塊-子靜态代碼塊-父構造代碼塊-父構造方法-子構造代碼塊-子構造方法。其中靜态代碼塊在多個執行個體化對象時隻執行一次,而普通代碼塊則每次在構造方法前執行。父類除構造方法外的方法都會被子類覆寫。

2,子類覆寫父類的方法遵循的是“兩同兩小一大”原則。兩同指的是方法名和形參清單相同。兩小指的是子類方法的傳回值類型要小于或等于父類被覆寫方法的傳回值,子類方法聲明抛出的異常應比父類方法抛出的異常要小或相等。一大指的是子類方法的通路權限應該比父類方法要大或相等。

3,靜态方法(static)可以被子類繼承,但是不能被子類重寫(覆寫),方法相同時子類會将父類的該方法隐藏。

3,多态

多态的定義一句話概括起來就是:指允許不同類的對象對同一消息做出響應。即同一消息可以根據發送對象的不同而采用多種不同的行為方式。(發送消息就是函數調用)

多态存在的三個必要條件:要有繼承;要有重寫;父類引用指向子類對象。

看到這三個條件是不是和熟悉,這不就是前面講繼承時的一些特點嗎,還有我特别強調的轉型問題,其實這就是多态實作的基礎。

多态的好處:

1,可擴充性:增加新的子類不會影響已存在類的多态性、繼承性,以及其他特性的運作和操作。增加子類隻會擴充系統功能。

2,接口性:父類通過方法簽名向子類提供共同接口,由子類來完善或覆寫。

instanceof運算符

多态機制導緻同一類型的引用變量調用同一方法也可能導緻運作結果不同,如例子:

public class Animal {
    void bark() {
        System.out.println("動物在叫");
    }
    public static void main(String[] args) {    
        Animal a=new Dog();
        Animal aa=new Cat();
        a.bark();
        aa.bark();
    }
}    
public class Dog extends Animal{
    void bark() {
        System.out.println("狗叫");
    }
}
public class Cat extends Animal{
    void bark() {
        System.out.println("貓叫");
    }
}
//運作結果
/*
狗叫
貓叫
*/
           

是以在做強制類型轉換時使用instanceod判斷對象實際類型,以避免不可預料的結果。

抽象類和接口差別

1,抽象類的目的是簡化程式設計,增加代碼複用;接口是對下層程式設計者的限制,是一種規範。

2,很多情況下可以先有子類在抽象出共同的抽象類;而一幫情況下會先有接口,再有實作接口的子類。

3,其他異同如下圖: