改善Java程序建议10

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

先看一个正常的静态导入,

import static java.lang.Math.PI;
import static java.lang.Math.abs;

public class Client{
  public static void mainn(String[] args){
    System.out.println("PI=" +PI);
    System.out.println("abs(100)="+abs(-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(100)=0
很明显是本地的属性和方法被引用了,为什么不是Math类中的属性和方法呢?那是因为编译器有一个“最短路径”原则:如果能够在本类中查找到的变量、常量、方法,就不会到其他包或父类、接口中查找,以确保本类中的属性、方法优先。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1、.java源文件: 一个以”.java“为后缀的源文件:只能有一个与文件名相同的类,可以包含其他类。 2、类方...
    Hughman阅读 5,566评论 1 9
  • (一)Java部分 1、列举出JAVA中6个比较常用的包【天威诚信面试题】 【参考答案】 java.lang;ja...
    独云阅读 11,948评论 0 62
  • Win7下如何打开DOS控制台? a:开始--所有程序--附件--命令提示符 b:开始--搜索程序和文件--cmd...
    逍遥叹6阅读 5,526评论 4 12
  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 7,618评论 0 11
  • 流下的眼泪 滴成一颗星的模样 远远地望着 静静地看着 你是不是快把我忘了 直到一个破晓 其实 这样也很好 你什么都...
    L離兮阅读 2,593评论 0 1

友情链接更多精彩内容