5.Java变量

5.Java变量

👯转载请保留原文链接: http://dashidan.com/article/java/basic/Java变量.html

所有的程序都使用变量临时存储各种数据, 在Java语言中变量必须在程序中被定义(或声明)后才能使用, 必须为每个变量确定一个具体类型.Java中变量分为基础类型变量和引用类型变量.

① 基础类型变量

Java有八种基础类型变量. 分为数字类型(四个整数型,两个浮点型), 布尔型和字符类型.

1. 数字类型变量

byte 字节型变量,表示整数,取值范围(-2^8到2^8-1),不支持小数.

byteb0=88;byteb1=-10;

short 短整型变量,表示整数,取值范围(-2^16到2^16-1),不支持小数.

shorts0=99;shorts1=-1;

int 整型变量,表示整数,取值范围(-2^32到2^32-1),不支持小数.

整形常量,范围可以粗略即为正负21亿之间,超过这个范围需要采用long类型.

inti0=100000;inti1=-2;

long 长整型变量,表示整数,取值范围(-2^64到2^64-1),不支持小数.

longl0=100000L;longl1=-3L;

float 浮点数类型,表示小数,取值范围(到).浮点数有舍入误差.

定义变量时,需要在数字后边加个字符f或者F,表示该数字为float类型.

floatf0=3.14f;floatf1=2.73F;

double: 浮点数类型,表示小数,取值范围(到).浮点数有舍入误差.

定义变量时,需要在数字后边加个字符d或者D,表示该数字为double类型.

doubled0=123.4d;doubled1=1.4D;

char 字符型,用英文单引号'定义.可以储存任何字符.也可以当整数来用,但一般情况不建议这么用.

charc0='a';charc1='人';

数据类型和范围

写代码时,根据数据类型和范围选择对应的数字类型.超过类型的最大值或者小于最小值的数据会出错.

java默认值

在java里面定义一个变量, 如果不主动给它赋值, 系统会自动给它赋一个值,这个值叫做`默认值`.

java数字类型的最大值和最小值

计算机存储整形数据是以二进制方式存储,有符号数据类型(byte, short, int, long, float)最小值为`-2^n`,最大值为`2^-1`,`n`为占用字节数.无符号类型(char)最小值为0,最大值为2^16(65535). 存储浮点类型数据表示范围太大,采用科学计数法方式存储,所以范围会整数型大很多.

Java数字类型变量默认值和取值范围

浮点数不是精确值

浮点数值不适合用于禁止出现舍入误差的金融计算中. 例如:System.out.println(2.0-1.1); 将打印0.899999999999999,而不是0.9.因为浮点数值采用二进制系统表示,而二进制无法精确表示分数1/10,就像十进制无法精确表示1/3一样.如果需要在数值计算中不含有舍入误差,应该使用BigDecimal类.

2. 布尔类型变量

boolean(布尔类型),只有两个取值:true(是)和false(否). 默认值false.

booleanbo0=true;booleanbo1=false;

示例代码:

packagecom.dashidan.lesson5;/*** 大屎蛋教程网-dashidan.com*

* Java教程基础篇: 5. Java变量* 基础类型变量*/publicclassDemo1{publicstaticvoidmain(String[]args){/** byte 变量*/byteb0=88;byteb1=-10;System.out.println(b0);System.out.println(b1);/** short 变量*/shorts0=99;shorts1=-1;System.out.println(s0);System.out.println(s1);/** int 变量*/inti0=100000;inti1=-2;System.out.println(i0);System.out.println(i1);/** long 变量*/longl0=100000L;longl1=-3L;System.out.println(l0);System.out.println(l1);/** float 变量*/floatf0=3.14f;floatf1=2.73F;System.out.println(f0);System.out.println(f1);/** double 变量*/doubled0=123.4d;doubled1=1.4D;System.out.println(d0);System.out.println(d1);booleanbo0=true;booleanbo1=false;System.out.println(bo0);System.out.println(bo1);/** char 变量*/charc0='a';charc1='人';System.out.println(c0);System.out.println(c1);System.out.println(c0+c1);}}

输出:

88-1099-1100000-2100000-33.142.73123.41.4truefalsea人20251

② 字符串类型变量

字符串类型是对象类型,不属于基础类型. 赋值的时候属于值传递. 在Java中,String是不可变(final)的.Java在运行时保存了一个字符串池(String pool),这使String成为了一个特别的类.

java中字符串为什么是不可变的?

只有当字符串是不可变的,字符串池才有可能实现. 字符串池的实现可以在运行时节约很多heap空间,因为不同的字符串变量都指向池中的同一个字符串.但如果字符串是可变的,那么`String interning`将不能实现(译者注:String interning是指对不同的字符串仅仅只保存一个,即不会保存多个相同的字符串.),因为这样的话,如果变量改变了它的值,那么其它指向这个值的变量的值也会一起改变.如果字符串是可变的,那么会引起很严重的安全问题.譬如,数据库的用户名、密码都是以字符串的形式传入来获得数据库的连接,或者在socket编程中,主机名和端口都是以字符串的形式传入, 这个值如果被修改, 将会带来很严重的安全隐患.

java中字符串不可变有什么优点?

* 由于字符串的值是不可变的, 无改变字符串指向的对象的值,避免安全漏洞.

* 多线程安全, 同一个字符串实例可以被多个线程共享. 这样便不用因为线程安全问题而使用同步.字符串自己便是线程安全的.

* 类加载器要用到字符串,不可变性提供了安全性,以便正确的类被加载. 譬如你想加载java.sql.Connection类,而这个值被改成了myhacked.Connection,那么会对你的数据库造成不可知的破坏.

