當前位置:首頁 » 編程軟體 » java重寫在編譯期的問題

java重寫在編譯期的問題

發布時間: 2022-05-14 15:43:26

A. java 方法重寫問題

重寫: 重寫方法必須和被重寫方法具有 相同的 方法名、參數列表、和返回值類型。
必須和父類的參數列表相同為什麼:
上面說的不錯,是為了多態,重寫是多態的必要條件之一,多態說白了就是程序執行前(包括編寫代碼時和編譯.java源文件的時候)你調的是父類被重寫這方法,真正在運行時(程序執行以後),實際當中,動態綁定(在運行期間真正的new出該對象來,對象內部有一個指針,指向該對象重寫的寫個方法),調用的是子類重寫的這個方法。
方法的參數是形參,形參的作用是接收調用該方法時傳過來的實參,形參屬於局部變數,那麼毫無疑問方法內部是要使用這些個參數做一些事情的,重寫要求參數列表必須相同,如果不相同,那麼你調父類被重寫的這個方法,參數列表不同,那實際當中還執行子類這重寫方法,那不矛盾么?內部不混亂了么?參數對不上號,人家重寫方法內部要用這參數怎麼辦啊?

下面這個不太肯定,不過我還是說一下我的看法:
構造方法能不能被繼承,new一個子類對象出來的時候,子類對象裡麵包含著一個父類對象,也就是說,父類對象的所有東西子類對象全部都擁有了,全部都繼承下來了,但是有些東西你是有擁有權,沒有使用權,比方說private的方法,構造方法是new一個對象的時候必然要調用的方法,初始化對象用的,這個方法比較特殊,不像一般的方法一樣,是為了做一件事兒,它就是new對象時候調的方法,我認為構造方法還是繼承下來了,但是你用不了,無法用子類對象的引用去調用構造方法。

B. JAVA重載和重寫在編譯期和運行期的問題

對你的問題比較好奇,所以親測了一下,證實了之前的想法
輸出如下:
g(Super)
Sub.f()
這也是重寫和重載的含義推導的正確結果。
不會出現你說的現象,再確認一下吧。

C. 關於JAVA繼承重寫的問題

這是子類重定義從父類繼承來的成員方法。
如果參數列表相同則覆蓋;否則重載。
你參數列表裡定義的參數類型和你定義的方法返回值類型沒有關系。(至少在你這個方法中是這個樣子的)
再看你的方法,其實你這個double why(int/float)方法並不是繼承父類的方法了,是方法的重載,
因為它的返回值類型不同。你把參數去掉的話報錯是因為你子類的方法和父類的方法重名了,但又不是覆蓋(如果返回值類型一樣就是覆蓋),這樣就導致Java不能唯一識別,所以會報錯。
你要想重定義父類的成員方法就要保證它的返回值類型一樣。否則不是繼承。

如果方法繼承並重載以後,父類的引用還可以調用這個方法嗎?
————————————————當然可以,如果是重載的話就直接調用;如果是覆蓋的話,用super引用。

D. 關於JAVA編譯中的錯誤問題

Java虛擬機(JVM)是可運行Java代碼的假想計算機。只要根據JVM規格描述將解釋器移植到特定的計算機上,就能保證經過編譯的任何Java代碼能夠在該系統上運行。本文首先簡要介紹從Java文件的編譯到最終執行的過程,隨後對JVM規格描述作一說明。

一.Java源文件的編譯、下載、解釋和執行
Java應用程序的開發周期包括編譯、下載、解釋和執行幾個部分。Java編譯程序將Java源程序翻譯為JVM可執行代碼?位元組碼。這一編譯過程同C/C++的編譯有些不同。當C編譯器編譯生成一個對象的代碼時,該代碼是為在某一特定硬體平台運行而產生的。因此,在編譯過程中,編譯程序通過查表將所有對符號的引用轉換為特定的內存偏移量,以保證程序運行。Java編譯器卻不將對變數和方法的引用編譯為數值引用,也不確定程序執行過程中的內存布局,而是將這些符號引用信息保留在位元組碼中,由解釋器在運行過程中創立內存布局,然後再通過查表來確定一個方法所在的地址。這樣就有效的保證了Java的可移植性和安全性。

運行JVM位元組碼的工作是由解釋器來完成的。解釋執行過程分三部進行:代碼的裝入、代碼的校驗和代碼的執行。裝入代碼的工作由"類裝載器"(class loader)完成。類裝載器負責裝入運行一個程序需要的所有代碼,這也包括程序代碼中的類所繼承的類和被其調用的類。當類裝載器裝入一個類時,該類被放在自己的名字空間中。除了通過符號引用自己名字空間以外的類,類之間沒有其他辦法可以影響其他類。在本台計算機上的所有類都在同一地址空間內,而所有從外部引進的類,都有一個自己獨立的名字空間。這使得本地類通過共享相同的名字空間獲得較高的運行效率,同時又保證它們與從外部引進的類不會相互影響。當裝入了運行程序需要的所有類後,解釋器便可確定整個可執行程序的內存布局。解釋器為符號引用同特定的地址空間建立對應關系及查詢表。通過在這一階段確定代碼的內存布局,Java很好地解決了由超類改變而使子類崩潰的問題,同時也防止了代碼對地址的非法訪問

隨後,被裝入的代碼由位元組碼校驗器進行檢查。校驗器可發現操作數棧溢出,非法數據類型轉化等多種錯誤。通過校驗後,代碼便開始執行了。

Java位元組碼的執行有兩種方式:
1.即時編譯方式:解釋器先將位元組碼編譯成機器碼,然後再執行該機器碼。
2.解釋執行方式:解釋器通過每次解釋並執行一小段代碼來完成Java位元組碼程 序的所有操作。
通常採用的是第二種方法。由於JVM規格描述具有足夠的靈活性,這使得將位元組碼翻譯為機器代碼的工作

具有較高的效率。對於那些對運行速度要求較高的應用程序,解釋器可將Java位元組碼即時編譯為機器碼,從而很好地保證了Java代碼的可移植性和高性能。

二.JVM規格描述
JVM的設計目標是提供一個基於抽象規格描述的計算機模型,為解釋程序開發人員提很好的靈活性,同時也確保Java代碼可在符合該規范的任何系統上運行。JVM對其實現的某些方面給出了具體的定義,特別是對Java可執行代碼,即位元組碼(Bytecode)的格式給出了明確的規格。這一規格包括操作碼和操作數的語法和數值、標識符的數值表示方式、以及Java類文件中的Java對象、常量緩沖池在JVM的存儲映象。這些定義為JVM解釋器開發人員提供了所需的信息和開發環境。Java的設計者希望給開發人員以隨心所欲使用Java的自由。

JVM定義了控制Java代碼解釋執行和具體實現的五種規格,它們是:
JVM指令系統
JVM寄存器
JVM棧結構
JVM碎片回收堆
JVM存儲區

2.1JVM指令系統

JVM指令系統同其他計算機的指令系統極其相似。Java指令也是由 操作碼和操作數兩部分組成。操作碼為8位二進制數,操作數進緊隨在操作碼的後面,其長度根據需要而不同。操作碼用於指定一條指令操作的性質(在這里我們採用匯編符號的形式進行說明),如iload表示從存儲器中裝入一個整數,anewarray表示為一個新數組分配空間,iand表示兩個整數的"與",ret用於流程式控制制,表示從對某一方法的調用中返回。當長度大於8位時,操作數被分為兩個以上位元組存放。JVM採用了"big endian"的編碼方式來處理這種情況,即高位bits存放在低位元組中。這同 Motorola及其他的RISC CPU採用的編碼方式是一致的,而與Intel採用的"little endian "的編碼方式即低位bits存放在低位位元組的方法不同。

Java指令系統是以Java語言的實現為目的設計的,其中包含了用於調用方法和監視多先程系統的指令。Java的8位操作碼的長度使得JVM最多有256種指令,目前已使用了160多種操作碼。

2.2JVM指令系統

所有的CPU均包含用於保存系統狀態和處理器所需信息的寄存器組。如果虛擬機定義較多的寄存器,便可以從中得到更多的信息而不必對棧或內存進行訪問,這有利於提高運行速度。然而,如果虛擬機中的寄存器比實際CPU的寄存器多,在實現虛擬機時就會佔用處理器大量的時間來用常規存儲器模擬寄存器,這反而會降低虛擬機的效率。針對這種情況,JVM只設置了4個最為常用的寄存器。它們是:
pc程序計數器
optop操作數棧頂指針
frame當前執行環境指針
vars指向當前執行環境中第一個局部變數的指針
所有寄存器均為32位。pc用於記錄程序的執行。optop,frame和vars用於記錄指向Java棧區的指針。

2.3JVM棧結構

作為基於棧結構的計算機,Java棧是JVM存儲信息的主要方法。當JVM得到一個Java位元組碼應用程序後,便為該代碼中一個類的每一個方法創建一個棧框架,以保存該方法的狀態信息。每個棧框架包括以下三類信息:
局部變數
執行環境
操作數棧

