标识符
标识符就是一个名字。区分大小写。
语法规则
- 由字母、下划线、美元符号、数字组成,长度不受限制。
- 第一个字符不能是数字字符。
- 不能是关键字。
- 不能是true、false、null。
基本数据类型
Java有8种基本数据类型。
逻辑类型
boolean(布尔类型)
- 常量:true、false
- 变量:使用关键字boolean来声明逻辑变量,声明时可以赋初值。
整数类型
128=2^7;
byte(-128~127)、short(-2^15~2^15-1)、int(-2^31~2^31-1)、long(-2^63~2^63-1)
- 变量:x,y,漂亮,width等。例如:
public class C
{
public static void main(String[] args)
{
int 漂亮=98;
System.out.println((char)65);
System.out.println(漂亮);
}
}
运行结果:
C:\Users\15939\Desktop>javac C.java
C:\Users\15939\Desktop>java C
A
98
- Java中不存在byte、short型常量的表示法。
- long型常量用后缀L来表示。例如:108L(十进制)、07123L(八进制)。
- Java中没有无符号的byte、short、int、long。unsigned int m;是错误声明。
- 变量:L加不加都不影响运行结果。(我认为还是加上吧)
long width=12L,height=2005L;
字符类型
char
- 内存x中存储的是97,97是字符a在Uniclode表中的排序位置。
char x='a';
等价于
char x=97;
- 有些字符(如回车符)不能通过键盘输入到字符串或程序中,需用到转义字符常量,例如:\n(换行),\b(退格),\t(水平制表),\'(单引号),\"(双引号),\\(反斜线)等。
char ch1='\n',ch2='\"',ch3='\\';
- 字符串" 我喜欢使用字符串\" "中含有双引号字符。字符串" 我喜欢使用字符串" "是一个非法字符串。
- 显示字符在Unicode表中的顺序位置,用int型类型转换,如(int)'A'。
public class C
{
public static void main(String[] args)
{
System.out.println((int)'A');
}
}
C:\Users\15939\Desktop>javac C.java
C:\Users\15939\Desktop>java C
65
- 显示0-65 535之间的一个数所代表的Unicode表中相应位置的字符,用char型类型转换,如(char)65。
public class C
{
public static void main(String[] args)
{
System.out.println((char)65);
}
}
C:\Users\15939\Desktop>javac C.java
C:\Users\15939\Desktop>java C
A
- Java中char型数据一定是无符号的,不允许使用unsigned修饰声明的变量。
- 在 Java 中,可以使用 Unicode 表中字符排序位置的十六进制转义来表示该字符。这种表示方式被称为 Unicode 码点( Unicode code point)。
- Unicode 码点是一个 32 位的整数,它表示了 Unicode 表中某个字符的位置。每个 Unicode 字符在 Unicode 表中都有一个唯一的码点。
- 例如,字母 'A' 的 Unicode 码点是 0x0041,字母 'B' 的 Unicode 码点是 0x0042,以此类推。可以使用十六进制转义来表示这些 Unicode 码点,例如:
'\u0041' 表示字符 'A'
'\u0042' 表示字符 'B'
- 在 Java 中,可以使用字符常量或字符串字面量来表示 Unicode 码点。例如:
char c = '\u0041'; // 表示字符 'A'
String s = "'\u0041'"; // 表示字符串 "A"
- 需要注意的是, Unicode 码点是一个整数,而不是字符。因此,在使用 Unicode 码点时,需要进行类型转换,将其转换为对应的字符类型。例如
char c = (char)0x0041; // 将 Unicode 码点 0x0041 转换为字符 'A'
浮点类型
float(单精度)、double(双精度)
- float常量后面必须有有后缀f或F。
- float型数据保留8位有效数字。
- double型数据保留16位有效数字。
- 比较float型数据和double型数据时必须注意数据的实际精度。例如:
float x=0.4f; double y=0.4; 实际存储在x中的数据是(这里我们把小数点保留16位)0.4000000059604645, 存储在y中的数据是0.4000000000000000。 因此,y<x
类型转换运算
- 按精度从低到高排列: byte short char int long float double
- 把级别低的变量赋值给级别高的变量,系统自动完成数据类型转换。
- 把级别高的变量赋值给级别低的变量,必须使用类型转换运算。例如:
格式: (类型名)要转换的值;
int x=(int)34.89;
long y=(long)56.98f;
int z=(int)19L;
- 当把一个int型常量赋值给一个byte、short和char型变量时,不可超出这些变量的取值范围,否则必须进行类型转换运算。例如,常量128属于int型常量,超出byte变量的取值范围,如果赋值给byte 型变量,必须进行byte 类型转换运算(将导致精度的损失),如所示:
byte a = (byte)128; 溢出一位
byte b =(byte) (-129); 溢出一位
运行结果:
a=-128 byte的取值范围是-128~127
b=127 溢出的部分对应另一端倒序相应位数
- 一个常见的错误是,在把一个 double型常量赋值给float 型变量时没有进行类型换运算,例如:
float x = 12.4;
将导致语法错误,编译器将提示“possible loss of precision”。正确的做法是:
float x = 12.4F;
或
float x = (float)12. 4;
输入基本型数据
Scanner是一个类,用它创建对象reader,对象reader调用nextBoolean(),nextByte(),nextShort(),nextInt(),nextLong(),nextFloat(),nextDouble()等方法,读取命令行输入的数据。例如:
import java.util.Scanner;
public class Example2_3
{
public static void main (String args[ ])
{
Scanner reader=new Scanner(System.in);
double sum=0;
double x = reader.nextDouble();
while(x!=0)
{
sum=sum+x;
x=reader.nextDouble();
}
System.out.printf("sum=%10.5f\n",sum);
}
}
C:\Users\15939\Desktop>javac C.java
C:\Users\15939\Desktop>java C
3
4
5
0
sum=12.00000
输出基本数据类型
- 有三种输出方式:
- System.out.print(" "+" ");//不可换行
- System.out.println(" "+" ");//可换行
- System.out.printf("sum=%10.5f\n",sum);//和C语言输出格式类似
- %f:小数部分最多保留6位。
- 输出字符串常量时,不能出现回车
错误写法:System.out.println("你好,
很高兴认识你");
正确写法:System.out.println("你好,"+
"很高兴认识你");
数组
- 数组通过数组名和索引来使用数组元素。数组变量即数组名,数组变量中存放着数组的首元素的地址。
- 数组属于引用型变量,创建数组分两步:声明数组、为数组分配变量。
声明数组
- 声明一维数组有两种格式: float boy[ ]; float [ ] boy;
- 声明二维数组有两种格式: float boy[ ][ ]; float [ ][ ] boy;
- Java不允许在声明数组中的方括号内指定数组元素的个数。即int a[12]是错误的。
为数组分配元素
- 格式:数组名=new 数组元素类型[数组元素个数];(创建数组) boy=new float[4]; boy=new float[ ][ ];
- 声明数组、创建数组、给元素一个初始值,可以一起完成,创建数组后,系统会给数组的每个元素一个默认值。
- Java采用“数组的数组”声明多维数组。构成多维数组的一维数组不必有相同的长度。 int a[ ][ ]=new int[3][ ];//没为3个一维数组分配元素,要创建a的3个一维数组。 a[0]=new int[6]; a[1]=new int[12]; a[2]=new int[8];
- Java允许使用int型变量的值指定数组元素的个数,例如 int size=30; double number[ ]=new double[size];
length
数组元素的个数 = 数组的长度 = 数组名.length = 二维数组含有的一维数组的个数。 float a[ ][ ]=new float[12];
float b[ ][ ]=new int[3][6];
a.length的值是12;a.length的值是3。
数组的引用
相同类型的两个数组具有相同的引用,则它们具有相同的元素。
public class Example2_4
{
public static void main(String args[])
{
int a[]={1,2,3,4};
int b[]={100,200,300};
System.out.println("数组a的元素个数="+a.length);
System.out.println("数组b的元素个数="+b.length);
System.out.println("数组a的引用(带前缀信息)"+a);
System.out.println("数组b的引用(带前缀信息)"+b);
a=b; //将b的值赋值给a
System.out.println("数组a的元素个数="+a.length);
System.out.println("数组b的元素个数="+b.length);
System.out.println("a[0]="+a[0]+",a[1]="+a[1]+",a[2]="+a[2]);
System.out.print("b[0]="+b[0]+",b[1]="+b[1]+",b[2]="+b[2]);
}
}
C:\Users\15939\Desktop>javac C.java
C:\Users\15939\Desktop>java C
数组a的元素个数=4
数组b的元素个数=3
数组a的引用(带前缀信息)[I@15db9742
数组b的引用(带前缀信息)[I@6d06d69c
数组a的元素个数=3
数组b的元素个数=3
a[0]=100,a[1]=200,a[2]=300
b[0]=100,b[1]=200,b[2]=300
对于char型数组a,System.out.println(a);会输出数组a的全部元素。 System.out.println(" "+a);才会输出char型数组的引用。
应用举例:折半法
用折半法判断一个数据是否在一个数组里
import java.util.Arrays;
import java.util.Scanner;
public class Example2_5 {
public static void main(String args[]) {
int start=0,end,middle;
int a[] = {12,45,67,89,123,-45,67};
int N = a.length;
int minIndex = -1;
for(int i=0; i<N-1; i++) { //选择法排序数组
minIndex = i;
for(int j = i+1; j <= N-1;j++){
if(a[j] < a[minIndex]){
minIndex = j;
}
}
if(minIndex!=i){
int temp = a[i];
a[i] = a[minIndex];
a[minIndex] = temp;
}
}
System.out.println(Arrays.toString(a));
Scanner scanner = new Scanner(System.in);
System.out.println("输入整数,程序判断该整数是否在数组中:");
int number = scanner.nextInt();
int count =0 ;
end = N;
middle=(start+end)/2;
while(number!=a[middle]){
if(number>a[middle])
start=middle;
else if(number<a[middle])
end=middle;
middle=(start+end)/2;
count++;
if(count>N/2)
break;
}
if(count>N/2)
System.out.printf("%d不在数组中.\n",number);
else
System.out.printf("%d在数组中.\n",number);
}
}