2017-06-17 41 views
-2

虽然有这么多的问题涉及到这个主题,但总觉得我不知道或说我不满意这些答案,所以我在这里发布再次变量的静态,动态,弱,强类型

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 
在第二

,第4和第9行它让我看到评论错误,而我可以在它被注释掉工程线路使INT焦炭之间的转换。

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

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

是什么让我困惑

  • 一些如何静态/动态和强/弱的外表一样给我
  • 如何编译器知道何时检查静态/动态类型和时检查强/弱类型
  • 这两种类型检查系统的必要性是什么。
+1

'char'和'int'都是数字原语,这就是为什么这是可行的,因为'char'在内部被表示为一个无符号的8位数字,就像将一个long赋给一个double类型 – Moira

+5

实际上并不存在两种类型检查 - 只是一些固定的数值转换,可能适用于某些情况。关于“编译器如何知道” - 呃,它知道,因为语言规范包含非常明确的规则:[第5章转换和上下文](https://docs.oracle.com/javase/specs/jls/ se8/html/jls-5.html) – Hulk

+0

不能将对象转换为原始类型。 – Blasanka

回答

4

您完全忽略了Static vs Dynamic的概念,我不知道在问题中Strong vs Weak是什么意思,因为您的问题似乎是关于Primitives vs Objects。

Static vs Dynamic约为方法绑定,即确定当对象被子类化时要调用哪个对象的方法。你的代码没有调用任何方法,所以Static vs Dynamic对你的问题没有意义。

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

你的问题似乎是基元左右,这是所有小写的类型:
byteshortcharintlongfloatdoubleboolean
忽略boolean,其是true VS false值,这些都是数字类型,即它们存储一个数字值,并且它们不是对象

数字原始值可以相互赋值,但如果赋值可能导致值的大小损失(称为narrowing primitive conversion),则转换是必需的。

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

如果对象类型通过子类相关,则可以将对象类型相互分配,但在向下转换时需要强制转换(称为narrowing reference conversion)。

除了涉及auto-boxing和/或auto-unboxing时,对象和原语不能互相投射,例如, int往返Integer

在问题结尾处的3个问题中,只有第三个问题有意义,如果它被重新设置为“为什么Java具有原始类型?”。已经在这里回答:Why do people still use primitive types in Java?,和这里:Why are there Primitive datatype in Java?