• Java中实例方法,实例变量,静态方法,静态变量,final方法重写的问题,覆盖


    Java中只有非私有的实例方法能被重写,即实现多态,子类可以覆盖父类的方法,但是实例变量不能覆盖,若子类和父类均定义了同样名称的变量,则对于子类来说这是两个不同的变量,要想调用父类的变量必须显示去调用,静态方法属于类也不能重写,用谁的引用调用的方法就是谁的,final方法也不能重写,若子类的方法和父类相同,只能说是不同的实现,但是不是覆盖,参考Java编程思想157页,了解一下java中的覆盖和隐藏

    JAVA静态方法形式上可以重写,但从本质上来说不是JAVA的重写。因为静态方法只与类相关,不与具体实现相关,声明的是什么类,则引用相应类的静态方法(本来静态无需声明,可以直接引用),看下例子:

    1. class Base{  
    2.         static void a( ){System.out.println("A");  }  
    3.                  void b( ){System.out.println("B"); }  
    4. }  
    5. public class  Inherit extends Base{  
    6.           static void a( ){System.out.println("C");  }  
    7.                   void b( ){System.out.println("D"); }  
    8.            public static void main(String args[]){  
    9.                     Base b=new Base();  
    10.                     Base  c=new Inherit();  
    11.                     b.a();  
    12.                     b.b();  
    13.                     c.a();  
    14.                     c.b();  
    15.          }  
    16. }  

    以上输出的结果是:

    A
    B
    A
    D
           非静态方法 按重写规则调用相应的类实现方法,而静态方法只与类相关。

           所谓静态,就是在运行时,虚拟机已经认定此方法属于哪个类。

    专业术语有严格的含义,用语要准确."重写"只能适用于实例方法.不能用于静态方法.对于静态方法,只能隐藏(刚才的例子可以重写那只是形式上的 ,并不满足多态的特征,所以严格说不是重写)。

          静态方法的调用不需要实例化吧..  不实例化也就不能用多态了,也就没有所谓的父类引用指向子类实例.因为不能实例化 也就没有机会去指向子类的实例。所以也就不存在多态了。

    重载(overloading)和重写(overriding) 
    重 载和重写都是针对方法的概念,在弄清楚这两个概念之前,我们先来了解一下什么叫方法的型构(英文名是signature,有的译作“签名”,虽然它被使用 的较为广泛,但是这个翻译不准确的)。型构就是指方法的组成结构,具体包括方法的名称和参数,涵盖参数的数量、类型以及出现的顺序,但是不包括方法的返回 值类型,访问权限修饰符,以及abstract、static、final等修饰符。比如下面两个就是具有相同型构的方法: 

    1. public void method(int i, String s) {   
    2.     // do something   
    3. }   
    1. public String method(int i, String s) {   
    2.     // do something   
    3. }  

    而这两个就是具有不同型构的方法: 

    1. public void method(int i, String s) {   
    2.     // do something   
    3. }   
    4.   
    5. public void method(String s, int i) {   
    6.     // do something   
    7. }  

    了解完型构的概念后我们再来看看重载和重写,请看它们的定义: 

    • 重写,英文名是overriding,是指在继承情况下,子类中定义了与其基类中方法具有相同型构的新方法,就叫做子类把基类的方法重写了。这是实现多态必须的步骤。
    • 重载,英文名是overloading,是指在同一个类中定义了一个以上具有相同名称,但是型构不同的方法。在同一个类中,是不允许定义多于一个的具有相同型构的方法的。


    我 们来考虑一个有趣的问题:构造器可以被重载吗?答案当然是可以的,我们在实际的编程中也经常这么做。实际上构造器也是一个方法,构造器名就是方法名,构造 器参数就是方法参数,而它的返回值就是新创建的类的实例。但是构造器却不可以被子类重写,因为子类无法定义与基类具有相同型构的构造器。

    转载自:

  • 相关阅读:
    php使用时间戳保存时间的意义
    php输出控制函数存在的意义
    php中foreach使用引用的陷阱
    mac下php添加openssl扩展
    gitlab配置自动同步
    lnmp集成环境tp nginx vhost配置
    上传文件中文文件名乱码的解决方法以及iconv函数的使用
    php返回数据格式
    怎样让Git忽略当前已经更改的文件
    connect() php-cgi.sock failed (2: No such file or directory)
  • 原文地址:https://www.cnblogs.com/huajiezh/p/5774623.html
Copyright © 2020-2023  润新知