JAVA学习脚印2: 数据类型和运算符

本节将记录java中的数据类型和运算符。

1. java中的数据类型

java中变量的数据类型有两种:基本类型(primitive)和引用(reference)。

首先看基本类型(primitive),一共包括8种即:

boolean 、char、 byte、 short、 int、 long、 float 、double。

基本类型具有如下特点:

1) 在java中为了解决软件从一个平台移植到另一个平台或者同一个平台中的不同操作系统之间进行移植的诸多问题,保证在所有机器上运行同一程序得到一致的结果,所有的数值类型的所占据的字节数量与运行java代码的机器无关, 数量固定。

查看其中的表数范围可以通过访问这几种类型的封包类中定义的常量,例如查看long型的表数范围可以如下:

System.out.printf("long   : %,d~%,d\n",Long.MIN_VALUE,Long.MAX_VALUE);

将输出: long   : -9,223,372,036,854,775,808~9,223,372,036,854,775,807

注意,若要处理超出上述基本类型最大表示范围的数值可以使用java.math包中的两个很有用的类BigInteger和BigDecimal。这两个类可以处理包含任意长度数字序列的数值。BigInteger类实现了任意精度的整数运算,BigDecimal实现了任意精度的浮点数运算。

例如:

long longMax= Long.MAX_VALUE ;// 9223372036854775807longMax += 1;// ought to be 9223372036854775808System.out.println(longMax);// overflow :print -9223372036854775808BigInteger big = BigInteger.valueOf(Long.MAX_VALUE).add(BigInteger.valueOf(1));System.out.println(big);//print 9223372036854775808

可见当表数超过基本类型时,可以使用系统提供的类BigInteger来加以处理。

另外,Java的字符类型采用的是UTF-16编码方式对Unicode编码表进行表示。其中一个char类型固定2字节,表示范围为'\u0000'(0)~'\uffff'(65,535)。

关于java中char的更多细节,网上已经有诸多详细介绍,可参考http://blog.csdn.net/fantasy0126/article/details/6050087 。

Unicode 字符查看可参考网站: http://www.scarfboy.com/coding/unicode-tool?

或者: http://unicode-table.com/en

2) java中没有任何无符号类型,即unsigned type。

3) double类型的数值精度是float类型的两倍,默认情况下没有后缀F 的浮点数值为double类型,加上后缀F则表示float类型。所有的浮点数值计算都遵循IEEE 754标准,另外有三个表示溢出和出错的特殊数值:

即 正无穷大、负无穷大 、 NaN(不是一个数字,例如负数的平方根结果为NaN)。稍后的例子2-3显示了这些特殊值。

4) java中 boolean类型有两个值: true 和fasle,用来判定逻辑条件。尤其要注意,整型值和布尔值之间不能进行相互转换。例如:

int n;...if(n) {}

强制运行将出现以下错误:

Exception in thread "main" java.lang.Error: Unresolved compilation problem:

Type mismatch: cannot convert from int to boolean

at com.learningjava.BoolTest.main(BoolTest.java:14)

这里整型n就不能与布尔型进行转换。将程序改为 if(n > 0) ...即可。

5)java中的数值类型转换基本上与C语言很相同,只不过多了byte类型。要注意,int向float,long向float及double,转换可能有精度损失。默认情况下,不允许将占据字节量大的类型向小的类型转换,这就好比将一个大杯子里的东西倒入小杯子,可能会造成溢出,引起编译会防止这些情况发生,例如:

int a =24;

byte b = a;//Type mismatch: cannot convert from int to byte

但是有时很也需要将不同数值类型之间进行转换,因此同C语言一样,也有强制类型转换。

int a =24;

byte b =(byte)a;//ok

强制类型转换,并不总是可靠的,当一个数值超过目标类型的表数范围时,强制转换将会截断形成一个完全不同的值,例如:

int a =300;

byte b =(byte)a;

System.out.println(b);//print 44

这里的结果是int型截断为300 mod 256的结果,其中256为byte能表示的整数个数,关于截断的具体形式暂时不做过多了解。

6)java中char类型用来表示单个字符,通常用来表示字符常量。

java中没有内置的字符串类型,而是由标准库提供了一个与定义类String来表示字符串。注意,每个双引号括起来的字符串都是String类的一个实例:

System.out.println("hello".length());// print 5

这里并没有使用new而是双引号括起来字符串就构成了String的实例并调用其length方法获得其长度。

注意,java中的String类是一个不可变字符串,String类并没有提供修改字符串的方法。

c++中的字符串默认时(不是const常量)可以通过下标修改,例2-1 显示了这种区别:

