Java-方法覆盖重写

时间:2021-04-22作者:klpeng分类:IT综合浏览:275评论:0

方法的覆盖重写发生在子类继承了父类非private权限修饰符的方法,在子类对该方法进行重新定义方法中的内容,并且在子类中调用该方法,不会调用父类中的内容,这就是覆盖重写。

当然,覆盖重写首先要父类和子类的方法名称相同,参数列表相同

1.没有覆盖重写,子类没有父类的方法  。子类就会继承所有父类的非private权限的方法。

  那么子类调用该方法的话,不会出现覆盖重写,只会调用父类的该方法。

class Father{
    
    protected void Test1(){
            System.out.println("父类");     
    }
}
class Son extends Father{

}
public class Test{
    public static void main(String[]args){
        Son son = new Son();
        son.Test1();
    }

}

输出结果:

父类

2.子类覆盖重写父类的方法后,父类的方法就会被覆盖,子类调用该方法会出现新定义的内容

  子类调用该方法的话,不会执行父类对应的方法,而是调用在子类覆盖重写的方法

class Father{
    
    protected void Test1(){
            System.out.println("父类");
    }
}
class Son extends Father{
    protected void Test1(){ //覆盖重写
            System.out.println("子类");      
    }
}
public class Test{
    public static void main(String[]args){
        Son son = new Son();
        son.Test1();
    }

}

输出结果:

子类

 以上都是正常的操作。

那么考虑一下下面的两种情况。

1.当子类覆盖重写的方法的访问权限修饰符和父类的不同

class Father{
    
    protected void Test1(){
            System.out.println("父类");
    }
}
class Son extends Father{
     void Test1(){ //此处会报错
            System.out.println("子类");      
    }
}
public class Test{
    public static void main(String[]args){
        Son son = new Son();
        son.Test1();
    }

}

以上代码程序会报错。

Java-方法覆盖重写

原因就是子类覆盖重写的方法的访问权限修饰符访问权限低于父类所对应的方法的访问权限修饰符。

上面的程序中,Son覆盖重写的Test1方法的访问权限是默认的,而父类的Test1方法的访问权限是public  。public >默认的  。子类的覆盖重写的方法的访问权限修饰符的访问权限必须要大于等于父类所对应的方法。

class Father{
    
    protected void Test1(){
            System.out.println("父类");
    }
}
class Son extends Father{
    public void Test1(){ //public 访问权限大于protected
            System.out.println("子类");      
    }
}
public class Test{
    public static void main(String[]args){
        Son son = new Son();
        son.Test1();
    }

}

2.子类的覆盖重写方法的返回值"大小"与子类不同  (大小是相对的)

 子类的覆盖重写方法的返回值可以跟父类对应的方法不同。

class Father {

	A a ;
	B b;
    public B Test1() {
    	 
    	
    	return b;
    }
	
}
class Son extends Father{
	 public A Test1() { //TODO:会报错
		System.out.println("子类");
		return a;
	}
}
class A{
	
}
class B extends A{
	
}

以上程序会报错。因为B是A的子类,那么相对于B和A的话,A是父类,B是子类,A会比B要大。子类覆盖重写的方法的返回值要小于等于父类的返回值大小。

class Father {

	A a ;
	B b;
	C c;
    public B Test1() {
    	 
    	
    	return b;
    }
	
}
class Son extends Father{
	 public C Test1() {  //B和C相对而言,C是子类,B是父类,C比B小 不会报错
		System.out.println("子类");
		return c;
	}
}
class C extends B{
	
}
class A {
	
}
class B extends A{
	
}

以上程序就不会报错。

一般而言,子类覆盖重写父类方法大多都是仅修改方法里面的内容,访问权限修饰符,返回值和参数列表不变。

上述结论可能会出现差错,望指教。

打赏
文章版权声明:除非注明,否则均为彭超的博客原创文章,转载或复制请以超链接形式并注明出处。
相关推荐

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

猜你喜欢