美文网首页Java学习笔记
不要在本类中覆盖静态导入的变量和方法

不要在本类中覆盖静态导入的变量和方法

作者: Viking_Den | 来源:发表于2016-09-21 23:25 被阅读12次

如果一个类中的方法及属性与静态导入的方法及属性重名会出现什么问题呢?我们先来看一个正常的静态导入,代码如下:

import static java.lang.Math.PI;  
import static java.lang.Math.abs;  
 
public class Client {  
    public static void main(String[] args) {  
           System.out.println("PI="+PI);  
           System.out.println("abs(100)=" +abs(-100));  
    }  
} 

很简单的例子,打印出静态常量PI值,计算-100的绝对值。现在的问题是:如果我们在Client类中也定义了PI常量和abs方法,会出现什么问题?代码如下:

import static java.lang.Math.PI;  
import static java.lang.Math.abs;  
 
public class Client {  
      //常量名与静态导入的PI相同  
      public final static String PI="祖冲之";  
      //方法名与静态导入的相同  
      public static int abs(int abs){  
        return 0;  
    }  
          
    public static void main(String[] args) {  
        System.out.println("PI="+PI);  
        System.out.println("abs(100)=" +abs(-100));  
    }  
} 

以上代码中,定义了一个PI字符串类型的常量,又定义了一个abs方法,与静态导入的相同。首先说好消息:编译器没有报错,接下来是不好的消息了:我们不知道哪个属性和哪个方法被调用了,因为常量名和方法名相同,到底调用了哪一个方法呢?我们运行一下看看结果:

PI=祖冲之  
abs(100)=0 

很明显是本地的属性和方法被引用了,为什么不是Math类中的属性和方法呢?那是因为编译器有一个“最短路径”原则:如果能够在本类中查找到的变量、常量、方法,就不会到其他包或父类、接口中查找,以确保本类中的属性、方法优先。

因此,如果要变更一个被静态导入的方法,最好的办法是在原始类中重构,而不是在本类中覆盖。

相关文章

  • 改善Java程序建议10

    建议10:不要在本类中覆盖静态导入的变量和方法 先看一个正常的静态导入, 现在的问题是:如果我们也在Client类...

  • 不要在本类中覆盖静态导入的变量和方法

    如果一个类中的方法及属性与静态导入的方法及属性重名会出现什么问题呢?我们先来看一个正常的静态导入,代码如下: 很简...

  • Thinking in Java

    3. 操作符 3.1 静态导入 静态导入:方法中调用静态导入的其他类中的静态方法 3.2 使用Java操作符 副作...

  • 错误: 无法从静态上下文中引用非静态方法

    静态方法中不能引用非静态变量静态方法中不能引用非静态变量静态方法中不能引用非静态变量 静态方法可以通过所在类直接调...

  • java随笔

    static变量和static方法 static变量 1.static修饰的变量:静态变量,静态变量在内存中只有一...

  • JS中容易出错的点

    基本类型和引用类型的赋值问题 上例很好地证明了:基本类型值按值传递,引用类型值按引用传递 同名变量和方法覆盖问题 ...

  • 静态方法、变量与实例方法、变量之比较心得

    静态方法、变量与实例方法、变量之比较心得C# 中常用Static 修饰静态变量和静态方法 静态变量和实例变量有什么...

  • static关键字

    在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用...

  • php中"self"和"this", "->"和"::"符号的区

    参考文章:php 中self,this的区别和实地操作 1.self ①self可以访问本类中的静态属性和静态方法...

  • Kotlin学习笔记(六)伴生类(静态变量和静态方法)

    在java中我们知道,静态的变量和方法可以通过类直接进行访问,在kotlin中类似Java静态的变量和方法,我们可...

网友评论

    本文标题:不要在本类中覆盖静态导入的变量和方法

    本文链接:https://www.haomeiwen.com/subject/dktzettx.html