`
ZangXT
  • 浏览: 117433 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

static方法与覆盖

阅读更多

     The Java Programming Language中的一段话:Static members within a classwhether fields or methodscannot be overridden, they are always hidden. The fact that they are hidden has little effect, howevereach static field or method should always be accessed via the name of its declaring class, hence the fact that it gets hidden by a declaration in a subclass is of little consequence. If a reference is used to access a static member then, as with instance fields, static members are always accessed based on the declared type of the reference, not the type of the object referred to.

开始不是特别明白,看了Java Puzzlers中的一段话,理解的差不多了。

转载如下:

看看一个程序,动态绑定与静态绑定。

  1. classDog{
  2. publicstaticvoidbark(){
  3. System.out.print("woof");
  4. }
  5. }
  6. classBasenjiextendsDog{
  7. publicstaticvoidbark(){}
  8. }
  9. publicclassBark{
  10. publicstaticvoidmain(Stringargs[]){
  11. Dogwoofer=newDog();
  12. Dognipper=newBasenji();
  13. woofer.bark();
  14. nipper.bark();
  15. }
  16. }

 

啊,你可能一开始就认为这应该是动态绑定吧,多态性!!那么应该只打印一个woof吧!可并非如此,可怜的小狗Basenji也叫唤了(据书中所说,此种狗在非洲,而且从来不叫唤,无法想象这世上有不叫唤的狗,呵呵)。问题就在于bark是一个静态方法,而静态方法的调用不存在任何动态绑定机制!对于静态方法,只会根据调用者的编译期类型进行调用,woofer,nipper都被声明为Dog,他们的编译期类型相同。你可能要问,子类 Basenji中的bark()方法不是覆写了父类中的bark方法,那么是怎么回事?答案是它隐藏了父类中的bark方法,静态方法是不能被覆写的,他们只能被隐藏。要想使这只可怜的小狗回归不叫唤的“正常”状态,去掉方法之前的static标签即可。

注意隐藏的含义。

分享到:
评论

相关推荐

    static方法和非staitic方法的调用.zip_718static_arrangertr

    非`static`方法,又称为实例方法,是与类的特定实例关联的。这意味着你需要先创建一个类的实例,然后通过这个实例来调用该方法。实例方法可以访问和修改实例变量,因为它们与对象的状态紧密相关。例如,`String`类的...

    Java软件开发常见面试题及答案.doc

    - **static方法与覆盖**: `static`方法是在编译时绑定的,它们属于类而非实例,因此不能被覆盖。在运行时,`static`方法总是引用定义它们的类,而不是引用创建的对象类型。 #### 4. Java支持的基本数据类型有哪些?什么...

    static的使用方法

    子类不能覆盖静态方法,但可以通过`super`关键字调用父类的静态方法。 8. **内存管理**: 静态变量存储在方法区(在Java 8及以后的版本中,称为元空间),而非堆内存。这意味着静态变量的生命周期贯穿整个应用程序...

    final和static用法详解JAVA

    static 方法只能访问 static 变量和其他 static 方法。 3. static 块 static 块是 Java 中的一种特殊的块,它用于在类加载时执行一些初始化操作。static 块只能访问 static 变量和其他 static 方法。 final 和 ...

    Java 中方法的重载与覆盖

    ### Java中的方法重载(Overloading)与方法覆盖(Overriding) #### 方法的重载(Overloading) 在Java中,方法重载允许我们定义多个同名的方法,但这些方法之间必须具备不同的特征来区分它们。这有助于提高代码的...

    java方法的覆盖java方法的覆盖.doc

    同样,静态方法(`static`)也不能被覆盖,而是被隐藏,因为静态方法与类关联,而不是与类的实例关联。 5. **abstract方法**:如果父类方法是抽象的(`abstract`),子类必须覆盖它,除非子类也是抽象的。如果子类不是...

    C语言中static变量使用方法

    1. **生存期与作用域**:静态局部变量的生存期覆盖整个程序,但其作用域仅限于定义它的函数内部。这意味着,即使函数退出,变量依然存在,但在函数外部无法访问。 2. **初始化与默认值**:静态局部变量支持初始化。...

    static与final的异同

    4. 使用`final`修饰一个方法,然后在子类中尝试覆盖这个方法,编译时会报错,因为`final`方法不允许被重写。 了解`static`和`final`的关键字用法对于编写健壮、可维护的Java代码至关重要。在设计类和接口时,明智地...

    java中final和static的区别

    5. 注意:父类的 private 成员方法是不能被子类方法覆盖的,因此 private 类型的方法默认是 final 类型的。 而 static 关键字则有不同的用法,包括: 1. static 修饰成员变量和成员方法,以及代码块和内部类。分别...

    Java关键字final、static使用总结

    final 方法不能被子类的方法覆盖,但可以被继承。使用 final 方法的原因有二:一是把方法锁定,防止任何继承类修改它的意义和实现;二是高效,编译器在遇到调用 final 方法时候会转入内嵌机制,大大提高执行效率。 ...

    面向对象与Java实现(多态、static、fina

    在实际开发中,final常用于保护敏感数据、避免方法的意外覆盖以及阻止不必要的类继承,从而增强代码的安全性和稳定性。 ### 结论 多态、static和final是Java面向对象编程中不可或缺的关键概念,它们各自发挥着重要...

    C语言static的用法

    - 在多线程环境中,`static`变量由于其生命周期覆盖整个程序运行周期的特点,可能会引起线程安全问题。 - 需要注意保护对`static`变量的访问,避免多个线程同时修改同一个`static`变量导致的数据不一致问题。 4. ...

    Java新手指南方法覆盖Java开发Java经验技巧共14

    - 覆盖的方法必须与被覆盖的方法有相同的返回类型、名字和参数列表。 - 覆盖的方法不能降低可见性(如将public变为private)。 - 覆盖的方法不能比被覆盖的方法更受限制(即,访问修饰符不能更严格)。 - 子类...

    javastatic的使用方法.docx

    总结,`static`关键字在Java中用于声明类方法和类变量,它们与对象实例无关,由类共享。同时,`static`方法和变量在类加载时初始化。继承和重写是面向对象编程的关键特性,允许子类扩展和定制父类的行为,多态性则...

    java之中的静态变量与静态方法的继承与覆盖问题.doc

    ### Java之中的静态变量与静态方法的继承与覆盖问题 #### 静态变量与静态方法的基本概念 在Java编程语言中,静态变量(也称为类变量)和静态方法(也称为类方法)是由`static`关键字修饰的成员变量和成员方法。...

    final关键字和static_用法

    `static`修饰的方法称为静态方法,静态方法可以直接通过类名来调用,而不需要创建对象。静态方法中不能访问非静态成员变量和非静态成员方法,因为这些成员是在创建对象之后才存在的,而静态方法并不依赖于任何特定的...

    详解Java8新特性之interface中的static方法和default方法

    static方法的使用与普通的static方法相同,例如: public interface InterfaceA { static void showStatic() { System.out.println("InterfaceA++showStatic"); } } 在上面的代码中,我们定义了一个interface ...

    static.tar.gz

    解压后,将得到的`static`目录复制到你的visdom安装路径下的相应位置,覆盖原有的`static`目录。请注意备份原文件,以防替换后出现问题可以恢复。 替换完成后,重新启动visdom服务,就可以看到新的界面效果或功能。...

    JAVA方法覆盖与重载的区别.doc

    a) **方法名称必须相同**:子类中的方法必须与要覆盖的父类方法具有相同的名称。 b) **参数列表必须相同**:子类方法的参数列表必须与父类方法完全匹配,包括参数数量和类型。 c) **返回类型必须相同**:子类覆盖的...

Global site tag (gtag.js) - Google Analytics