zoukankan      html  css  js  c++  java
  • 面向对象之继承03(方法覆写重点)

    方法覆写
    属性的覆盖
    继承性的主要特征是子类可以根据父已有的功能扩展,但是在子类定义属性和方法的时候,有可能定义扩展属性和扩展方法与父类同名那么在这样的情况下,称为覆写
    方法覆写
    当子类定义的方法名称与父类相同,参数类型及个数、返回值相同时就称为发生了覆写
    观察覆写产生的效果

    class A{
    	public void fun(){
    		System.out.println("A类中的方法");
    	}
    }
    
    class B extends A{
    }
    
    public class testDemo{
    	public static void main(String args[]){
    		B b = new B();
    		b.fun();
    	}
    }
    


    此时类B覆写
    观察覆写

    class A{
    	public void fun(){
    		System.out.println("A类中的方法");
    	}
    }
    
    class B extends A{
    	public void fun(){
    		System.out.println("B类中的方法");
    	}
    }
    
    public class testDemo{
    	public static void main(String args[]){
    		B b = new B();
    		b.fun();
    	}
    }
    


    发生了覆写之后,此时会调用实例化子类中已经被覆写的方法
    一个类可能会有多个子类,每个子类都会有自己的实现
    覆写结果的分析要素:
    观察实例化的是那个类;
    观察这个实例化的类里面调用的方法是否已经被覆写过的,如果没覆写,调用父类的
    覆写的使用原则(被动):
    如果现在发现父类中的方法名称功能不足(不适合于本子类),但是又必须使用这个方法名称的时候,就需要覆写一个概念实现
    以上的代码实现了覆写的功能,但是如果要想更好地实现覆写操作,需要考虑到权限问题。子类覆写的方法不能拥有多父类更严格的访问控制权限
    访问控制权限:public>default>private,private的访问权限是最严格的。99%的情况下方法使用public声明
    正确的覆写

    class A{
    	void fun(){
    		System.out.println("A类中的方法");
    	}
    }
    
    class B extends A{
    	public void fun(){
    		System.out.println("B类中的方法");
    	}
    }
    
    public class testDemo{
    	public static void main(String args[]){
    		B b = new B();
    		b.fun();
    	}
    }
    

    错误覆写

    class A{
    	public void fun(){
    		System.out.println("A类中的方法");
    	}
    }
    
    class B extends A{
    	void fun(){
    		System.out.println("B类中的方法");
    	}
    }
    
    public class testDemo{
    	public static void main(String args[]){
    		B b = new B();
    		b.fun();
    	}
    }
    

    覆写报错

    testDemo.java:8: error: fun() in B cannot override fun() in A
    	void fun(){
    	     ^
      attempting to assign weaker access privileges; was public // 尝试分配更小的访问权限,以前是public,
    1 error
    

    此时子类中使用了default权限,相对于父类中的public权限属于更加严格的限制
    疑问?如果父类中使用了private声明,子类覆写时使用了public声明,那么叫覆写吗?
    从概念上讲,父类的方法是private,属于小范围权限,而public属于扩大范围权限。权限上符合覆写要求
    先抛开private不看,先看一个正常的覆写操作

    class A{
    	public void fun(){
    		print();
    	}
    	public void print(){
    		System.out.println("A类中的方法");
    	}
    }
    
    class B extends A{
    	public	void print(){ // 覆写print方法
    		System.out.println("B类中的方法");
    	}
    }
    
    public class testDemo{
    	public static void main(String args[]){
    		B b = new B();
    		b.fun();
    	}
    }
    

    下面使用private声明父类中的方法

    class A{
    	public void fun(){
    		print();
    	}
    	private void print(){
    		System.out.println("A类中的方法");
    	}
    }
    
    class B extends A{
    	public	void print(){ // 覆写print方法
    		System.out.println("B类中的方法");
    	}
    }
    
    public class testDemo{
    	public static void main(String args[]){
    		B b = new B();
    		b.fun();
    	}
    }
    


    此时子类中没有覆写父类的print()方法,也就是说,如果使用private声明,方法是对子类不可见的。就算子类定义了一个与覆写要求完全一样的方法,也不能够发生覆写。此时相当于子类自定义了一个新的方法而已
    一旦有了覆写之后,默认情况下子类所能调用的一定是被覆定过的方法。为了使用父类的方法,可以使用"super.方法()"调用

    class A{
    	public void fun(){
    		print();
    	}
    	public void print(){
    		System.out.println("A类中的方法");
    	}
    }
    
    class B extends A{
    	public	void print(){ // 覆写print方法
    		super.print();
    		System.out.println("B类中的方法");
    	}
    }
    
    public class testDemo{
    	public static void main(String args[]){
    		B b = new B();
    		b.print();
    	}
    }
    


    关于"super.方法()"与"this.方法()"的区别?
    使用"this.方法()"会首先查找本类中是否存在有要调用的方法名称,存在则直接调用,否则查找 父类中是否具备此方法,存在则调用,父类中没有则在编译时失败
    使用"super.方法()",明确表示调用的是父类的方法(不查找子类)
    面试:请解释重载与覆写的区别?(请解释Overloading与Overwrite的区别)

    No. 区别 重载 覆写
    1 英文单词 Overloading Overwrite
    2 发生范围 发生一个类里 发生在继承关系中
    3 中等文本 方法相同,参数相同,返回类型相同 方法名称相同,参数的类型及个数相同,方法返回值相同
    4 权限 没有权限的限制 被覆写的方法不能拥有比父类更为严格的访问控制权限

    面试:在使用Overloading时,返回值能否不同?
    在发生重载关系的时候,返回值可以不同。考虑到程序设计的统一性,重载时尽量保证方法的返回值类型相同

  • 相关阅读:
    pycharm基本设置
    pycharm破解
    jupyter
    gpu监控收藏
    监控收藏
    k8s 亲和性和反亲和性 以及污点和容忍
    通过服务器 远程管理卡进行装机
    7.11实习培训日志-Git Linux
    ## HashTable和HashMap的区别
    springboot2 -广播式WebSocket
  • 原文地址:https://www.cnblogs.com/anyux/p/11898767.html
Copyright © 2011-2022 走看看