【问题标题】:Why does Java accept a "return null" for a function prototype with the return type "Character" but not for the return type "char"? [duplicate]为什么 Java 接受返回类型为“Character”的函数原型的“return null”,但不接受返回类型“char”的函数原型? [复制]
【发布时间】:2014-01-08 08:38:46
【问题描述】:

我正在更新我的 Java 知识,我正在使用一个返回类型为 char 的函数,然后我在函数中有一个 return null 语句,但 Eclipse 开始抱怨。只要我用Character 替换了char 的返回类型,它就开始工作了。

我了解 Character 是原始类型 char 的包装类,因此我可以理解 Character 类如何能够接受 null 并返回该“空对象”,而原始 char 无法表示 null。但是我不知道这个猜想是否正确,如果它是正确的,我想知道是否有人可以在细节上启发我或指出正确的方向。

【问题讨论】:

  • 因为 Character 是一个封装的 class 而 char 只是一个原始类型,它告诉了差异。 instance 可以有空值,而原始没有

标签: java data-structures


【解决方案1】:

Character 是一个对象,因此nullCharacter 引用的可接受值。

charprimitive,不能分配值 null

【讨论】:

  • 那么我的猜测或多或少是正确的吗?我只是想确保我的推理没有逻辑上的矛盾。
  • @你完全走上了正轨,你的想法是对的。
  • @eddieberklee:是的,你的推理是正确的。您可以在我提供的链接中阅读有关这两种变体的更多信息。
【解决方案2】:

Character 类如何能够接受空值并返回该“空对象”,而原始 char 无法表示空值。

只有对象可以保存null 值。由于 char 是 primitive type 它有自己的默认值,并且您不能将 null 分配给它,因为 Character 是 Object ,您可以分配 null

对象默认为null

Data Type   Default Value (for fields)
byte                     0
short                    0
int                      0
long                     0L
float                    0.0f
double                   0.0d
**char**               '\u0000'
**String (or any object)**  null
boolean false

【讨论】:

    【解决方案3】:

    CharacterObject,因此允许使用 null。原始类型char 被分配了一个默认值。

    • 由于CharacterObject,它由一个引用组成 变量和对象。如果任何对象未分配给引用 变量,它不引用任何东西,即null
    • char 原语的情况下,总是分配一个默认值。

    【讨论】:

      【解决方案4】:

      Character 继承Object 类,Object null 可以是Character。 而char 是原语

      【讨论】:

        【解决方案5】:

        Java 和 ActionScript 编程语言中的原始包装类是 java.lang 包中提供的八个类之一,用于为八种原始类型提供对象方法。 Java 中的所有原始包装类都是不可变的。 J2SE 5.0 将原始类型的自动装箱引入到它们的包装器对象中,并将包装器对象自动拆箱到它们的原始值中——包装器对象和原始值之间的隐式转换。 当需要 Object 时,包装类用于表示原始值。包装类与 java.util 包中的 Collection 类和 java.lang.reflect 反射包中的类一起广泛使用。 原始包装类及其对应的原始类型是:


        原始类型 -> 包装类 -> 构造函数参数

        1. 字节 -> 字节 -> 字节或字符串
        2. 短 -> 短 -> 短或字符串
        3. int -> 整数 ->int 或字符串
        4. long -> Long -> 长或字符串
        5. float -> Float -> float、double 或 String
        6. 双 -> 双 -> 双或字符串
        7. 字符 -> 字符 ->字符
        8. 布尔值 -> 布尔值 -> 布尔值或字符串

        Byte、Short、Integer、Long、Float 和 Double 包装类都是 Number 类的子类。 包装类 BigDecimal 和 BigInteger 不是原始包装类之一,它们是可变的。

        另见this

        因此,总而言之,Java 中的对象(字符)可以被分配空值,但原语(char)不能,因为它们表示内存中具有 on 值的位置,但原语是​​对包含整个类的内存位置的引用

        【讨论】:

          【解决方案6】:
          public class CharacterDemo {
          
              private static char a;
          
              private static Character b;
          
              public static void main(String[] args) {
                     //default value
                  System.out.println(a);
                  System.out.println(b);
              }
          }
          
          When you execute the above code 
          Output:
          
          null
          
          In the first line it prints null character '\u0000'
          but second line it prints null object
          

          【讨论】:

          • object.toString() 在第二行打印
          猜你喜欢
          • 1970-01-01
          • 2021-03-23
          • 1970-01-01
          • 2015-02-21
          • 2021-05-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多