2.1 Java语言的特点
1、Java是一种简单的、面向对象的、分布式的、解释的、健壮的、安全的、可移植的、多线程的、动态的语言.
Java语言的特点:简单性、面向对象、分布性、健壮性、体系结构中立、安全性、解释性、可移植性、高性能、多线程、动态性、类库。
Java保留了和C、C++相同的变量声明、参数传递、操作符、流控制等,去掉了指针、预处理、Goto、类型转换、内存管理、全 局变量的定义等难学的地方。
1、指针
指针是C、C++中最灵活,也是最不容易掌握的数据类型。Java对指针进行完全的控制,程序员不能直接进行任何指针操作。例如把整数转化为指针、或者通过指针释放某一内存地址。
数组作为类在Java中实现,解决了数组下标越界的问题,直接报错。
2、预处理
C、C++使用宏定义,而Java不支持宏,它通过关键字final来声明一个常量,来实现宏定义中广泛使用的常量定义。
3、goto
Java不支持C、C++的goto语句,而是使用try、catch、final.
4、类型转换
在类型转换时进行类型相容性检查
5、释放内存
Java中,所有的数据结构都是对象,同过运算符new为它们分配内存堆,Java自动管理内容并进行回收。
6、全局变量的定义
Java中,不能在所有类之外定义全局变量,只能在一个类中定义公用的、静态的变量来实现一个全局变量。
java 全局变量 - Google Search
//在类GlobalVar中定义变量global_var ,定义并赋值变量s,定义常量ss.
class GlobalVar{
public static global_var;
public static String s="abc";
public static final String ss="def";
}
使用:
//其他类可以访问和修改该变量
public class test{
System.out.println(GlobalVar.s);
GlobalVar.global_var="testtest";
}
例子:
class GlobalVar{
public static int a=99;
}
public class app{
public static void main(String[] args){
System.out.println("hello world"+(GlobalVar.a+1));
}
}
输出:hello world100
7、数据类型的长度
在Java中,数据类型都是固定长度的位数,例如int型,占用32位。
8、头文件
Java不支持头文件,类成员的类型和访问权限都封装在一个类中,运行时系统对访问进行控制,防止对私有成员的操作。在Java中使用import语句来与其他类进行通信。
2.2 Java的数据类型
java的数据类型和其他语言很相似,分为简单数据类型和复合数据类型。简单数据类型是Java语言自己定义的数据类型,用户不能修改;复杂数据类型由用户定义,有简单数据类型组成。
2.2.1 简单类型
数据类型指的是一组性质相同的值的集合,以及定义这个集合的一组操作的总称。
Java的简单数据类型包括:字符型、整数、浮点数和布尔型。
1、字符型
关键字char,占用16位,范围是0~65535.
语法:
char c='c'; //声明一个变量,类型为char,变量名为c,赋初值为'c';
public class app{
public static void main(String[] args){
char c='c';
System.out.println((char)(97)+"===="+(char)(65));
}
}
输出:a====A
2、整型
Java的整型表示形式有三种:
1、十进制整数:123,-456,0
2、八进制整数,以0开头:0123表示十进制123.
3、十六进制整数,以0x或0X开头:如0x123表示十进制291.
关键字byte(8位,表示数据),short(16位,很少使用),int (32位,表示数范围:-2^31~2^31-1),long(64位)
3、浮点型
Java的浮点型表示形式有两种:
1、十进制数格式:123、0.123、123.0
2、科学计数法形式:123e3、123e-5.
浮点型:
float(32位),double(64位)。
语法:
float f;//指定变量f为float型
double d;//指定变量d为double型。
注意:和C、C++不同,Java没有无符号型整数,而且明确规定了整型和浮点型所占的内存字节数。
4、布尔型
布尔型数值只有true和false。
boolean b=true; //定义b为布尔型变量,且初值为true .
2.2.2 数组
数组是一系列对象或者基本数据类型的集合,数组中的每个元素都具有相同的数据类型。数组分为一维数组和多维数组。
1、一维数组
一维数组可以看成一个线性表。
int arr[];
int arr[]={1,2,3,4};
Java可以将一个数组用‘=’可以赋值给另一个数组。
public class app{
public static void main(String[] args){
int ar[]={1,2,3,4,5};
int arr[];
arr=ar;
for(int i=0;i<arr.length;i++){
arr[i]++;
}
for(int i=0;i<ar.length;i++){
println("ar["+i+"]="+ar[i]);
}
}
static void println(String s){
System.out.println(s);
}
}
问题:1、对数组arr的修改为什么会同步到数组ar上?
解答:Java的数据类型分为两类,基本类型:byte、short、int、long、char、float、double、boolean,引用类型:String、Array、Object.
这里的ar是数组的引用地址,因此进行赋值操作后,arr和ar指向的是相同的内存地址。
2、多维数组
1、直接为每一维分配空间
int ar[][]=new int[2][3];
2、从最高位开始,分别为每一维分配空间。
int a[][]=new int[2][];
a[0]=new int[3];
ar[1]=new int[3];
3、定义的时候开始初始化
int arr[][]={{1,2,3},{4,5,6}};
public class app{
public static void main(String[] args){
int arr[][]={{1,2,3},{4,5,6}};
println(arr[0][1]+"");
}
static void println(String s){
System.out.println(s);
}
}
输出:2
2.3 运算符
2.3.1 算术运算符
一元运算符
运算符 | 用法 | 描述 |
+ | +num | 正值 |
- | -num | 负值 |
++ | i++ | 返回i,i自增1 |
++ | ++i | 返回i+1,i自增1 |
-- | i-- | 返回i,i自减1 |
-- | --i | 返回i-1,i自减1 |
二元运算符
运算符 | 用法 | 描述 |
+ | num1+num2 | 加 |
- | num1-num2 | 减 |
* | num1*num2 | 乘 |
/ | num1/num2 | 除 |
% | num1%num2 | 取模(求余) |
2.3.2 位运算符
位运算符用来对二进制位进行操作。除按位取反“~”以外,其他均为二元算术运算符。
位运算符
运算符 | 用法 | 描述 |
~ | ~num | 按位取反 |
& | num1&num2 | num1和num2按位与 |
| | num1|num2 | num1和num3按位或 |
^ | num1^num2 | num1和num2异或 |
<< | num1<<num2 | num1左移num2位 |
>> | num1>>num2 | num1右移num2位 |
>>> | num1>>>num2 | num1无符号右移num2 |
1、补码
Java使用补码表示二进制数。在补码中,最高位为符号位,正数的符号位为0,负数的符号位为1.
正数:最高位为0,例如+42的补码为00101010
负数:最高位为1,将它的绝对值按位取反加1,即为该数的补码。例如-42的补码为11010110.
0的补码是唯一的,为00000000,而在原码、反码中,+0和-0的表示不是唯一的。
2、按位取反
~0010101按位取反结果:1101010
3、按位与运算符
00101010&00010111=00000010
按位与可以将某些特定为清0;
例如:对数11010110的第2位和第5位清0
11010110&11101101=11000100
按位与可与取某个数中某些指定的位;
例如:取11010110的第2位和第5位
11010110&00010010=00010010.
4、按位或运算符
11100110|00011000=11011110
5、按位异或运算符
00101010^00010111=00111101
按位异或可以使特定位取反。
例如:对数11010110的第4、5位取反。
11010110^00011000=11001110
按位异或可以实现两个数的交换而不是用临时变量
int a=2,b=3;
a=a^b;
b=b^a;
a=a^b;
6、左移运算符<<
例如:a=a<<2; 使a的各二进制位左移2位,右补0.若a=00001111,则a<<2=00111100.左移一位相当于*2;
7、右移运算符>>
例如:a=a>>2; 使a的各二进制位右移2位,移到右边的低位舍弃,缺失的高位取原先的值。右移一位相当于除2取商
如a=00110111,进行a=a>>2,a=00001101.
如b=11010011, 进行b=b>>2,b=11110100.
8、无符号右移运算符>>>
和右移运算符不同的是缺失的高位取0
如a=00110111,a=a>>>2, a=00001101;
如b=11010011,b=b>>>2, b=00220200;
2.3.3 关系运算符
关系运算符用来比较两个值,返回布尔类型true或false,关系运算符都是二元运算符。
关系运算符包括:> >= < <= == !=
public class app{
public static void main(String[] args){
Integer n1=new Integer(2);
Integer n2=new Integer(2);
println((n1==n2)+"");
}
static void println(String s){
System.out.println(s);
}
}
输出:false
如前文所说,Java数据类型分为简单类型和引用类型。这里的n1和n2就是两个对象的引用地址。
2.3.4 布尔逻辑运算符
布尔逻辑运算符有3个:&&、||和!
import java.util.*;
public class app{
public static void main(String[] args){
Random rand=new Random();
int i=rand.nextInt()%100; //随机生成100以内的整数(范围[-100,100),包括负整数、正整数)
int j=rand.nextInt()%100;
println("i="+i);
println("j="+j);
println("i>j is"+(i>j));
println("(i<10)&&(j<10) is"+((i<10)&&(j<10)));
}
static void println(String s){
System.out.println(s);
}
}
输出:
i=99
j=29
i>j istrue
(i<10)&&(j<10) isfalse
2.3.5 赋值运算符
赋值运算符用于把一个数值赋予给一个变量。赋值运算符两边的类型不一致时,如果左边的数据类型的级别高,则右边的数据将被转换左边的数据类型,然后赋值给左边的变量。否则需要进行强制类型转换。
赋值运算符
运算符 | 用法 | 等效表达式 |
+= | num1+=num2 | num1=num1+num2 |
-= | num1-=num2 | num1=num1-num2 |
*= | num1*=num2 | num1=num1*num2 |
/= | num1/=num2 | num1=num1/num2 |
%= | num1%=num2 | num1=num1%num2 |
&= | num1&num2 | num1=num1&num2 |
|= | num1|=num2 | num1=num1|num2 |
^= | num1^=num2 | num1=num1^num2 |
>>= | num1>>=num2 | num1=num1>>num2 |
<<= | num1<<=num2 | num1=num1<<num2 |
>>>= | num1>>>=num2 | num1=num1>>>num2 |
2.3.6 条件运算符 conditional operator
例子:max=(a>b)?a:b;
2.3.7 运算符优先级
2.4 条件语句
if(expression){
statement;
}
或者
if(expression){
statement;
}else{
statement;
}
或者
if(expression){
statement;
}else if(expression){
statement;}else{
statement;
}
例子:
import java.util.*;
public class app{
public static void main(String[] args){
Random rand=new Random();
int i=rand.nextInt(3000)%3000; // 随机生成3000以内的整数(范围[0,3000))
if(i%400==0||(i%4==0&&i%100!=0)){
System.out.println(i+"是闰年");
}else{
System.out.println(i+"不是闰年");
}
}
}
2.5 循环语句
循环语句的作用是反复执行一段代码,直到满足终止循环的条件为止,一个循环一般包括4个部分。
- 初始化部分(initialization):用来设置循环的一些初始条件,如计数器清零等
- 循环体部分(body):这是反复循环的一段代码,可以是单一的一条语句,也可以是复合语句
- 迭代部分(interation):这是在当前循环结束,下一次循环开始前执行的语句,常常用来使计数加1或减1
- 终止部分(termination):通常是一个布尔表达式,每一次循环都要对该表达式求值,以验证是否满足循环终止条件
Java中提供的循环:while、do-while、for
2.5.1 while循环
while(expression){
statement;
}
2.5.2 do-while循环
do{
statemtn;
}while(expression)
2.5.3 for循环
for(expression;expression1;expression2){
statement;
}
expression是初始化语句,这个语句在循环开始前执行,这部分通常执行给循环技术变量赋初值等初始化操作;expression1是循环结束条件;expression2在每一次循环结束后调用。这三部分之间由 ; 隔开,每部分都可以是空语句,但是分号不能省略。初始化、终止和迭代部分均为空时,相当于一个无限循环。例如:for(;;){statement;}
for语句执行时,首先执行初始化操作,然后判断终止条件是否满足,如果满足,则执行循环体中的语句,最后执行迭代部分。完成一次循环后,重新判断终止条件。
例子:
public class app{
public static void main(String[] args){
for(int i=1,j=i+10;i<5;i++,j=i*2){
System.out.println("i="+i+",j="+j);
}
}
}
输出:
i=1,j=11
i=2,j=4
i=3,j=6
i=4,j=8
2.5.4 循环退出语句
循环体部分,可用break、return、continue控制循环的流程。
- break用于强行退出循环,不执行循环中剩余的语句。
- return语句从当前的方法退出,返回到调用该方法的语句处,并从紧跟该语句的下一条语句继续程序的执行
- continue则停止执行当前的反复,然后退回至循环起始处,开始新的反复。
1、break语句
public class app{
public static void main(String[] args){
int i=0;
while(true){
if(i>=5){
break;
}
System.out.println("i="+i);
i++;
}
}
}
输出:
i=0
i=1
i=2
i=3
i=4
2、return语句
作用:
1、return expression
返回一个值给调用该方法的语句,返回值的数据类型必须和方法声明中的返回值类型一致,可使用强制类型转换。
2、return
将return嵌入到某些语句中,例如if-else,来使程序在未执行方法中的所有的语句时退出。
3、continue语句
public class app{
public static void main(String[] args){
for(int i=0;i<5;i++){
if(i==2){
continue;
}
System.out.println(i);
}
}
}
输出:
0
1
3
4
2.6 分支语句
语法:
switch(expression){
case value1:statement;break;
case value2:statement;break;
...
default:statemtn;
}
expression可以返回任一简单类型的值,如整数、字符型,case子句中的value1必须为常量。
public class app{
public static void main(String[] args){
int month=2;
int year=2014;
int numDays=0;
switch(month){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:numDays=31;
break;
case 4:
case 6:
case 9:
case 11:numDays=30;
break;
case 2:
if((year%400==0)||(year%4==0&&year%100!=0)){
numDays=29;
}else{
numDays=28;
}
break;
}
System.out.println("Number of Days="+numDays);
}
}
输出:
Number of Days=28
2.7 Java的强制类型转化
2.7.1 简单数据类型的强制转化
高位数据转换成低位数据,需要用到强制类型转换。
int i;
byte b=(byte)i; //把int型变量i强制转换为byte型