【重走Android之路】【基础篇(一)】【Java面向对象基础】数据类型与运算符
 

1、数据类型介绍

在Java中,数据类型分为两种:基本数据类型和引用类型。
基本数据类型共8种,见下表:
基本数据类型 字节数 二进制位数 最小值 最大值 默认值
byte 1 8-bit -2^7 +2^7 - 1 0
short 2 16-bit -2^15 +2^15 - 1 0
int 4 32-bit -2^31 +2^31 - 1 0
long 8 64-bit -2^63 +2^63 - 1 0
float 4 32-bit IEEE754 IEEE754 0.0f
double 8 64-bit IEEE754 IEEE754 0.0d
char 2 16-bit \u0000 \uFFFF \u0000
boolean ---- ---- ---- ---- false
void          
 
需要指出的是:
  1. boolean这个类型比较特殊,Javadoc中这样描述:

    • boolean: The boolean data type has only two possible values: true and false. Use this data type for simple flags that track true/false conditions. This data type represents one bit of information, but its "size" isn't something that's precisely defined.

            即:boolean类型只有两个值:true和false。使用这个类型来作为true/false分支的简单标识。这个类型只包含一个bit的信息,但是其所占空间并未精确定义
  2. void 也被放在了表中,但其实它不属于基本数据类型,准确的说它是伪类型,是一种无返回值类型。具体不必深究。
  3. 引用类型默认值为null。
  4. String作为参数传递时和其他引用类型不一样,即只传字符串值而非引用地址。

2、两种数据类型的区别

从以下三个方面分别对这两种数据类型进行对比:含义、处理、赋值。

2.1 含义

基本数据类型,其变量代表的是一个具体的值,可以是一个字符、一个数字或者一个布尔值等。
引用数据类型,其变量代表的是一个内存地址,该地址指向一块内存空间,在内存空间内存储着该变量所对应的一个或者一组值。
在Java中,基本数据类型的值和引用数据类型的地址信息是放在栈(Stack)中的,引用数据类型的值放在堆(Heep)中。例:
 class Student {
String ID;
String Name;
int Age;
public Student(String id, String name, int age) {
ID = id;
Name = name;
Age = age;
}
} int a = 10;
Student b = new Student("070271006", "喵小咪", 18);

上述变量的堆栈对应情况如下图:

 
 

2.2 处理

基本数据类型在声明的同时已经赋予空间,所以可以直接操作。例如:
 int a = 10;
int b = a + 20;

一般情况下,引用类型在声明的时候,只是创建了一个变量,其具体的空间并没有分配。需要使用关键字new来开辟空间存储数据。

例如:

 Student student = null;    // 此时只是声明了一个Student变量
// student.toString(); // 这时候使用该变量访问就会出错:该行会报空指针异常
student = new Student("070271006", "喵小咪", 18);// 此时会告知JVM开辟空间存储数据

上述两行代码的空间分配JVM是这样处理的:

  1. 在栈中创建一个名为student的变量,其变量值为空;
  2. 在堆中为Student开辟一块空间,并分别为ID、Name、Age三个成员变量设置默认值;
  3. 根据Student构造方法的定义,为三个成员变量分别赋值:"070271006", "喵小咪", 18
  4. 把Student对象在堆中的地址赋值给栈中的student变量。
经过上述流程,student就可以访问堆中的成员变量。
 
还有一种比较特殊的情况,就是String类型的使用,其详细分析见下篇文章。
 

2.3 赋值

基本数据类型的赋值操作确实是实际意义上的“赋值”,比如:
 int a = 10;
int b = a;  // 此时,b的值就是10
// 如果修改a的值,b的值不会发生变化。
a = 100;   // 此时a的值是100,b的值还是10

一般情况下,引用类型的赋值传递的是堆内存地址,例如:

 Student stuMiao = new Student("070271006", "喵小咪", 18);
Student stuNodin = stuMiao;

上述赋值操作并没有新创建对象,而是在栈中声明了一个名为stuNodin的变量,其变量值和stuMiao这个变量的值相同,都是指向Student这个对象的堆内存的地址。形象的比喻,就像是同一个人的两个名字一样。

如果修改stuMiao这个引用对应的数据,则stuNodin这个引用的数据会同时发生改变。
 stuMiao.Age = 16;    // 此时,stuMiao.Age 等于 16;stuNodin.Age 等于 16;

同样地,String作为一种特殊类型,仍然不适用上述规则。详见下篇文章。

3、运算符

        这里只提供Java中的运算符总览,不再赘述,详见下表:
算数运算符 +,-,×,/,%取余 ,++,--,- 取反
关系运算符 >,<,>=,<=,!=,==
逻辑运算符 !非, &与,|或,^异或,&& 短路与,|| 短路或
按位运算符 ~按位取反, &按位与, |按位或, ^按位异或
移位运算符 << 左移 ,>>带符号右移, >>>不带符号右移
三目条件运算符 D=表达式1?表达式2 :表达式3
赋值运算符 = ,+=,-=
 

4、循环

        Java中基本的循环有两种,即for循环和do-while循环,这里不再赘述。
        从J2SE 1.5开始,Java引入了一种for的变型循环:foreach循环。并不是说foreach是类似for的关键字,而是便于理解起的一个名字,其作用就是“Each(逐个)”遍历。基本结构基于for循环,详细如下:
        
 for (元素类型t 元素变量 x : 遍历对象list) {
引用了x的java语句;
}

foreach是一种for的简化版本,主要用于数组和集合的简单遍历操作。但是其也有局限性,其只提供遍历功能,不能进行删除、替换等操作,对于需要记录并使用索引的循环,foreach本身也无法实现(可以自己记录实现)。所以无法替代for循环,但是都可以转换为对应的for循环。

 // 实例一,遍历数组:
int[] arrays = new int[] {1, 2, 3};
for (int i : arrays) {
System.out.println(i);
} //实例二,遍历集合:
List<String> list = new ArrayList<String>();
for (String item : list) {
System.out.println(item);
}

【Nodin's Tips】

        本篇主要介绍了Java中的数据类型、运算符和循环,这些都是Java非常基础的知识。但是越是基础的知识越不可小视,俗话说“千里之堤毁于蚁穴”,基础掌握不好难成大器。在基础讲解的同时,对两种数据类型的区别进行了较为详细的分析,是对数据类型的进一步认知,也为我们下篇文章对String进行更详细的分析打下基础。
 
 本文系Nodin原创,转载请注明出处!http://www.cnblogs.com/monodin/p/3841185.html

【重走Android之路】【Java面向对象基础(一)】数据类型与运算符的更多相关文章

  1. 【重走Android之路】【Java面向对象基础(三)】面向对象思想

    [重走Android之路][基础篇(三)][Java面向对象基础]面向对象思想   1 面向对象的WWH   1.1 What--什么是面向对象         首先,要理解“对象”.在Thinkin ...

  2. 【重走Android之路】【Java面向对象基础(二)】细说String、StringBuffer和StringBuilder

    [重走Android之路][基础篇(二)][Java面向对象基础]细说String.StringBuffer和StringBuilder   1.String String是Java中的一个final ...

  3. 【重走Android之路】【番外篇】关于==和equals

    [重走Android之路][番外篇]关于==和equals   在实际的编程当中,经常会使用==和equals来判断变量是否相同.但是这两种比较方式也常常让人搞得云里雾里摸不着头脑.下面是我个人做的总 ...

  4. 【重走Android之路】【路线篇(二)】知识点归纳

    [重走Android之路][路线篇(二)]知识点归纳   参考:http://blog.csdn.net/xujing81/article/details/7313507   第一阶段:Java面向对 ...

  5. 【重走Android之路】【开篇】序

    [重走Android之路][开篇]   [序]         本人Nodin,偶尔也叫MoNodin,朋友们都喜欢叫我丁,还有个笔名叫陌上幽人,文艺时叫恋风,发奋时叫不肯腐烂的土壤...也许你觉得我 ...

  6. 【重走Android之路】【番外篇】有关于null的一些知识点

    [重走Android之路][番外篇]有关于null的一些知识点   1.首先,到底什么是null? null是Java中的一个关键字,用于表示一个空对象引用,但其本身并不是任何类型也不是属于任何对象. ...

  7. 【重走Android之路】【路线篇(一)】路线图

    总结归纳了J2SE和Android的知识点,自己制订了一套详细的路线图,其中肯定有考虑不全和不合适的地方,欢迎各位大牛批评指正.   详细路线图如下:  

  8. 085 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 04 构造方法调用

    085 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 04 构造方法调用 本文知识点:构造方法调用 说明:因为时间紧张,本人写博客过程中只是 ...

  9. 086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结

    086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结 本文知识点:面向对象基础(类和对象)总结 说明 ...

随机推荐

  1. 关于Python中的yield

    关于Python中的yield   在介绍yield前有必要先说明下Python中的迭代器(iterator)和生成器(constructor). 一.迭代器(iterator) 在Python中,f ...

  2. 【长期兼职】每天3小时写作=每月4000元外快(IT兼职写手)

    只要你有经验,每周平均有20来个小时的兼职时间. 只要你愿意静静地写一些心得总结. 那么就可以联系我QQ164349714,敲门:写作. 地址不限.特长不限.学历不限.年龄不限. 主要写作方向:1.投 ...

  3. 4.C#基础篇-->变量

    一.前言 变量的类型划分即内存中的存放位置如图: 变量的生命周期如图:

  4. Oracle系列教程

    推荐博客:http://blog.csdn.net/leshami 具体知识点总结: 1.oracle安装:http://www.cnblogs.com/bluepoint2009/p/oracle- ...

  5. 【BZOJ】【3156】防御准备

    DP/斜率优化 斜率优化的裸题…… sigh……又把$10^6$当成10W了……RE了N发 这题还是很水的 当然逆序也能做……不过还是整个反过来比较顺手 反转后的a[0]=反转前的a[n],以此类推直 ...

  6. Sea.js入门

    本文只是seajs的入门贴.要详细了解,请看GitHub主页上的相关链接,精彩不断,精选几篇: 前端模块化开发的价值 前端模块化开发的历史 ID和路径匹配原则 与RequireJS的异同 模块的加载启 ...

  7. WPF编程学习——样式

    本文目录 1.引言 2.怎样使用样式? 3.内联样式 4.已命名样式 5.元素类型样式 6.编程控制样式 7.触发器 1.引言 样式(Style),主要是用来让元素或内容呈现一定外观的属性.WPF中的 ...

  8. ZOJ2928 Mathematical contest in modeling(模拟退火)

    连续两天学了一些numerical analysis的方法,昨天是学了一下三分,今天学了一下模拟退火.很早就听说了模拟退火在求费马点上的运用了,只知道一些大概,但是没有深入研究,碰到题目就卡壳了,现在 ...

  9. android 四大组件Broadcast Receiver

    本文介绍Broadcast Receiver,包括几部分内容:Broadcast Receiver概述及实例.自定义Broadcast Receiver.Broadcast Receiver的实现细节 ...

  10. .net web程序发布之后,出现编译错误

    .net web程序发布之后,在IIS上浏览的时候出现编译错误. CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temp ...