1. 程式人生 > >【第五次JAVA課,java語法基礎】課件總結

【第五次JAVA課,java語法基礎】課件總結

變量初始化 bubuko 方法簽名 錯誤 會有 編譯器 例如 初始 oid

思索

  技術分享圖片

  構造函數是對類的成員變量進行初始化,子類擁有父類的可繼承的成員變量,若要用到父類的成員變量,就必須對其初始化,所以在子類構造函數運行前要調用父類構造函數對父類成員變量初始化。

  絕對不能反過來。因為特性是優先子類的特性,若調用玩父類構造函數後在調用子類構造函數,會有可能導致子類特性被覆蓋,從而產生錯誤。

“類型轉換”

class Mammal{}
class Dog extends Mammal {}
class Cat extends Mammal{}

public class TestCast
{
    public
static void main(String args[]) { Mammal m; Dog d=new Dog(); Cat c=new Cat(); m=d; //d=m; d=(Dog)m; //d=c; //c=(Cat)m; } }

  在使用繼承的過程中,不可避免的會遇到需要通過子類來調用父類方法的情況,所以為了解決父類子類擁有相同方法導致前者方法無法被調用的情況,java就必須擁有多態的特性——可以讓一個父類變量引用一個子類對象,而編譯器會由引用的對象類型來判斷如何編譯。但這沒解決如何使一個子類對象調用父類方法,所以可以用強制類型轉換類解決,把一個子類的類型暫時當做父類來處理。

  可以使用instanceof運算符判斷一個對象是否可以轉換為指定的類型。

在實踐中理解把握復雜的知識

public class ParentChildTest {
    public static void main(String[] args) {
        Parent parent=new Parent();
        parent.printValue();
        Child child=new Child();
        child.printValue();
        
        parent=child;
        parent.printValue();
        
        parent.myValue
++; parent.printValue(); ((Child)parent).myValue++; parent.printValue(); } } class Parent{ public int myValue=100; public void printValue() { System.out.println("Parent.printValue(),myValue="+myValue); } } class Child extends Parent{ public int myValue=200; public void printValue() { System.out.println("Child.printValue(),myValue="+myValue); } }

  上面代碼運行結果為:

Parent.printValue(),myValue=100
Child.printValue(),myValue=200
Child.printValue(),myValue=200
Child.printValue(),myValue=200
Child.printValue(),myValue=201

  前面兩個可以理解,後面就不太一樣了。第三個是父類的引用裝子類的對象拿前朝的劍斬本朝的官,本朝的當然不會讓你斬啊,但編譯器還是調用子類方法。第四個有點難,如果調試時查看父類的myValue,可以看到這個myValue是101(加了1),但由於方法調用的是子類的方法所以輸出仍然為200且隱形參數為Child,成員變量使用父類變量,方法調用卻是子類方法,很奇怪,所以第五個是用強制轉換的方式,這樣變量也是子類的變量了。關於這種奇怪的現象會在“多態”裏總結。

“多態”

  不想多說,直接總結:

一、使用父類類型的引用指向子類的對象;
二、該引用只能調用父類中定義的方法和變量;
三、如果子類中重寫了父類中的一個方法,那麽在調用這個方法的時候,將會調用子類中的這個方法;(動態連接、動態調用)
四、變量不能被重寫(覆蓋),”重寫“的概念只針對方法,如果在子類中”重寫“了父類中的變量,那麽在編譯時會報錯。

  這樣多態是通過父類和繼承父類並覆蓋父類中同一方法的幾個不同子類、接口和實現接口並覆蓋接口中同一方法的幾不同的類體現的。通過超類對象引用變量引用子類對象但對消息的反應是子類的方式來實現多態。

  java為了實現多態性采用了後綁定(動態綁定)的形式。

程序綁定的概念:
綁定指的是一個方法的調用與方法所在的類(方法主體)關聯起來。對java來說,綁定分為靜態綁定和動態綁定;或者叫做前期綁定和後期綁定

靜態綁定:
在程序執行前方法已經被綁定,此時由編譯器或其它連接程序實現。例如:C。
針對java簡單的可以理解為程序編譯期的綁定;這裏特別說明一點,java當中的方法只有final,static,private和構造方法是前期綁定

動態綁定:
後期綁定:在運行時根據具體對象的類型進行綁定。
若一種語言實現了後期綁定,同時必須提供一些機制,可在運行期間判斷對象的類型,並分別調用適當的方法。也就是說,編譯器此時依然不知道對象的類型,但方法調用機制能自己去調查,找到正確的方法主體。不同的語言對後期綁定的實現方法是有所區別的。但我們至少可以這樣認為:它們都要在對象中安插某些特殊類型的信息。

動態綁定的過程:
虛擬機提取對象的實際類型的方法表;
虛擬機搜索方法簽名;
調用方法。

——https://www.xuebuyuan.com/2965081.html

  在java中,幾乎所有的方法都是後期綁定的,在運行時動態綁定方法屬於子類還是基類。但是也有特殊,針對static方法和final方法由於不能被繼承,因此在編譯時就可以確定他們的值,他們是屬於前期綁定的。特別說明的一點是,private聲明的方法和成員變量不能被子類繼承,所有的private方法都被隱式的指定為final的(由此我們也可以知道:將方法聲明為final類型的一是為了防止方法被覆蓋,二是為了有效的關閉java中的動態綁定)。java中的後期綁定是有JVM來實現的,我們不用去顯式的聲明它,而C++則不同,必須明確的聲明某個方法具備後期綁定。

【第五次JAVA課,java語法基礎】課件總結