上書き
サブクラスが属性またはメソッドを定義するとき、定義された属性またはメソッドが親クラスと同じ名前を持つことがあります。このような操作は上書きと呼ばれます。
メソッドのオーバーライド
サブクラスが、親クラスとまったく同じメソッド名、戻り値の型、パラメーターの型、およびメソッドの数を定義する場合、メソッドオーバーライドと呼ばれます。
class A1{
public void fun(){ //在父类定义的方法
System.out.println("A类中的fun()方法");
}
}
class B1 extends A1{ //定义子类,此时没有覆写任何方法
public void fun(){ //此处为覆写
System.out.println("B类中的fun()方法");
}
}
class C1 extends A1{
public void fun(){ //此处为覆写
System.out.println("C类中的fun()方法");
}
}
public class Test1_1_3_5 {
public static void main(String args[]){
B1 b=new B1(); //实例化子类对象
b.fun(); //调用fun()方法,此时方法被覆写,所以调用被覆写过的方法
C1 c=new C1();
c.fun();
}
}
//结果:
//B类中的fun()方法
//C类中的fun()方法
原則:サブクラスがオブジェクトを上書きし、サブクラスオブジェクトをインスタンス化する場合、オーバーライドされたメソッドを呼び出す必要があります。
上書きのプロセスでは、権限も考慮する必要があります。つまり、サブクラスによって上書きされたメソッドは、親クラスよりも厳しいアクセス権限を持つことはできません。
例:
class A2{
public void fun(){
this.print(); //调用print()方法
}
private void print(){ //此处为private权限,无法覆写
System.out.println("666");
}
}
class B2 extends A2{
public void print(){ //不能覆写print()方法
System.out.println("2333");
}
}
public class Test1_1_3_6 {
public static void main(String args[]){
B2 b=new B2(); //实例化子类对象
b.fun(); //调用父类继承来的fun()方法
}
}
//结果:
//666
親クラスでオーバーライドされたメソッドを明示的に呼び出すことができるようにするには、super。メソッド()を使用してアクセスできます。
super。メソッド()を使用して、親クラスのメソッドにアクセスします。
class A2{
public void print(){
System.out.println("666");
}
}
class B2 extends A2{
public void print(){ //覆写的是print()方法
super.print(); //访问父类中的print()方法
System.out.println("2333");
}
}
public class Test1_1_3_6 {
public static void main(String args[]){
B2 b=new B2(); //实例化子类对象
b.print();
}
}
//结果:
//666
//2333
属性のカバレッジ
サブクラスが親クラスとまったく同じ属性名を定義する場合、それは属性オーバーライドと呼ばれます。
class A3{
String info="Hello"; //定义属性,暂不封装
}
class B3 extends A3{
int info=100; //名称相同,发生属性覆盖
public void print(){
System.out.println(super.info);
System.out.println(this.info);
}
}
public class Test1_1_3_6 {
public static void main(String args[]){
B3 b=new B3(); //实例化子类对象
b.print();
}
}
//结果:
//Hello
//100