- 子類在實例化的時候都會調用父類的構造方法
class Outer{ //父類
public Outer(){
System.out.println("父類的構造方法");
}
}
class Inner extends Outer{
public Inner(){
//super(); //子類會自動調用父類的構造方法
System.out.println("子類的構造方法");
}
}
class ListSetMap {
public static void main(String[] args) {
new Inner();
}
}
父類的構造方法
子類的構造方法
- 子類覆寫的方法的訪問權限不能比父類的嚴格
class Outer{
public Outer(){
System.out.println("父類的構造方法");
}
public void fun(){
}
}
class Inner extends Outer{
public Inner(){
super();
System.out.println("子類的構造方法");
}
default void fun(){ //此處縮小了權限
}
}
class ListSetMap {
public static void main(String[] args) {
new Inner();
}
}
結果報錯
---------- 編譯javac ----------
ListSetMap.java:13: 錯誤: 此處不允許使用修飾符default
default void fun(){
^
1 個錯誤
所以子類覆寫的方法不能小於父類的權限
- 父類爲 private的方法由子類用 default的方法不叫覆寫
class Outer{
private void fun(){ //private權限
System.out.println("父類");
}
public void list(){ //調用方法來訪問fun()
this.fun();
}
}
class Inner extends Outer{
public void fun(){ //子類擴大權限
System.out.println("子類");
}
}
class ListSetMap {
public static void main(String[] args) {
new Inner().list();
}
}
輸出的結果
父類
也就是說此時子類並沒有覆寫父類的fun方法
這類似於屬性的覆蓋
class Outer{
public String name="我";
}
class Inner extends Outer{
public String name="你";
public void fun(){
System.out.println(super.name);
System.out.println(this.name);
}
}
class ListSetMap {
public static void main(String[] args) {
new Inner().fun();
}
}
輸出結果
我
//父類的name
你
- 父類的屬性可以被子類的同名屬性覆蓋——屬性的覆蓋
然而父類的屬性並沒有被子類重新定義的屬性說覆蓋,也就跟上面所說的方法一樣。