java方法重寫訪問許可權
1. java方法的重寫
Java中的方法重寫ujiuye
方法的重載: 在同一個類中,出現多個同名的方法,參數列表不同,與返回值類型,修飾符無關
方法的重寫: 子類中出現和父類中一模一樣的方法(包括返回值類型,方法名,參數列表)
方法重寫的注意事項:ujiuye
1.重寫的方法必須要和父類一模一樣(包括返回值類型,方法名,參數列表)
2.重寫的方法可以使用@Override註解來標識
3.子類中重寫的方法的訪問許可權不能低於父類中方法的訪問許可權
許可權修飾符 : private < 默認(什麼都不寫) < protected < public
為什麼要重寫方法:
1.當父類中的方法無法滿足子類需求的時候,需要方法重寫
2.當子類具有特有的功能的時候,就需要方法重寫
重寫的應用
子類可以根據需要,定義特定於自己的行為。既沿襲了父類的功能名稱,又根據子類的需要重新實現父類方法,從而進行擴展增強。
2. JAVA 子類重寫繼承的方法時,可以降低方法的訪問許可權嗎
不可以的,首先,子類繼承父類的訪問修飾符要比父類的更大,也就是更加開放,假如我父類是protected修飾的,其子類只能是protected或者public,絕對不能是friendly(默認的訪問范圍)或者private,當然使用private就不是繼承了。其次,還要注意的是,繼承當中子類拋出的異常必須是父類拋出的異常的子異常,或者子類拋出的異常要比父類拋出的異常要少。
3. JAVA在什麼情況下需要方法重寫
1.單實現一個介面,必須重寫介面中的方法
(如果介面的方法和Object中的方法一樣例外)
2.繼承一個抽象類,必須重寫抽象類中的抽象方法
(如果抽象類中的方法和Object中的方法一樣例外)
3.繼承了一個父類,當父類的方法無法滿足子類需要時,
重寫從父類繼承過來的方法
重寫方法:方法名必須一致,
而且必須保證保證參數類型,參數個數和返回類型一樣
當然返回類型是對象類型時,重寫方法返回類型可以是對象的子類類型
重寫的方法訪問許可權不能更小,不能拋出更大的已檢測異常,可以不拋
(要注意:父類沒有拋已檢測異常,子類就不能拋或者只能拋運行時異常)
這個是我個人總結比較精闢的
4. java 重寫許可權問題 請高手告知原因
您好,提問者:
如果子類的許可權大於父類的許可權,那麼是可以重寫的,前提不能是private。
比如:父類默認不寫,子類重寫public是可以的。
5. java中重寫方法應遵循哪些規則
A、重寫規則之一:
重寫方法不能比被重寫方法限制有更嚴格的訪問級別。
(但是可以更廣泛,比如父類方法是包訪問許可權,子類的重寫方法是public訪問許可權。) B、重寫規則之二:
參數列表必須與被重寫方法的相同。
重寫有個孿生的弟弟叫重載,也就是後面要出場的。如果子類方法的參數與父類對應的方法不同,那麼就是你認錯人了,那是重載,不是重寫。
C、重寫規則之三:
返回類型必須與被重寫方法的返回類型相同。
D、重寫規則之四:
重寫方法不能拋出新的異常或者比被重寫方法聲明的檢查異常更廣的檢查異常。但是可以拋出更少,更有限或者不拋出異常。
E、重寫規則之五:
不能重寫被標識為final的方法。
F、重寫規則之六:
如果一個方法不能被繼承,則不能重寫它。
6. java方法重寫為什麼訪問許可權不能變小
Liskov替換原則,子類對象可以被當成父類對象使用。如果可以降低子類的訪問許可權,那就違反了這一原則了。比如這樣A a = new B(),B繼承了A,重寫父類方法s(),如果在B中變為了私有方法,那麼調用a.s()會發生什麼。
7. java中方法重寫問題
方法覆蓋必須滿足下列條件
(1) 子類的方法的名稱及參數必須和所覆蓋的方法相同
(2) 子類的方法返回類型必須和所覆蓋的方法相同
(3) 子類方法不能縮小所覆蓋方法的訪問許可權
(4) 子類方法不能拋出比所覆蓋方法更多的異常
重載方法必須滿足下列條件
(1) 方法名必須相同
(2) 方法的參數簽名必須相同
(3) 方法的返回類型和方法的修飾符可以不相同
順便說說方法覆蓋和重載的區別
初次見到這兩個單詞並沒有什麼特別的感覺,但是時間長了,卻發現書上一會兒用override,一會兒又用overload,搞得我的迷迷糊。於是就做了個總結,希望能對和我一樣對這兩個概念模糊不清的網友有一個幫助。
override可以翻譯為覆蓋,從字面就可以知道,它是覆蓋了一個方法並且對其重寫,以求達到不同的作用。對我們來說最熟悉的覆蓋就是對介面方法的實現,在介面中一般只是對方法進行了聲明,而我們在實現時,就需要實現介面聲明的所有方法。除了這個典型的用法以外,我們在繼承中也可能會在子類覆蓋父類中的方法。在覆蓋要注意以下的幾點:
1、覆蓋的方法的標志必須要和被覆蓋的方法的標志完全匹配,才能達到覆蓋的效果;
2、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;
3、覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類;
4、被覆蓋的方法不能為private,否則在其子類中只是新定義了一個方法,並沒有對其進行覆蓋。
overload對我們來說可能比較熟悉,可以翻譯為重載,它是指我們可以定義一些名稱相同的方法,通過定義不同的輸入參數來區分這些方法,然後再調用時,VM就會根據不同的參數樣式,來選擇合適的方法執行。在使用重載要注意以下的幾點:
1、在使用重載時只能通過不同的參數樣式。例如,不同的參數類型,不同的參數個數,不同的參數順序(當然,同一方法內的幾個參數類型必須不一樣,例如可以是fun(int,float),但是不能為fun(int,int));
2、不能通過訪問許可權、返回類型、拋出的異常進行重載;
3、方法的異常類型和數目不會對重載造成影響;
4、對於繼承來說,如果某一方法在父類中是訪問許可權是priavte,那麼就不能在子類對其進行重載,如果定義的話,也只是定義了一個新方法,而不會達到重載的效果。
下面是對override和overload的測試程序,其中注釋中的內容都是會產生編譯錯誤的代碼,我們將注釋去掉,看看在編譯時會產生什麼效果。
//對overload測試的文件:OverloadTest.java
publicnewOverrideTest1();
try{
test.fun();
test.fun1();
}catch(Exceptione){}
}
}
{
//以下正常Override
publicvoidfun()throwsTestException2{
System.out.println("funinOverrideTest1");
}
//不能Override父類中的方法,因為它定義了不同的異常類型和
//返回值。
//publicintfun()throwsTestException1{
//System.out.println("methodfuninTest");
//return1;
//}
//不能Override父類中的方法,因為它拋出了比父類中非法范圍
//更大的異常。
//publicvoidfun()throwsException{
//System.out.println("funinOverrideTest1");
//}
//這個方法並沒有Override父類中的fun1方法,因為這個方法在
//父類是private類型,所以這里只是相當於定義了一個新方法。
publicvoidfun1(){
System.out.println("methodfun1inTest");
}
}
{
publicTestException(Stringmsg){
super(msg);
}
}
{
publicTestException1(Stringmsg){
super(msg);
}
}
{
publicTestException2(Stringmsg){
super(msg);
}
}
8. JAVA中方法重載和方法重寫的區別和應用
你好,很高興回答你的問題。
java中方法重載是指在同一個類內,方法名相同,參數列表不同。
而重寫是指子類繼承父類的方法後重新編寫方法內的邏輯。
多態其實就是通過重寫和重載實現的。
各種設計模式也都離不開重新和重載。
如果有幫助到你,請點擊採納。
9. java什麼是方法重寫的語法規則
一、方法的重寫。
1、重寫只能出現在繼承關系之中。當一個類繼承它的父類方法時,都有機會重寫該父類的方法。一個特例是父類的方法被標識為final。重寫的主要優點是能夠定義某個子類型特有的行為。
class Animal {
public void
eat(){
System.out.println ("Animal is eating.");
}
}
class Horse extends Animal{
public void eat(){
System.out.println ("Horse is
eating.");
}
}
2、對於從父類繼承來的抽象方法,要麼在子類用重寫的方式設計該方法,要麼把子類也標識為抽象的。所以抽象方法可以說是必須要被重寫的方法。
3、重寫的意義。
重寫方法可以實現多態,用父類的引用來操縱子類對象,但是在實際運行中對象將運行其自己特有的方法。
public class Test {
public static
void main (String[] args) {
Animal h = new Horse();
h.eat();
}
}
class Animal {
public void eat(){
System.out.println ("Animal is
eating.");
}
}
class Horse extends
Animal{
public void
eat(){
System.out.println ("Horse is eating.");
}
public void
buck(){
}
}
一個原則是:使用了什麼引用,編譯器就會只調用引用類所擁有的方法。如果調用子類特有的方法,如上例的h.buck();
編譯器會抱怨的。也就是說,編譯器只看引用類型,而不是對象類型。
4、重寫方法的規則。
若想實現一個合格重寫方法,而不是重載,那麼必須同時滿足下面的要求!
重寫規則之一:重寫方法不能比被重寫方法限制有更嚴格的訪問級別。
(但是可以更廣泛,比如父類方法是包訪問許可權,子類的重寫方法是public訪問許可權。)
比如:Object類有個toString()方法,開始重寫這個方法的時候我們總容易忘記public修飾符,編譯器當然不會放過任何教訓我們的機會。出錯的原因就是:沒有加任何訪問修飾符的方法具有包訪問許可權,包訪問許可權比public當然要嚴格了,所以編譯器會報錯的。
重寫規則之二:參數列表必須與被重寫方法的相同。
重寫有個孿生的弟弟叫重載,也就是後面要出場的。如果子類方法的參數與父類對應的方法不同,那麼就是你認錯人了,那是重載,不是重寫。
重寫規則之三:返回類型必須與被重寫方法的返回類型相同。
父類方法A:void
eat(){} 子類方法B:int eat(){} 兩者雖然參數相同,可是返回類型不同,所以不是重寫。
父類方法A:int
eat(){} 子類方法B:long eat(){}
返回類型雖然兼容父類,但是不同就是不同,所以不是重寫。
重寫規則之四:重寫方法不能拋出新的異常或者比被重寫方法聲明的檢查異常更廣的檢查異常。但是可以拋出更少,更有限或者不拋出異常。
例:
import java.io.*;
public class Test
{
public static void main (String[]
args) {
Animal h =
new Horse();
try
{
h.eat();
}
catch (Exception e) {
}
}
}
class Animal
{
public void eat() throws
Exception{
System.out.println ("Animal is eating.");
throw new
Exception();
}
}
class Horse extends
Animal{
public void eat() throws
IOException{
System.out.println ("Horse is eating.");
throw new
IOException();
}
}
這個例子中,父類拋出了檢查異常Exception,子類拋出的IOException是Exception的子類,也即是比被重寫的方法拋出了更有限的異常,這是可以的。如果反過來,父類拋出IOException,子類拋出更為寬泛的Exception,那麼不會通過編譯的。
注意:這種限制只是針對檢查異常,至於運行時異常RuntimeException及其子類不再這個限制之中。
重寫規則之五:不能重寫被標識為final的方法。
重寫規則之六:如果一個方法不能被繼承,則不能重寫它。
比較典型的就是父類的private方法。下例會產生一個有趣的現象。
public class Test {
public static
void main (String[] args) {
//Animal h = new Horse();
Horse h = new
Horse();
h.eat();
}
}
class Animal {
private void eat(){
System.out.println ("Animal is
eating.");
}
}
class Horse extends
Animal{
public void
eat(){
System.out.println ("Horse is eating.");
}
}
這段代碼是能通過編譯的。表面上看來違反了第六條規則,但實際上那是一點巧合。Animal類的eat()方法不能被繼承,因此Horse類中的eat()方法是一個全新的方法,不是重寫也不是重載,只是一個只屬於Horse類的全新的方法!這點讓很多人迷惑了,但是也不是那麼難以理解。
main()方法如果是這樣:
Animal h = new Horse();
//Horse h = new
Horse();
h.eat();
編譯器會報錯,為什麼呢?Horse類的eat()方法是public的啊!應該可以調用啊!請牢記,多態只看父類引用的方法,而不看子類對象的方法!
10. Java 為什麼重寫Object的equals方法 訪問許可權要設為public
publicbooleanequals(Objectobj){
return(this==obj);
}
//這是Object類里equals方法的源碼。本身就是public的。
//你要重寫許可權必須大於等於原許可權。