环境:
MacBook Pro 15
jdk8
IntelliJ IDEA
引子
看源码是发现Character的最大值’\uFFFF’、最小值’\u0000’,好奇了下:Java中char是16位(2字节)的存储,作为字符,Java使用了Unicode编码,所以’\u0000’对应整数0,’\uFFFF’对应65535。’\u0000’的默认输出是个小方块(不是空格,空格对应Unicode字符’\u0020’)
package com.diduo.jb.primitive;
public class CharacterTest {
/**
* Character
* MIN_VALUE = '\u0000'
* MAX_VALUE = '\uFFFF'
* @param args
*/
public static void main(String[] args) {
System.out.println('\u0000'); // 小方格
System.out.println("hello" + '\u0000' + "world");
System.out.println('\uFFFF');
System.out.println('\u0000' + 0);
System.out.println('\u0001' + 0);
System.out.println('\uFFFF' + 0);
System.out.println('\u0020'); // 空格
}
}
大家在平时使用Java基础类型时,是每次变量声明紧跟着赋值操作?
还是分场景有不同的处理,具体有哪些场景?
对包装类型(类)的使用又是啥情况?
如果对类型的声明、初始化、作用域等使用问题,比较清楚,平时使用便可游刃有余。
Java变量类型
“全局变量”、“局部变量”等的定义分析可以参考:菜鸟教程:C作用域规则
由于Java是面向对象语言,所有内容抛开对象(类)都没有具体意义;变量也是在类中,以及具体方法中。
“成员变量”:类中(方法外)声明(定义)的变量,成员对象(没有 static 修饰);
“局部变量”:方法中声明(定义)的临时变量;
变量声明、作用域
类中可以以成员对象的方式,声明变量;作用域跟着对象走。
方法中也可以直接声明局部临时变量;作用域随着方法结束走到尽头,等待垃圾回收。
初始化
类“成员变量”初始化,跟随类的初始化,由构造函数完成;当然也可以传入初始值,对应完成成员变量的初始化;(下边针对默认无参构造函数)
(1). 基础类型的成员变量:随着类的初始化,构造函数会给基础类型的成员变量赋基础类型的默认值;
(2). 包装类型(类对象的引用类型)的变量:默认初始化为null;
(3). 数组、集合、Map等类型的变量:同(2),只是初始化单个对象VS对象集合的区别;方法“局部变量”,声明、初始化需要一气呵成,方法中没有初始化的变量是无效变量不能使用。
TIPS:
1. Java中变量的声明,相当于开辟了内存空间。具体数据的存储还和区分变量的类型、Java的内存结构,类的成员变量、方法中的局部变量在栈堆的存储。
2. Java集合,foreach在遍历时也会生成临时变量,所以foreach遍历时,不能进行修改操作;
3. 变量的声明还会和一些关键字static、final等挂在一起,等下次关键字专题再细说。
4. 重点推荐java变量与内存深入了解,讲的比较细、全。
参考:
java变量与内存深入了解
菜鸟教程:C作用域规则
ssgg:关于变量的分析
https://blog.csdn.net/weixin_38470004/article/details/76468269