局部變數用於存儲一個類的方法中所用到的局部變數。vars寄存器指向該變數表中的第一個局部變數。
執行環境用於保存解釋器對Java位元組碼進行解釋過程中所需的信息。它們是:上次調用的方法、局部變數指針和操作數棧的棧頂和棧底指針。執行環境是一個執行一個方法的控制中心。例如:如果解釋器要執行iadd(整數加法),首先要從frame寄存器中找到當前執行環境,而後便從執行環境中找到操作數棧,從棧頂彈出兩個整數進行加法運算,最後將結果壓入棧頂。
操作數棧用於存儲運算所需操作數及運算的結果。

2.4JVM碎片回收堆

Java類的實例所需的存儲空間是在堆上分配的。解釋器具體承擔為類實例分配空間的工作。解釋器在為一個實例分配完存儲空間後,便開始記錄對該實例所佔用的內存區域的使用。一旦對象使用完畢,便將其回收到堆中。
在Java語言中,除了new語句外沒有其他方法為一對象申請和釋放內存。對內存進行釋放和回收的工作是由Java運行系統承擔的。這允許Java運行系統的設計者自己決定碎片回收的方法。在SUN公司開發的Java解釋器和Hot Java環境中,碎片回收用後台線程的方式來執行。這不但為運行系統提供了良好的性能,而且使程序設計人員擺脫了自己控制內存使用的風險。

2.5JVM存儲區

JVM有兩類存儲區:常量緩沖池和方法區。常量緩沖池用於存儲類名稱、方法和欄位名稱以及串常量。方法區則用於存儲Java方法的位元組碼。對於這兩種存儲區域具體實現方式在JVM規格中沒有明確規定。這使得Java應用程序的存儲布局必須在運行過程中確定,依賴於具體平台的實現方式。

JVM是為Java位元組碼定義的一種獨立於具體平台的規格描述,是Java平台獨立性的基礎。目前的JVM還存在一些限制和不足,有待於進一步的完善,但無論如何,JVM的思想是成功的。

對比分析:如果把Java原程序想像成我們的C++原程序,Java原程序編譯後生成的位元組碼就相當於C++原程序編譯後的80x86的機器碼(二進製程序文件),JVM虛擬機相當於80x86計算機系統,Java解釋器相當於80x86CPU。在80x86CPU上運行的是機器碼,在Java解釋器上運行的是Java位元組碼。

Java解釋器相當於運行Java位元組碼的「CPU」,但該「CPU」不是通過硬體實現的,而是用軟體實現的。Java解釋器實際上就是特定的平台下的一個應用程序。只要實現了特定平台下的解釋器程序,Java位元組碼就能通過解釋器程序在該平台下運行,這是Java跨平台的根本。當前,並不是在所有的平台下都有相應Java解釋器程序,這也是Java並不能在所有的平台下都能運行的原因,它只能在已實現了Java解釋器程序的平台下運行。

E. 如何解決java編譯時編碼問題造成的錯誤

Java源碼文件這些文件可以是任意字元編碼的,在Java的Class文件里存儲的字元串是UTF-8編碼的,所以如果在代碼中有中文字元的話,就會導致亂碼。當然,這只是眾多原因中的一種,所以把編碼設置統一是避免出現亂碼的解決辦法。

工具:

eclipse

方法如下:

  1. 點擊window--Preferences

    附:也可以選擇Other,從Other中選擇程序需要的編碼格式。

F. Java編程中 重寫和重載 分別是什麼詳細告訴我好嗎

Java的重寫和重載是兩種在Java中經常提到的兩組概念,它們在各個方面都有著很大的不同,下面詳細介紹你要了解的區別。

Java的多態機制

即重寫,重寫主要用於子類和父類之間,在父類中定義了一個方法,同時在子類中對這個方法進行重寫,實現子類行為的特殊化,例如:
class Animal{

void eat(){ System.out.print("animal eat");}

}

class Tiger extends Animal{

void eat(){System.out.print("Tiget eat");}

}

子類中的eat方法即對父類的eat方法實現了重寫,重寫最常見的例子就是下面的聲明:

Animal some=new Tiger();

關於重寫,遵循以下的規則:

(1)重寫方法必須和被重寫方法具有相同的參數列表,返回類型必須和被重寫方法的返回類型相同或者是返回類型的子類型。

(2)重寫方法的訪問控制修飾符不能比被重寫方法更嚴格(比如一個在父類中聲明為public的方法重寫成一個protected的方法)。

(3)只有實例方法才能被重寫,超類中的final方法不能被重寫。

(4)重寫方法不能拋出新的檢查異常,或者是拋出比被重寫方法聲明的檢查異常更廣泛的檢查異常。

