【Simple Java】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/

时间: 2024-12-23 14:55:32

【Simple Java】Java中静态类型检查是如何进行的的相关文章

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

以下内容来自维基百科,关于静态类型检查和动态类型检查的解释: 静态类型检查:基于程序的源代码来验证类型安全的过程: 动态类型检查:在程序运行期间验证类型安全的过程: Java使用静态类型检查在编译期间分析程序,确保没有类型错误.基本的思想是不要让类型错误在运行期间发生. 以下代码是一个例子,理解了他,你会更好的理解Java静态类型检查是如何工作的. 代码示例 假定我们有如下类,A和B,B继承A. class A { A me() { return this; } public void doA(

详解Java 8中Stream类型的“懒”操作

在进入正题之前,我们需要先引入Java 8中Stream类型的两个很重要的操作: 中间和终结操作(Intermediate and Terminal Operation) Stream类型有两种类型的方法: 中间操作(Intermediate Operation) 终结操作(Terminal Operation) 官方文档给出的描述为[不想看字母的请直接跳过]: Stream operations are divided into intermediate and terminal operat

Andoid java文件中的Log检查工具

AndroidLogChecker 由于发布软件版本的时候我们需要把Log注释掉,此工具可以检查java类中的Log所在行以及是否已经注释. Github: https://github.com/cumtkangyi/AndroidLogChecker package com.leo.kang.tools; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; impor

静态类型检查与继承

类型检查(type checking)是指确认任一表达式的类型并保证各种语句符合类型的限制规则的过程.Java是静态类型检查的语言,但是仍然需要运行期类型检查,并抛出可能的运行时异常. Wiki: Static type-checking is the process of verifying the type safety of a program based on analysis of a program's source code. Dynamic type-checking is th

JAVA泛型容器的类型检查

泛型容器是通过指定容器包含对象的类型,由编译器保证对象类型的正确性,在编译阶段就能检查出类型错误.如下列将List<Long>对象longList赋予一个List<GenericTest>对象gtList,会报编译错误. public class GenericTest { public static List<Long> longList = Arrays.asList (1L ,2L); public static void main(String args[]){

JAVA泛型中的类型擦除及为什么不支持泛型数组

一,数组的协变性(covariant array type)及集合的非协变性 设有Circle类和Square类继承自Shape类. 关于数组的协变性,看代码: public static double totalArea(Shape[] arr){ double total = 0; for (Shape shape : arr) { if(shape != null) total += shape.area(); } return total; } 如果给 totalArray(Shape[

Java bean中布尔类型使用注意

JavaBean是一个标准,遵循标准的Bean是一个带有属性和getters/setters方法的Java类. JavaBean的定义很简单,但是还有有一些地方需要注意,例如Bean中含有boolean类型的属性.我们知道对于一个属性来说,如果其命名为test,那么其getter和setter方法一般为getTest()和setTest.但是如果test为一个布尔类型,那么其getter和setter方法为isTest()和setTest().这是一个区别 public class BeanTe

java为什么要用类型擦除实现泛型?

为什么需要泛型? 试想你需要一个简单的容器类,或者说句柄类,比如要存放一个苹果的篮子,那你可以这样简单的实现: class Fruit{} class Apple extends Fruit{} class Bucket{ private Apple apple; public void set(Apple apple){ this.apple = apple; } java学习群669823128 public Apple get(){ return this.apple; } } 这样一个简

java高新技术中《九》

一:注解 1.注解(Annotation) 注解相当一个类或接口,每一个注解都是一个实例对象    注解的使用形式:@interface即@注解类名 定义注解类: @interface A {…} 使用了“注解类”的类: @A class B{} 对“使用了注解类的类”进行反射操作: class C { B.class.isAnnotationPresent(A.class); A a=(A)B.class.getAnnotation(A.class); } 2.注解类的生命周期 源文件(.ja