第三章Java基本语法
3.1 标准输入输出流
3.1.1 标准输出输入流
System.in:标准输入流
System.out:标准输出流
System.err:标准错误输出流
3.1.2 标准输出流重定位
一般的输出会默认在命令行模式、终端机输出,可是在执行程序时使用将输出结果定位至指定的文件即可。
java HelloJava > HelloJavaResult.txt
3.2 基本数据类型
整形{short(2个字节)、int(4个字节)、long(8个字节)}
字节型{byte(-128~127,1个字节)}
浮点数{float(4个字节)、double(8个字节)}
字符{char(2个字节)}:Java的字符采用Unicode编码。
3.3 逻辑和位运算
3.3.1 逻辑运算符
且(&&) 或(||) 取反(!)
3.3.2 位运算符
Java中存在4种位运算符&、|、^,分别对应数字设计上的AND(且)、OR(或)、XOR(异或)
位运算执行表
&(AND)
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
|(OR)
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1
^(XOR)
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 1
~(补码)
~运算的结果=原数取反-1,例如
~2 = -3
~0 = -1
~-2 = 1
Java中的位运算是逐位运算的
例如10010001 &01000001计算过程
10010001
& 01000001
00000001
Java对基本数据类型进行位运算是先把该数据转换成二进制然后再逐位运算的。
例如11&12,11的二进制为00001011,12的二进制为00001100
00001011
& 00001100
00001000
所以11&12=8
位运算反应了Java模运算的本质,加减乘除的本质也是通过位运算来实现的。
位运算如果用的恰当,可以提高程序的运算效率,例如利用位运算判断用户输入是否为整数。
package 语法入门;
import java.util.Scanner;
public class OddDecider {
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.println("请输入数字:");
int number = input.nextInt();
System.out.println("是否为奇数?"+((number&1)!=0?"是":"否"));
}
}
奇数转换成二进制后末位数必定为1,偶数转换成二进制后末位数必定为0,1&奇数必定为1,1&偶数必定为0。
^运算可用于字符加密。
例如
package 语法入门;
public class XorCode {
public static void main(String[] args) {
char ch = ‘A‘;
System.out.println("编码前:" + ch);
ch = (char) (ch ^ 9);
System.out.println("编码后:" + ch);
ch = (char) (ch ^ 9);
System.out.println("解码:" + ch);
}
}
运行结果:
图3.2.1 ^运算实现的加密
^运算可以加密原因是它可以通过一个整数来加密和解密,这个技术可用于密码转码保存。
在位运算上,Java还有左移(<<)和右移(>>)两个运算符。
左移运算会将所有的位向左移指定的位数,左边被挤出去的位会被丢弃,而右边会补上0;
右移运算会将所有的位向右移指定的位数,右边被挤出去的位会被丢弃,而左边会补上0;
上述的左移右移都是基于二进制的,如果没有非0位被挤出去的情况下,左移相当于乘上2的指定次方,右移相当于除上2的指定次方。
第四章认识对象
4.1 简单地使用对象
在理解对象前,你可以先试用一下,就像买衣服前你可以试穿一下。J2SE提供了很多的“试穿”的工具,这些工具在使用的时候就需要先变成你将要了解的对象。举个简单的例子,如果想写一个程序取得现在的系统时间,只要产生一个java.util.Date工具就可以了。
package 语法入门;
import java.util.Date;
public class NowTime {
public static void main(String[] args){
Date date = new Date();
System.out.println(date.toString());
}
}
运行结果:
图4.1使用Date工具
4.2 打包(Wrap)基本数据类型
在Java中基本数据类型(如int、long、double、float、boolean等)并不是对象,它们只是纯粹的数据,除了数值本身的信息之外,基本数据类型都不带有其他的信息或可操作的方法。
在J2SE 5.0之前,如果想要让基本数据类型像对象一样操作,即让基本数据类型带有其他信息和可操作的方法,那么要使用Long、Integer、Double、Float、Boolean、Byte等类来打包基本数据类型。
例如
Int a = 10;
Integer wrappedA = new Integer(a);
a是一个基本数据类型,通过new Integer(a)方法的打包后wrapedA便是带有一些方法的对象,例如可以使用wrappedA.doubleValue()获取wappedA的双精度数值。
4.3 自动装箱(autoboxing)和拆箱(unboxing)
4.3.1 autoboxing
自动装箱和拆箱是为了简便化打包基本数据类型,例如将int包装为一个Integer对象:
Integer a = newInteger(10);
这种打包方式可以改为:
Integera = 10;
这种简化的打包方式便是autoboxing。
看到这里你会不会有这样的疑问:为什么可以不用构造方法创建一个对象?
这其实是编译器帮了你一把。在进行编译时,编译器再自动根据你写下的语句,判断是否进行自动装箱动作。
自动装箱运用的方法还可以如下:
int i = 10;
Integer integer = I;
也可以使用更一般化的java.lang.Number类来自动装箱。例如:
Number number = 3.14f;
3.14f会先被自动装箱为Float,然后指定给number。
4.3.2 unboxing
unboxing是autoboxing的逆过程,autoboxing是将基本数据转换成对象,但是转换而成的对象是无法直接执行基本数据类型的运算的,这时便需要拆箱,将对象重新转换成基本数据,例如:
Integer i = 1;
System.out.println(i+10);
System.out.println(i++);
上例中会显示20与10,编译器会自动进行自动装箱与拆箱,也就是10会先被装箱,然后在i+10时会先拆箱,进行加法运算
4.3.3 小心使用boxing
自动装箱与拆箱的功能事实上是编译器来帮你的忙,编译器在编译时期一句你所写的语法,决定是否进行装箱或拆箱动作。例如:
Integer i = 100;
相当于编译器自动为您作以下的语法编译:
Integer i = new Integer(100);
必须得注意这个语法,不然的话很可能会出错,比如:
Integer I = null;
Int j = I ;
这样的语法在编译时期是合理的,但是在运行时期会有错误,因为这种语法相当于:
Integer I =null;
Int j = i.intValue;
两个相同大小的基本数据装箱后的对象在进行比较运算时会拆箱,例如
public class AutoBoxingDemo {
public static void main(String[]args){
Integer i1 =100;
Integer i2 =100;
if(i1 == i2)
System.out.println("i1 == i2");
else
System.out.println("i1 != i2");
}
}
你认为结果是什么?