例 2-1 hello.cpp

#include <iostream>
#include <string>
using namespace std;
int main()
{ string hello = "hello!"; hello[0]= 'H'; cout<<hello<<endl;
} 

将输出: Hello!

在java中: hello[0]='H'; 将会引发编译器错误:

Unresolved compilation problem:

The type of the expression must be an array type but it resolved to String

要想修改则要通过:

String hello = "hello!";

hello = 'H'+hello.substring(1);

语句实现。

引用类型具有如下特点:

1) 一定要注意,java中实际上并没有对象变量这样的东西存在,只存在引用到对象的变量,我们称之为引用变量。例如,语句

Date deadLine;

此时变量 deadLine 不是一个对象,也没有引用任何对象,此时不能调用Date类的任何方法。

必须初始化引用变量,让其引用到具体的对象,有两种方法,可以构造一个新的对象来初始化 deadLine:  deadLine = new Date();

或者让其引用一个已经存在的对象:  deadLine =  birthday;

举个更通俗的例子:

TV d = new TV();

d.play();

这里我们可以把TV 的引用变量d,想象成是 电视机的遥控器,通过这个遥控器可以让电视机来执行不同动作;同时d还可以遥控不同的但型号相同的电视机(类型相同): d= anotherTv;

2) java中的引用变量不是对象的容器,它可以看做时c++中的对象指针:

Date birthday;//java  类似于Date* birthday;//c++。

引用变量只是用来表示单一对象,只有虚拟机才会知道如何使用引用来取得对象,而我们是不必关心这一点的。

3) 对象的声明、创建、赋值有三个步骤,请注意粗体部分:

step1: 声明引用变量,要求虚拟机分配空间给引用变量,限定了引用变量可以引用的类型

TV d = new TV();

step2: 创建对象,要求虚拟机分配堆空间给新建立的TV对象

TV d = new TV();

step3: 连接对象和引用,此后引用变量才可以操作具体的对象了

TV d = new TV();

4) 引用变量与对象之间存在引用与被引用的关系,一个对象可以被多个引用变量引用,同时一个引用变量也可以引用不同的对象。例如:

Book a = new Book();

Book b = new Book();// 有两个对象,两个引用

Book c =b;//有两个对象,三个引用,其中c与b引用同一个对象

c =a;// 有两个对象,三个引用,此时c与a引用同一个对象

5) 注意在java中,数组一定是对象,无论数组被声明为装载基本数据类型还是对象引用,数组永远是对象。数组一般用来装载同一类型的值。

基本类型的数组有两种方式声明:

int[] a ={1,2,3};

System.out.println(Arrays.toString(a));//print [1, 2, 3]

或者

int[] a = new int[] {1,2,3};

System.out.println(Arrays.toString(a));//print [1, 2, 3]

对象数组的声明也有两种方式:

Date[] dates = new Date[2];

dates[0] = new Date();

dates[1] = new Date();

或者

Date[] dates = {new Date(),new Date()};

注意创建数组对象的引用后必须创建实际的对象,并将对象连接到数组引用变量。

下面的代码:

Date[] dates = new Date[2];

System.out.println(dates[0].toString());

将产生错误:

Exception in thread "main" java.lang.NullPointerException

at com.learningjava.ForTesting.main(ForTesting.java:12)

主要原因就是没有给dates[0]绑定到实际的对象,此时dates[0]为空引用,即null。

2. java中的运算符

java中运算符基本上与c++相同。

需要注意,整数被0除将会产生一个异常,而浮点数除0将会得到无穷大。例2-2显示了这几个特殊点。

例 2-2  ForTesting.java

package com.learningjava;
/*** a program for testing other things* @author wangdq*/
public class ForTesting {public static void main(String[] args) {int a = 1;double b = -1.1;double c = 1.1;//System.out.println((a/0));//java.lang.ArithmeticException System.out.println((b/0));//print -InfinitySystem.out.println((c/0));//print InfinitySystem.out.println(Math.sqrt(b));//print NaN}
}

至此,我们已经熟悉了java中基本类型和引用类型的特点,以及运算符中的特殊点。

JAVA学习脚印2: 数据类型和运算符相关推荐

  1. Java学习day02-数据类型和运算符

    数据类型和运算符 今日目标: 1.变量: 2.数据类型: 3.数据类型转换 4.变量使用案例: 5.程序如何同用户交互:(Scanner) 6.赋值运算符: 7.算术运算符: 8.关系运算符 9.逻辑 ...

  2. 疯狂java(三)-数据类型和运算符(疯狂java第4版)

