【问题标题】:Static , Dynamic, Weak, Strong types of the variable变量的静态、动态、弱、强类型
【发布时间】:2017-06-17 19:50:26
【问题描述】:

虽然与这个话题相关的问题很多,但不知怎的,我总觉得有些东西我不知道或者说我对这些答案不满意,所以我在这里再次发布

    Integer in=new Integer(4);
    Character character=(Character) in; //Cannot cast from Integer to Character
    String s="hello";
    int j=(int) s;//Cannot Cast from string to int 
    char chi='a';
    int l=(int)chi; //works
    int i=0;
    char ch=(char)i; //works
    String b=(String)1+"hello";//cannot cast from int to string

在第 2 行、第 4 行和第 9 行中,它向我显示了注释错误,而我可以在它被注释的行中进行 intchar 之间的转换。

所以在我发布的代码中,编译器检查静态/动态行为以及检查弱/强行为的位置。

我相信这些问题肯定有这么多的答案,所以如果有的话,贴出链接,否则详细的解释真的很可观。

什么让我感到困惑

  • 静态/动态和强/弱在我看来是一样的
  • 编译器如何理解何时检查静态/动态类型以及何时检查强/弱类型
  • 这两种类型检查系统的必要性是什么。

【问题讨论】:

  • charint 都是数字原语,这就是为什么它起作用的原因,因为 char 在内部表示为一个无符号的 8 位数字,就像将 long 转换为 double
  • 实际上并没有两种类型的检查——只有一组固定的数字转换可能适用于某些情况。至于“编译器是如何知道的”——嗯,它知道是因为语言规范包含非常明确的规则:Chapter 5. Conversions and Contexts
  • @TaleevAalam 不,char、int、short、long、double、byte 都是数字原始类型所以你可以在两者之间进行转换他们
  • @1blustone Java 中的char 不是 8 位,而是 16 位。
  • @TaleevAalam 这对这个问题并不重要——他只是指出了1bluestone's comment中的一个错误

标签: java type-systems


【解决方案1】:

您完全错过了静态与动态的概念,我不知道您在问题中所说的强与弱是什么意思,因为您的问题似乎是关于原始与对象的。

静态 vs 动态是关于方法绑定,即确定在子类化对象时要调用对象的哪个方法。您的代码没有调用任何方法,因此静态与动态对您的问题毫无意义。

正如我所说,我不知道你所说的强 vs 弱是什么意思。 Java有强引用和弱引用的概念,但这都是关于垃圾收集的,与你的问题无关。

您的问题似乎是关于 Primitives 的,它们是全小写的类型:
byte, short, char, int, long, float, double,和boolean
忽略 boolean,这是一个 truefalse 值,它们都是数字 value 类型,即它们存储一个数字值,它们不是 对象 .

数字基元值可以相互分配,但如果分配可能导致值大小丢失(称为narrowing primitive conversion),则需要进行强制转换。

Objects 是混合大小写的类型,例如IntegerCharacterString 等(用户对象类型可以小写,但这违反了命名标准)。

如果对象类型通过子类化相关,则它们可以相互分配,但向下转换时需要进行转换(称为narrowing reference conversion)。

对象和原语不能相互转换,除非涉及auto-boxing 和/或auto-unboxing,例如intInteger.

在您问题末尾的 3 个问题中,如果将其改写为“为什么 Java 有原始类型?”,则只有第三个问题是有意义的。此处已回答:Why do people still use primitive types in Java?,此处:Why are there Primitive datatype in Java?

【讨论】:

    猜你喜欢
    • 2014-02-03
    • 2012-08-07
    • 2010-12-05
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 2011-11-20
    • 1970-01-01
    相关资源
    最近更新 更多