探究Java中基本类型和部分包装类在声明变量时不赋值的情况下java给他们的默认赋值
当基本数据类型作为普通变量(八大基本类型: byte,char,boolean,short,int,long,float,double)
- 只有开发人员对其进行初始化,java不会对其进行初始化,
- 如果不初始化基本类型变量,则编译时就会报错
- 实验的部分包装类如 Byte,Char,Boolean,Short,Integer,Long,Float,Double 等类的约束和基本类型如出一辙
当基本数据类型作为类成员变量时,java会自动给这些变量初始值赋值
class ElementTypes {
// 作为类成员变量声明
byte defaultBasicByte;
char defaultBasicChar;
boolean defaultBasicBoolean;
short defalutBasicShort;
int defaultBasicInt;
long defaultBasicLong;
float defaultBasicFloaat;
double defaultBasicDouble;
Byte defaultByte;
Char defaultChar;
Boolean defaultBoolean;
Short defalutShort;
Integer defaultInt;
Long defaultLong;
Float defaultFloaat;
Double defaultDouble;
}
public class Exploration {
/**
* 输出基本数据类型及部分包装类成员变量被java赋予的默认值
*/
public static void ExploreClassFieldsDefaultValue() {
ElementTypes elementTypes = new ElementTypes();
// 调试输出
logger.debug(byte.class + " DefaultValue " + elementTypes.defaultBasicByte);
logger.debug(char.class + " DefaultValue " + elementTypes.defaultBasicChar);// Console
// 输出为空方格
logger.debug(boolean.class + " DefaultValue " + elementTypes.defaultBasicBoolean);
logger.debug(short.class + " DefaultValue " + elementTypes.defalutBasicShort);
logger.debug(int.class + " DefaultValue " + elementTypes.defaultBasicInt);
logger.debug(long.class + " DefaultValue " + elementTypes.defaultBasicLong);
logger.debug(float.class + " DefaultValue " + elementTypes.defaultBasicFloaat);
logger.debug(double.class + " DefaultValue " + elementTypes.defaultBasicDouble);
logger.debug(byte.class + " DefaultValue " + elementTypes.defaultByte);
logger.debug(char.class + " DefaultValue " + elementTypes.defaultChar);
logger.debug(boolean.class + " DefaultValue " + elementTypes.defaultBoolean);
logger.debug(short.class + " DefaultValue " + elementTypes.defalutShort);
logger.debug(int.class + " DefaultValue " + elementTypes.defaultInt);
logger.debug(long.class + " DefaultValue " + elementTypes.defaultLong);
logger.debug(float.class + " DefaultValue " + elementTypes.defaultFloaat);
logger.debug(double.class + " DefaultValue " + elementTypes.defaultDouble);
}
@Test // 如果不用 JUnit 测试也可以选择直接 main函数
public void test() throws Exception {
ExploreClassFieldsDefaultValue();
}
}
以上将基本数据类型和部分包装类声明为该类型的类属性变量,在不声明初始值的前提下然后在类的静态方法中输出其指向的变量空间中的值
控制台输出,即可知道 java 在构造类的时候默认给这些类型变量的默认值
2020-11-21 21:34:35.773 [main] DEBUG localCollection.Exploration - byte DefaultValue 0
2020-11-21 21:34:35.773 [main] DEBUG localCollection.Exploration - char DefaultValue
2020-11-21 21:34:35.774 [main] DEBUG localCollection.Exploration - boolean DefaultValue false
2020-11-21 21:34:35.774 [main] DEBUG localCollection.Exploration - short DefaultValue 0
2020-11-21 21:34:35.774 [main] DEBUG localCollection.Exploration - int DefaultValue 0
2020-11-21 21:34:35.774 [main] DEBUG localCollection.Exploration - long DefaultValue 0
2020-11-21 21:34:35.774 [main] DEBUG localCollection.Exploration - float DefaultValue 0.0
2020-11-21 21:34:35.774 [main] DEBUG localCollection.Exploration - double DefaultValue 0.0
2020-11-22 08:25:26.304 [main] DEBUG localCollection.Exploration - class java.lang.Byte DefaultValue null
2020-11-22 08:25:26.304 [main] DEBUG localCollection.Exploration - class java.lang.Character DefaultValue null
2020-11-22 08:25:26.304 [main] DEBUG localCollection.Exploration - class java.lang.Boolean DefaultValue null
2020-11-22 08:25:26.304 [main] DEBUG localCollection.Exploration - class java.lang.Short DefaultValue null
2020-11-22 08:25:26.304 [main] DEBUG localCollection.Exploration - class java.lang.Integer DefaultValue null
2020-11-22 08:25:26.304 [main] DEBUG localCollection.Exploration - class java.lang.Long DefaultValue null
2020-11-22 08:25:26.304 [main] DEBUG localCollection.Exploration - class java.lang.Float DefaultValue null
2020-11-22 08:25:26.304 [main] DEBUG localCollection.Exploration - class java.lang.Double DefaultValue null
2020-11-22 08:25:26.304 [main] DEBUG localCollection.Exploration - class java.lang.String DefaultValue null
以上第二行 char 类型对应的默认值 在控制台是输出了一个“空白方格”???
首先搞清楚 char 类型在 java 中是 16位的,使用的是 Unicode 编码方式,其中 Unicode 编码前 0~127 是 8 位的 ASCII 值,而 ASCII 值中又分为 控制字符和可显示字符
使用java 方法进行尝试输出
public static void examineCharWithASCII() {
char a = 0x00;// 十六进制数 0x00对应的ASCII码是控制字符空字符(Null)
char c = 0x20;// 十六进制数 0x00对应的ASCII码是控制字符EM连接介质中断
char b = 0x19;// 十六进制数 0x00对应的ASCII码是可显示字符(空格)(sp)
char d = 0x21;// 十六进制数 0x00 对应的ASCII码是可显示字符'!'
char u0 = '\u0000';// 使用 Unicode 编码方式进行初始化
logger.debug("\u0000 to " + char.class + u0);
logger.debug("0x00 to " + char.class + a);
logger.debug("0x19 to " + char.class + b);
logger.debug("0x20 to " + char.class + c);
logger.debug("0x21 to " + char.class + d);
}
输出结果<图>
<测试 char 类型数据使用 unicode编码和十六位数初始化后打印的结果图>
输出结果的内容复制效果(实际上是要分行复制的,null(什么都没有)真的很影响整段复制粘贴)
2020-11-22 08:28:28.780 [main] DEBUG localCollection.Exploration - to char
2020-11-22 07:49:37.715 [main] DEBUG localCollection.Exploration - 0x00 to char
2020-11-22 07:49:37.715 [main] DEBUG localCollection.Exploration - 0x19 to char
2020-11-22 07:49:37.715 [main] DEBUG localCollection.Exploration - 0x20 to char
2020-11-22 07:49:37.715 [main] DEBUG localCollection.Exploration - 0x21 to char!
- '\u0000' 在 unicode 中就是 NUL 控制字符
- 0x00 和 0x19 这两个十六进制数对应的控制字符不可显示(实际上就是不能正常显示),在控制台就会显示方格(除了null控制字符是真的什么都没有,其他的控制字符输出的方格复制进纯文本编辑器还是可以看到对应的
<0x19>
),其它啊控制字符类似效果 - 0x20 和 0x21 分别是空白可显示字符和'!'可显示字符,所以一个打印的是空白(可被选中的空格)和感叹号,其他可显示字符与其效果类似
文档当前版本 v1.0
版本号 | 修改内容 | 备注 |
---|---|---|
1.0 | 生成初始内容 | 新建文档 |