簡體   English   中英

在Java中重載私有方法

[英]Overloading a private method in Java

我想直截了當地說:重載是應用於子/超類中的方法,還是只能重載一個類的方法?

public class Super{

     private void method(){
     }
}

class Sub extends Super{

     private void method(){ 
     }
     private void method(int x){    
     }  
}

這兩種方法是否合法超載? 超重的方法也是嗎?

我不知道為什么你把所有的方法都私有化了。 如果你沒有,你的問題實際上是完全合理的。 考慮以下代碼:

class Super{
  void method() {}
}

class Sub extends Super {
  void method(int x) {}  
}

現在,即使它只聲明了一個,類Sub實際上有兩個名為method ,因此該方法為Sub 重載 Super類沒有受到影響,因為它仍然只有一種method

順便說一句,上面阻礙程序正確性的最臭名昭着的例子涉及標准方法equals 初學者很想為特定類型實現它:

public class Thing {
  public boolean equals(Thing that) { ...compare by object contents... }
}

但這不會覆蓋Object.equals ,所以現在該類有兩個equals方法。 最糟糕的事情發生在某些代碼意外使用特定的重載時,而其他代碼則使用通用代碼:

Thing t1 =  new Thing(), t2 = new Thing();
System.out.println(t1.equals(t2)); // true, great
Object o1 = t1, o2 = t2;
System.out.println(o1.equals(o2)); // now suddenly false
System.out.println(t1.equals(o2)); // false again
System.out.println(o1.equals(t2)); // still false

您無法覆蓋私有方法,因為在Super之外,您甚至無法調用該方法。 即使在子類中。 您可以使用相同的名稱定義另一個方法,但是超類仍然具有其方法,並且子類具有其自己的單獨方法。

您需要了解java中的基本重寫規則:

 0).private, static and final method can  not be overridden 

覆蓋方法不能

 1)   reduces access of overriden method i.e.if overridden method declared in parent class is defined with access modifier public than overriding method can not be  package private or protected 
 2).  throw broder checked Exception For example if overridden method throws FileNotFoundException then overriding method can not throw java.lang.IOException

由於您的問題圍繞私有方法,我將嘗試解釋它。

  1. 類中的私有方法

     You are allowed to use same private method name with different signature with in a class. 

請查看以下示例

private void method() {
    System.out.println("method");
}

private void method(int x) {
    System.out.println("method with param x");
}

2. sup / sub類中的私有方法

    There is no question of using private method outside the class as it is not visible.  Means you can't overload a super class private method in sub class. 

讓我們看看JLS的重載方法是什么:

如果一個類的兩個方法(無論是在同一個類中聲明,還是由一個類繼承,或者一個是聲明的,一個是繼承的)都具有相同的名稱,但簽名不是覆蓋等效的,那么方法名稱就是超載。

覆蓋等價是什么意思?

讓我們看看JLS說的是什么:

如果m1是m2的子簽名或m2是m1的子簽名,則兩個方法簽名m1和m2是覆蓋等價的。

方法m1的簽名是方法m2的簽名的子簽名,如果:

m2與m1具有相同的簽名,或者m1的簽名與m2簽名的擦除(§4.6)相同。

現在,讓我們看看上面的例子。

Sub中的2個私有方法被重載。

Super的method()不是Sub繼承的,因為它是私有的。 因此,在Super的方法()和Sub的方法(int x)之間沒有過載。

讓我們看一個在繼承鏈中的類中重載的簡單示例。 Eagle類中,fly()被重載。

public class Bird {
    public void fly() {
        System.out.println("Bird is flying");
    }
    public void eat(int food) {
        System.out.println("Bird is eating "+food+" units of food");
    }
}
public class Eagle extends Bird {
    public int fly(int height) {
        System.out.println("Bird is flying at "+height+" meters");
        return height;
    }
}

公共課超級{

 private void method(){
 }

} class Sub extends Super {

 private void method(){ 
 }
 private void method(int x){    
 }  

}

這兩種方法是否合法超載? 答案是肯定的。

超重的方法也是嗎? 答案是否定的。由於Method在Super類中是私有的,因此在子類中不可見。

重載是否適用於子/超類中的方法,或者只能重載一個類的方法? 答案是肯定的。 超類的所有公共和受保護方法都是在子類中派生的。 您可以重載派生的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM