02Java的基本语法
1、常量与变量
程序执行中值不会变化的为常量,会变化的为变量。如定义一个常量PI,表示圆周率,圆周率不会改变;定义一个变量stuNo,表示学号,学号则会根据学生的改变而相应的改变。
2、Java中的标识符
标识符是用来给类,变量、常量进行取名字的符号。定义标识符具有一定的规则,规则如下:
大小写敏感;
支持字母数字下划线及$;
数字不能放在首位,即不能做首字符;
长度无限制;
不能是Java关键字;
支持中文,但不建议;
所有类的类名已经是标识符(String)。
同时,对标识符也具有一定的命名规范,针对不同的Java标识符,其规范不尽相同:
类名,接口名:每个单词的首字母应该大写,尤其第一个单词的首字母应该大写。(驼峰规则)。如class HelloWorld,Interface Animal
方法、属性、变量::第一个单词首字母应小写,其他单词首字母大写。如String empNo;void setName(String name);
常量:全部用大写字母表示。如果由几个单词组成,则由下画线连接。public final int PI;public final int HEAD_COUNT;
包: 全部用小写字母。如:package cn.onlylove.domain
标识符示例3、Java中的关键字
3个保留字:true,false,null
50个关键字。
4、Java中的注释
良好的编程规范中,注释必须写上,以便其他人阅读、引用和维护。
单行注释 //...
多行注释 /* ....*/,多行注释不支持嵌套。
文档注释 /** ... */
可以通过使用JDK的javadoc工具从原文件中将文档注释抽取出来,从而形成帮助文档。如JDK的API文档。
5、Java中的注释
Java是一种强类型语言,意思是说在程序的开发过程中,如果要使用某个变量,必须先对该变量进行声明。Java中对变量的声明,需要使用相应的数据类型,Java中数据类型分为2种:基本数据类型与引用数据类型。
首先看一下Java中的引用类型。所有的类,所有的接口,所有的数组,枚举,标注。都是引用类型。
基本数据类型总计8种,按照存储的是字符、整数、浮点数、布尔值分为4类。如下图所示:
Java基本数据类型-->布尔型boolean
java中boolean只有true和false两个值,代表真和假。定义方法如下:
boolean isExist=true;
对一个变量进行第一次赋值的操作叫作对变量的初始化。
boolean的作用:
1、作为条件判断
2、只有两种状态的时候作为条件的区分。
-->字符型char
字符类型用来存储单个字符,占用16位2个字节的内存空间,因为char类型占用16位,因而其至多可以定义2的16次方个字符, 同时因为其也是占用两个字节,因此也可以将单个中文汉字定义为char类型。对char类型的变量进行初始化时需要在其值的两边用单引号括起来,定义方法如下:
char a=’a’;//正确
char a=’你’;
char a=’ab’;//错误
也可以将0-65535范围内的整数定义为char变量,JVM将根据ASCII码转换为对应的字符。
char a=97;//如果输出,将输出字符a
-->整数型
了解整数类型之前,先需要了解计算机中的各类数字进制表现形式:
二进制:只有1和0两个值
八进制:0开头。由0-7表示。
十进制:正常显示,即日常使用的数字类型。不能以0开头(0除外)。
十六进制:0x或者0X开头。0-9由数字表示,10-15由a-f表示。
进制间的转换:
学会各类进制与十进制之间的转换,则各种之间也就明了了。
二进制与十进制的转换。
二进制111则表示为1*22+1*21+1*20=4+2+1=7(2的平方,2的1次方,2的0次方)
八进制与十进制的转换。
八进制01011=1*83+0*82+1*81+1*80=512+0+8+1=521(8的立方,8的平方,8的1次方,8的0次方)
八进制031=3*81+1*80=25(8的1次方,8的0次方)
十六进制与十进制的转换
十六进制0X25=2*161+5*160=32+5=37(16的1次方,16的0次方)
十六进制0Xb01e=b(11)*163+0*162+1*161+e(14)*160=45056+0+16+14=45086
重点只要会二进制与十进制互转即可。
网上有个段子,说是一个程序员522那天送花给女朋友,被拒绝了。通过心算后得出
522=5*16平方+2*16的1次方+2*16的0次方=1280+32+2=1314得出522是程序员的情人节。之后把花扔了,觉得女方配不上这么聪明的男人。
整数型数据类型根据所占内存大小不同分为byte,short,int,long。(在内存中的二进制表示时所有的第一位均做符号位 1负0正)。在代码中,整数型的默认类型是int,浮点型默认类型是double。
负数的二进制表示法:
原码,反码,补码。
-5如何表示?
5的二进制为:0000 0000 0000 0000 0000 0000 0000 0101,此为原码。
其反码为:1111 1111 1111 1111 1111 1111 1111 1010,此为反码。
补码为反码+1:1111 1111 1111 1111 1111 1111 1111 1011。这就是-5。
负数的表示即为对应的补码。
byte 8位;表示2的8次方个数:负2的7次方到正2的7次方减1
short 16位; 同上
int 32位 ;同上
long 64位; 同上
由于相应的数据类型只能取相应范围内的数值,因此,在定义变量并初始化时,若变量取值超出其相应范围,则会发生报错或者发生相应的强制类型转换。看如下代码
byte b=12;
byteb2=129;//false(超过范围)byte最大为127
char c1='a';
String s="a";
int i1=c1;//char 既能当字符也能当数字。
inti2=s;//false
String不能当数字用,因为它是一个引用,是个地址。
int i3=20;
b=i3;//false 变量和常量的区别。不能保证i3在byte范围内,因为i3可能会有改变,20永远是20,i3不一定。
--> 浮点型
float 32位
double 64位。
二者都是近似值。
单精度
float f=1.0//错误,默认为double
双精度。
二者的取值范围和精度是不同的 float的精度是6位有效数字,取值范围是10的-38次方到10的38次方,float占用4字节空间 double的精度是15位有效数字,取值范围是10的-308次方到10的308次方,double占用8字节空间。
--> 基本数据类型强制类型转换
double d1=1.0;
double d2=0.54;
float f;
f=(float)(d1-d2);
用于解决上面的问题。但仍然不要超过各类型的范围。上面成功的是自动类型转换。
所谓自动类型转换:
1、整数之间,小范围向大范围自动转换。
2、整数向浮点自动转。
3、范围以内的常数自动转。
问题:如下将输出什么?
byte b=(byte)128;
System.out.println(b);
答案:-127,为什么?
大类型转小类型时将截断Java中数字默认为Int类型,占32位。因此,在内存中128是如下表示:
0000 0000 0000 0000 0000 0000 1000 0000
在将128转换为byte类型时,只占8位。在内存中为
1000 0000 即为-127。
强制类型转换时,只截取当前位数内的字符进行截取。
6、运算符
-->赋值运算:=可以引申出来+=,-=,*=等等,。
int a = 5;
int b = 2;
double d = 5;
double d2= 5.1;
int i=10;
i+=3*5;//i=25,先计算右边,再与左边进行赋值运算
byte b1 = 2;
byte b2 = 3;
b1 += b2;// 赋值语句
b1 = (byte) (b1 + b2);// java把关于byte
short的运算都转成int以后再进行运算
练习:用Scanner输入一个秒级数字,将其转换成X小时X分X秒
Scanner sc=newScanner(System.in);
int time=sc.nextInt();
int h=time/3600;
int m=time%3600/60;
int s=time%3600%60;
System.out.println(h+"小时"+m+"分"+s+"秒");
sc.close();
-->算术运算符:+ = * / %
System.out.println(a+b);//7
System.out.println(b-d);//-3.0
System.out.println(a * b);//10
System.out.println(d / b);//2.5
System.out.println(d2 % b);//1.09999
System.out.println(d % b);//1.0
-->比较运算符:> >= < <= == !=。
int a=10;
int b=20;
System.out.println("a="+a+",b="+b+",那么:");
System.out.println("a>b:"+(a>b));//false
System.out.println("a=b:"+(a==b));//false
System.out.println("a
System.out.println("a!=b:"+(a!=b));//true
-->逻辑运算符:
短路运算:(且&& 或||),非短路运算:(且& 或 |)
短路运算中,当前面的一个表达式可以决定结果时,后面的语句将不再执行,非短路运算会继续判断后面的。因而短路运算其效率高于非短路运算。
int a=10;
int b=20;
boolean flag1=((a=5)>12)&&((b=3)>9);
System.out.println("flag1:"+flag1);//false
System.out.println(a);//5
System.out.println(b);//20,表明&&后面未执行
int a=10;
int b=20;
boolean flag1=((a=5)>12)&((b=3)>9);
System.out.println("flag1:"+flag1);//false
System.out.println(a);//5
System.out.println(b);//3,表明&后面的也执行了
-->位运算:& | ^
&(AND)|(OR) ^(XOR异或) ~(补码)按位取反=加1再取反(全1的补码是-1)。只要掌握好负数的内在占位情况就好计算。
int a=5&-4;//将5与-4进行与运算。
System.out.println(a);//4
//内存中格式为:
//5是 0000 00000000 0000 0000 0000 0000 0101
//-4是 1111 1111 11111111 1111 1111 1111 1100
//&结果 0000 0000 0000 0000 0000 0000 0000 0100
-->移位运算:
>>右移:全部向右移动,移到右段的低位被舍弃,最高位则移入原来最高位的值。右移N位相当于除以2n。
>>>无符号右移:同上,只是最高位变成0.因此负数的移位与>>有区别,正数与>>无区别。
<<左移:全部向左移动,右侧低位补0。
移位运算一般而言都是int类型(默认类型),因此,当移位位数超过32位时,取对32的求余即可。Java中默认理解为超过32位的移位无意义。
System.out.println(7 >> 2);
//00000111-->00000001 相当于7/(2*2)=1
System.out.println(7 >> 34);
// java移位时,先将移位数%32,此处34%32=2。由相当于7>>2
System.out.println(7 >> -30);
// 负数次数时,先加上32倍数,转成正数以后才移位
System.out.println(-7 >> 2);// -2
//负数的高位仍然是1
//1111 1111 1111 1111 1111 1111 1111 1001
//右移2位变成 1111 1111 1111 1111 1111 1111 1111 1110为-2
System.out.println(-7 >>> 2);
//无符号右移,最高位补为0
//右移2位,最高位补为0 0011 1111 1111 1111 1111 1111 1111 1110为1073741822
-->自增、自减运算 ++ --
++ 变量自增
--变量自减
i++相当于i=i;i+1;
++i相当于i=i+1;
int i = 2;
System.out.println(i++);//2
System.out.println(i);//3
int b = i++ + ++i;//3+5
System.out.println(b);//8
for(int j=0;j<10;j++){
i = i++;//i++;i=5;
}
System.out.println(i);//5
-->三目运算 ?:
int a = 3;
double b = 5.0;
//可以转换类型的就转换成同一类型
System.out.println((a>b)?b:a);//3.0
//不可以转换类型的就保持原有类型
System.out.println((a>b)?"ok":a);//3,早期版本可能不支持如此写法。
-->运算符的优先级:
=最低,其余根据需要添加相应的括号()即可。()最高。
7、控制语句
If(){}else{}
If(){}else if(){}
If(){……if(){}……}
int a = 3;
int b = 5;
if(a>b){//分支{}如果只有一个语句{}可以省略,但不建议。
System.out.println("a大");
}else if(a
System.out.println("b大");
}else{
System.out.println("a b相等");
}
三重以上的选择时,建议使用switch进行判断。
switch(变量){//变量类型固定:byte,short,char,int,enum,String.其中enum须在jdk5.0及以上,Sting需要jdk1.7以上。
case:break; //每一个case后面跟一个有限值,后面再跟语句,最后跟一个break;用break跳出语句。
default: //其它值,不在case中的任何一个。
}//有限的值(case)加上一个default;default如果放在最后,就不要加break;如果放在其它位置,则要加break;case后的值必须是常量。
//最后一个分支可以不加 break;除此之外其它的都要加break;
Scannersc = new Scanner(System.in);
System.out.println("请输入您的分数");
int y = sc.nextInt();
switch (y) {
case 5:
System.out.println("优");
break;
case 4:
System.out.println("良");
break;
case 3:
System.out.println("及格");
break;
case 2: // System.out.println("不及格"); break;
case 1:
System.out.println("重修");
break;
default:
System.out.println("输入错误");
break;
}
sc.close();
8、循环语句
程序执行到控制语句时,会有多个选择,选择哪一个取决于选择条件,选择完成后只会执行某一个条件下的语句,但循环是不一样的。
循环:反复做同一件事情的时候,如,打印1-10000;找出1-10000里面所有的奇数。
for/while/do while其中for/while是等价的。do while不同。
-->for
for( ; ; ){}小括号内是三段论,第一段循环变量(用于控制循环次数的变量)的声明和初始化。第二段放条件,第三段放循环变量的变化。大括号内书写循环体(反复执行的语句);
for (int i = 1; i <= 10; i++) {
System.out.println("i=" + i);
}
死循环:按中止按钮或者在控制台中按ctrl+c,或者ctrl+d结束循环。for(;;)
循环次数不定的循环:for(;;){循环语句; if(条件){break;}}。break可以跳出循环:
Scannersc=new Scanner(System.in);
for(;;){
Stringstr=sc.next();
if(str.equals("bye")) break;
System.out.println("你说:"+str);
}
//break后到这里,已经跳出循环。
sc.close();
练习
1、 用两种方式输出1-100内的奇数。
2、 做一个猜数据的小游戏,生成1-100的随机数,然后猜,用键盘输入int,提示输入的数字是更大还是更小,如果猜对就输出猜对了,并输出猜了几次并退出程式。
3、 打印一个图形,如下所示:
*
**
***
****
*****
4、 打印一个图形,第一行一个*,第二行3个*,第三行5个星,打印几行由系统输入决定。
5、 打印1-100里面的所有质数,所谓质数,即只可以被1和其本身整除的数字。
6、 打印九九乘法表。
7、 有36人,36块砖,男人每人能搬4块,女人每人搬3块,小孩2人搬一块,要求一次把所有的砖搬走。三类人都需要的前提下,问几个男人,几个女人,几个小孩?
Random rand=new Random();
int num=rand.nextInt(100)+1;
Scannersc=new Scanner(System.in);
int count=0;
for(;;) {
count++;//每进入一次循环,则统计一遍次数.
System.out.println("请输入一个数字:");
int guess=sc.nextInt();
//通过比较,判断所猜数字是否与系统数字一致
if(guess
System.out.println("小了");
}else if(guess>num) {
System.out.println("大了");
}else {
System.out.println("恭喜你,猜对了!总共猜了"+count+"次!");
if(count<5) {
System.out.println("你可以去买彩票了!");
}
break;//猜对后,结束循环退出程序.
}
}
sc.close();
-->break与continue的区别
break结束当前循环,continue结束当前这个变量所在的循环,继续下一变量的判断。
as: for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
if (i * j % 12 == 0) {
continue;//i*j=12的倍数时,不打印,继续下一循环。
}
if (i * j % 28 == 0) {
break;//i*j=28的位数时,退出当前里面的这个for循环
}
if (i * j % 32 == 0) {
break as;//退出整个循环
}
System.out.print(j + "*" + i + "=" + (i * j) + " ");
}
System.out.println();//一个小循环,则换一行
}
}
-->while
while(条件){循环语句;循环变量变化;}
int i = 0;
//打印100以内的奇数
while (i < 101) {
if (i % 2 != 0)
System.out.print(i + " ");
i++;
}
while死循环:while(true){循环语句;}
次数不确定的while循环:while(true){循环语句;if(条件) break;}
do…while:do {循环体;循环变量变化;}while(true);此种循环循环体至少执行一次,无论条件是否满足。
int i = 1;
do {
System.out.println(i);
i++;
}while (i < 0);
System.out.println("*********");
for (int j = 1; j < 0; j++) {
System.out.println(j);
}
练习:
1、 给定一个整数,将其反向输出,如给定1234,则输出4321.
2、 打出空心菱形。
3、 打印空形矩形。
4、 打印空心三角形。
5、 打一条内三角形。