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

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 ;// 9223372036854775807

 longMax += 1;// ought to be 9223372036854775808

 System.out.println(longMax);// overflow :print -9223372036854775808

 BigInteger 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 -Infinity
		System.out.println((c/0));//print Infinity
		System.out.println(Math.sqrt(b));//print NaN
	}
}


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



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值