(5)注意一種特殊情況:如果超類的方法版本中聲明了檢查異常,但重寫的子類方法中沒有聲明,這時如果使用多態的方式進行調用,那麼編譯器認為你調用的是聲明了異常的方法。

(6)盡管多態是在編譯時確定對象的類型,但在編譯時,還是根據父類的方法聲明進行程序檢查。因此,如果子類中定義的方法,在父類中沒有定義,則會出項編譯錯誤。

Java的重載機制:
重載的實質:在一個類中使用簽名相同的多個方法。

按照范圍,可以將重載分為在一個類中重載,和在子類和父類中重載。現分別解釋如下:

1.在一個類中定義多個具有相同簽名的方法,這些方法必須具有不同的參數列表,比如一個類的構造函數。

2.在父類和子類中,子類由於繼承而擁有了父類的某些方法,此時在子類再定義具有相同簽名的方法(必須具有不同的參數列表),這個地方很容易和重寫相混淆,因此千萬注意。

重載的規則主要記住亮點:
一是方法的參數列表必須改變,包括參數的類型,參數的個數多少,參數順序。

二是重載對返回類型,訪問修飾符,異常聲明沒有任何限制,可以作任意的修改。實質上,重載只是創建了一個方法而已,特殊的地方在於方法的名字。

注意下面的一種情況:(重寫和重載的混合)

class UseAnimal{

void doStuff(Animal sa){}

void doStuff(Tiger sa){}

public static void main(String[] args){

UseAnimal ua=new UseAnimal();

Animal an=new Tiger();

ua.Stuff(an);

}

}

此時,調用的方法doStuff的Animal版本,因為調用重載方法是在編譯時決定的,an的聲明類型是Animal。所以調用Animal版本。

始終注意一點:重載的判斷始終是在編譯時決定。

G. 一java程序在編譯時遇到這樣的問題怎麼辦

可能是你的文件名和類名不一致,也可能是環境變數沒有設置好,重新設置下。滑鼠右擊「我的電腦」->屬性->高級->環境變數 ,把JDK,JRE的安裝路徑加到path中,重起電腦試試。

H. 關於JAVA多態的編譯時類型與執行時類型的一個問題.

多態的對象,在編譯器為sub分配內存空間的時候執行的父類的屬性,
運行期,也就是調用方法的時候,指定是子類的行為

這是因為,對象的屬性是在聲明時指定,方法數據對象的行為

I. java編程重寫方法的問題

首先是從Object父類繼承來的equals方法,然後你28行又寫了一個參數類型是CircleTest1的equals方法,這屬於方法的重載,也就是說此時CircleTest1類里有兩個重載的equals方法,而你18行傳入的是Object類型,所以調用的是從父類Object繼承而來的的equals方法,所以首先編譯沒問題,其次Object類里的equals方法寫的是this == obj,而你18行比較的是兩個不同對象,所以是false,21行調用的是子類重寫的父類equals方法,執行的是子類重寫的方法體,比較的是radius變數值,默認都是0,所以相等

J. java重寫

重寫:除了方法體裡面的代碼,其他的部分都要和父類中的一樣(訪問許可權要比父類中定義的訪問許可權寬松,如父類中定義為public,那子類重寫的方法也必須是public,不能是protected或者private)。
樓上說法不準確:重載方法區別在於參數個數和參數類型,不在於返回值。也就是,重載方法的返回值可以不一樣,而重寫方法的返回值必須一樣。
給你總結區分一下:重寫方法出現在子類中,只有在發生繼承關系的前提下,在能出現重寫方法,而且重寫的是父類的方法。而重載方法出現在同一個類中,和繼承沒有關系,重載的是類自己的方法。

熱點內容
app什麼情況下找不到伺服器 發布:2025-05-12 15:46:25 瀏覽:713
php跳過if 發布:2025-05-12 15:34:29 瀏覽:466
不定時演算法 發布:2025-05-12 15:30:16 瀏覽:129
c語言延時1ms程序 發布:2025-05-12 15:01:30 瀏覽:163
動物園靈長類動物配置什麼植物 發布:2025-05-12 14:49:59 瀏覽:732
wifi密碼設置什麼好 發布:2025-05-12 14:49:17 瀏覽:147
三位數乘兩位數速演算法 發布:2025-05-12 13:05:48 瀏覽:396
暴風影音緩存在哪裡 發布:2025-05-12 12:42:03 瀏覽:539
access資料庫exe 發布:2025-05-12 12:39:04 瀏覽:627
五開的配置是什麼 發布:2025-05-12 12:36:37 瀏覽:363