* 在它创建的时候hashcode就被缓存了,不需要重新计算. 这就使得字符串很适合作为Map中的键,字符串的处理速度要快过其它的键对象.这就是HashMap中的键往往都使用字符串.

字符串赋值

常用有2种方式: 直接通过=赋值, 和通过new String() 的方式创建字符串对象赋值.

Strings1="test0";Strings2=newString("test1");Strings3=newString(s2);

获取字符串长度

通过String对象自带的length()方法.

Strings0="test0";intsize=s0.length();

字符相加

通过+操作可以将2个字符串组合.

Strings0="test0";Strings1="test1";Strings2=s0+s1;

字符串比较

字符串比较内容是否相同,需要通过equals()方法.

Java的虚拟机处理字符串相同的时候很神奇. 通常`==`对于引用类型的变量来说是判断内存地址是否相同. 但字符串这里虚拟机进行了优化, 会通过Java独有的"字符串池"技术, 自动判断上下文中是否有相同的字符串, 如果有相同的字符串, 则直接把原有的字符串对象拿来使用, 不重新创建字符串对象. 如果字符串发生改变则自动创建一个新的字符串对象.

示例代码:

packagecom.dashidan.lesson5;/*** 大屎蛋教程网-dashidan.com** Java教程基础篇: 5. Java变量* 字符串变量*/publicclassDemo2{publicstaticvoidmain(String[]args){Strings0="大屎蛋教程网";Strings1="大屎蛋教程网";Strings2=newString("大屎蛋教程网");/** equal比较字符串内容*/booleanisSame=s0.equals(s1);System.out.println("1 equals isSame : "+isSame);isSame=s0.equals(s1);System.out.println("2 equals isSame : "+isSame);isSame=s0.equals(s2);System.out.println("3 equals isSame : "+isSame);/** s2 是通过new的方式从新创建的字符串对象,s0 s2 指向不同的内存地址*/isSame=(s0==s2);System.out.println("4 == isSame : "+isSame);isSame=(s0==s1);/** 这里里的赋值,java虚拟机做了处理,自动指向了同一个字符串*/System.out.println("5 == isSame : "+isSame);/** 改变字符串 s0*/s0+="aaa";/** s0 发生变化*/System.out.println("s0 "+s0);/** s1 没有发生变化*/System.out.println("s1 "+s1);/** 字符串s0 发生改变,虚拟机自动新建了一个字符串对象,s0 s1不再指向同一个字符串*/isSame=(s0==s1);System.out.println("6 == isSame : "+isSame);}}

输出:

1 equals isSame : true2 equals isSame : true3 equals isSame : true4 == isSame : false5 == isSame : trues0 大屎蛋教程网aaas1 大屎蛋教程网6 == isSame : false

③ 引用类型变量

引用类型(reference type)指向对象在内存空间的地址.

1. 什么是引用

把对象数据比喻为一座房子,引用就是门牌号. 一个对象在内存中会请求一块内存空间来保存数据,根据对象的大小, 需要占用的空间大小也不等. 访问对象数据时, 不直接访问对象在内存中的数据, 而是通过引用去访问. 如果我们定义了不止一个引用指向同一个对象, 那么这些引用是不相同的, 因为引用也是一种数据类型, 需要一定的内存空间(栈空间stack)来保存. 但是它们的指向的对象数据是相同的, 都指示同一个对象在内存(堆空间heap)的中位置.

例:

Stringa="This is a Text!";Stringb=a;

a和b是不同的两个引用,我们使用了两个定义语句来定义它们. 但它们的值是一样的, 都指向同一个对象 "This is a Text!".如图:

String对象的值本身是不可更改的

像`b = "World";` `b = a;`这种情况不是改变了"World" 这一对象的值, 而是改变了它的引用`b`的值使之指向了另一个`String`对象`a`.

2.引用类型

java有3种引用类型

类class

接口interface

数组array

3.引用要点

引用是一种数据类型(保存在stack,栈空间), 保存了对象在内存(heap,堆空间)中的地址.不是简单数据类型也不是类实例(对象).

不同的引用可能指向同一个对象,换句话说, 一个对象可以有多个引用, 即该类类型的变量.

4.引用传递

引用传递也称为传地址.方法调用时,实际参数的引用(地址)被传递给方法中相对应的形参和实参内容相同,指向同一块内存地址,方法执行中对引用的操作将会影响到实际对象. 详情参考:参数的值传递与引用传递.

④ 变量作用域

Java变量从影响范围划分, 分为成员变量和局部变量.

1. 成员变量

类内部定义的变量叫做成员变量,如果没有设定初始值,系统会自动赋值为默认值. 作用范围是整个类. 成员变量在所在类被实例化后,存在堆内存中.

2. 局部变量

方法内定义的变量被称为局部变量,局部变量没有默认值,声明变量时必须设定初始值. 作用范围从声明开始,直到包含它的块(对应的大括号})结束. 局部变量在所在方法调用时,存在栈内存中. 方法参数是局部变量,范围涵盖整个方法.

3. 示例代码

packagecom.dashidan.lesson5;/*** 大屎蛋教程网-dashidan.com*

* Java教程基础篇: 5. Java变量* 变量作用域*/publicclassDemo3{/*** a,b 是成员变量,整个方法都可以调用.*/publicstaticinta;publicstaticfloatb=3.0f;publicstaticvoidmain(Stringargs[]){/**  在方法中调用成员变量, a为默认值, b为设定值*/System.out.println(a);System.out.println(b);testVar();/** 这里输出变量m, n,编译代码时,会报错,提示没有定义变量m,n*///System.out.println(m);//System.out.println(n);}publicstaticvoidtestVar(){/**m,n 是成员变量,必须初始化赋值.作用域是在这个方法中. */intm=0;intn=1;System.out.println(m);System.out.println(n);}}

输出:

03.001

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容