变量的静态、动态、弱、强类型

Tal*_*lam -2 java type-systems

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

    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
Run Code Online (Sandbox Code Playgroud)

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

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

我相信这些问题的答案一定有很多,所以如果有的话,请发布链接,否则详细的解释将非常可观。

是什么让我困惑

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

And*_*eas 5

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

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

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

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

数字原始值可以相互分配,但如果分配可能导致值大小丢失(称为缩小原始转换),则必须进行强制转换

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

如果对象类型通过子类化相关,则可以相互分配对象类型,尽管向下转换时需要进行转换(称为缩小引用转换)。

对象和原语不能相互转换,除非涉及自动装箱和/或自动拆箱,例如intto/from Integer

在问题末尾的 3 个问题中,如果将第三个问题改写为“为什么 Java 具有原始类型?”,那么只有第三个问题有意义。这里已经回答了:为什么人们仍然在 Java 中使用原始类型?,这里:为什么 Java 中有原始数据类型?.