    文章目录 3.1 注释 3.1.1 注释分类 3.1.2 javadoc 3.1.3 包注释 3.2 标识符和关键字 3.2.1 分隔符. 3.2.2 Java标识符规则 3.2.3 Java关键字 ...

  3. Java程序设计语言基础02:Java中的基本数据类型和运算符

    目录 1. Java中的基本数据类型 1.1 概述 1.2 基本数据类型的值域 1.2.1 byte类型 1.2.2 short类型 1.2.3 int类型 1.2.4 long类型 1.2.5 fl ...

  4. Java第二章:数据类型和运算符

    今天刚上课,杨老师讲了进制之间的相互转换:16进制:1,2,3,4,5,6,7,8,9,A,B,C,D,E,F.已经掌握,就一笔带过! 十进制整数,如:99, -500, 0 八进制整数,要求以 0 ...

  5. java中的基本数据类型和运算符_【Java基础】基本数据类型和运算符

    基本数据类型: 数值型: 整型: ① byte,1byte = 8bit(8位),储存是有符号的,以二进制补码表示的整数. 最小值为-128,最大值为127,默认值为0. byte在大型数组中可以显著 ...

  6. java基础学习 --- 第二节 变量、数据类型和运算符

    java基础学习 - 第二节 变量.数据类型和运算符 一.变量 1.变量就是会发生改变的数据,程序运行时,这些数据以变量的形式被保存到计算机的内存中.如图 2.使用变量的步骤:     声明变量 - ...

  7. 《Java疯狂讲义》第3章(数据类型和运算符):博主李俊德的阅读笔记与知识拓展

    一.问题背景 博主在准备应聘的笔试.面试时,再次采用了多年以来的Java工具书<Java疯狂讲义>,并决定在每章详细复习后都要在博客中写下详细的阅读笔记. 二.阅读笔记与知识拓展--< ...

  8. java异或运算结果数据类型_java中的数据类型和运算符的总结归类。

    首先学习java肯定先要了解java的发展史,以及java的特点,常见的dos命令,jdk的安装,如何开发java程序等等一下概念行的东西,这里面我都不一一说了. 今天这一章主要想总结一下java中的 ...

  9. double类型怎么取余_数据类型和运算符

    数据类型和运算符 1.进制 1.1文件存储单位 ​ 任何数据在计算机中都是以二进制的形式存在的,二进制早期由电信号开关演变而来 . ​ 一个电信号或者一个二进制位统称为Bit位,8个Bit位为一组组成 ...

最新文章

  1. 【Android】Service几个重要的方法运行在哪个线程
  2. select * from table with(nolock)
  3. 第四十三节,文件、文件夹、压缩包、处理模块shutil
  4. 内蒙古银行银行招聘计算机研究生,内蒙古银行招聘公告
  5. 基本线程同步(三)在同步的类里安排独立属性
  6. 电视机原理图_电工电气,如何看电气原理图和接线图,如何设计图纸?
  7. 自定义注解 相关知识汇总(转)
  8. Andrew Ng Machine Learning 专题【Logistic Regression amp; Regularization】
  9. 基于SourceTree 下的 Git Flow 模型
  10. Answer 3.0 .NET开源网站功能API说明
  11. 区块链基础:交易模型解读
  12. F28335第十篇——增强型捕获模块(eCAP)
  13. 数据预处理 拉依达准则 matlab,数学建模数据预处理.doc
  14. .NET的那些事儿(9)——C# 2.0 中用iTextSharp制作PDF(基础篇) .
  15. SQL_Injection_Base_by_Silic读书摘要
  16. 移动安全测试框架MobSF(二):动态分析
  17. JSON-spirit用法
  18. Python 数据分析之Numpy
  19. spark文本处理-文章分类
  20. Mairadb数据库的备份和恢复

热门文章

  1. MySQL自定义函数的方式
  2. android平板装虚荣windows,纠结!两款优秀的二合一平板的艰难选择
  3. python可视化数据分析-python做可视化数据分析,究竟怎么样?
  4. 南京航天航空大学计算机专业考研科目,2020南京航空航天大学计算机考研初试科目、参考书目、招生人数汇总...
  5. 元宇宙时代 理查德数和哥德尔数——哥德尔读后之二十一
  6. Keil 无法识别JLink,程序无法下载,多台电脑keil版本兼容
  7. 【电科复试第一名】23上交819考研经验分享
  8. FreeSwitch Sofia模块加载过程
  9. 服务器win7系统能搭建手游吗,如何判断自己的Win7系统能否玩吃鸡游戏?
  10. 浏览器 和 服务器端长连接的实现方法 (Polling, Comet, Long Polling, WebSocket)