• Java中静态类型检查是如何进行的


    以下内容来自维基百科,关于静态类型检查和动态类型检查的解释:

    • 静态类型检查:基于程序的源代码来验证类型安全的过程;
    • 动态类型检查:在程序运行期间验证类型安全的过程;

    Java使用静态类型检查在编译期间分析程序,确保没有类型错误。基本的思想是不要让类型错误在运行期间发生。

    以下代码是一个例子,理解了他,你会更好的理解Java静态类型检查是如何工作的。

    代码示例

    假定我们有如下类,A和B,B继承A。

    class A {
        A me() {
            return this;
        }
    
        public void doA() {
            System.out.println("Do A");
        }
    }
    
    class B extends A {
        public void doB() {
            System.out.println("Do B");
        }
    }

    首先,调用new B().me()将返回什么呢?A对象还是B?

    me()方法被声明将返回A对象,所以在编译期间,编译器只知道它返回A对象。然而,它在运行期间却返回了B对象,因为B继承了A的方法返回了自己。

    静态类型检查是如何工作的?

    如下代码行是非法的,即使方法doB()是被B对象调用的。问题在于它的引用类型是A,在编译器件,编译器不知道它的真实类型,所以将它当做A类型。

    //illegal
    new B().me().doB();

    所以,只有下面的代码是可以被调用的:

    //legal
    new B().me().doA();

    然而,我们可以将其强制类型转换成B,如下代码:

    //legal
    ((B) new B().me()).doB();

    接下来,我们添加一个C类:

    class C extends A{
        public void doBad() {
            System.out.println("Do C");
        }
    }

    那么,下面的代码语句将通过静态类型检查:

    //legal
    ((C) new B().me()).beBad();

    编译器不知道它的真实类型,但是在运行期间将会抛出异常,因为B类型不能转换成C类型;

    译文链接:http://www.programcreek.com/2011/12/an-example-of-java-static-type-checking/

  • 相关阅读:
    java中的数组与集合的排序摘抄自:http://blog.csdn.net/jonathan_q_bo/archive/2005/11/29/539043.aspx
    JSF开发
    二维数组排序
    java properties
    HashMap按key排序
    Properties 类的使用
    鸟哥linux的简单sh程序设计http://blog.chinaunix.net/u/22249/showart.php?id=149846
    JSF中文教程
    JSF技术介绍
    关于Apache不能解析html内容
  • 原文地址:https://www.cnblogs.com/chenpi/p/5503997.html
Copyright © 2020-2023  润新知