1、常量與變量
程序執(zhí)行中值不會變化的為常量,會變化的為變量。如定義一個常量PI,表示圓周率,圓周率不會改變;定義一個變量stuNo,表示學號,學號則會根據(jù)學生的改變而相應(yīng)的改變。
2、Java中的標識符
標識符是用來給類,變量、常量進行取名字的符號。定義標識符具有一定的規(guī)則,規(guī)則如下:
? 大小寫敏感;
? 支持字母數(shù)字下劃線及$;
? 數(shù)字不能放在首位,即不能做首字符;
? 長度無限制;
? 不能是Java關(guān)鍵字;
? 支持中文,但不建議;
? 所有類的類名已經(jīng)是標識符(String)。
同時,對標識符也具有一定的命名規(guī)范,針對不同的Java標識符,其規(guī)范不盡相同:
類名,接口名:每個單詞的首字母應(yīng)該大寫,尤其第一個單詞的首字母應(yīng)該大寫。(駝峰規(guī)則)。如class HelloWorld,Interface Animal
方法、屬性、變量::第一個單詞首字母應(yīng)小寫,其他單詞首字母大寫。如String empNo;void setName(String name);
常量:全部用大寫字母表示。如果由幾個單詞組成,則由下畫線連接。public final int? PI;public final int HEAD_COUNT;
包: 全部用小寫字母。如:package cn.onlylove.domain

3、Java中的關(guān)鍵字
3個保留字:true,false,null
50個關(guān)鍵字。
4、Java中的注釋
良好的編程規(guī)范中,注釋必須寫上,以便其他人閱讀、引用和維護。
單行注釋? //...
多行注釋? /* ....*/,多行注釋不支持嵌套。
文檔注釋? /** ... */
可以通過使用JDK的javadoc工具從原文件中將文檔注釋抽取出來,從而形成幫助文檔。如JDK的API文檔。
5、Java中的注釋
Java是一種強類型語言,意思是說在程序的開發(fā)過程中,如果要使用某個變量,必須先對該變量進行聲明。Java中對變量的聲明,需要使用相應(yīng)的數(shù)據(jù)類型,Java中數(shù)據(jù)類型分為2種:基本數(shù)據(jù)類型與引用數(shù)據(jù)類型。
首先看一下Java中的引用類型。所有的類,所有的接口,所有的數(shù)組,枚舉,標注。都是引用類型。
基本數(shù)據(jù)類型總計8種,按照存儲的是字符、整數(shù)、浮點數(shù)、布爾值分為4類。如下圖所示:

-->布爾型boolean
java中boolean只有true和false兩個值,代表真和假。定義方法如下:
boolean isExist=true;
對一個變量進行第一次賦值的操作叫作對變量的初始化。
boolean的作用:
1、作為條件判斷
2、只有兩種狀態(tài)的時候作為條件的區(qū)分。
-->字符型char
字符類型用來存儲單個字符,占用16位2個字節(jié)的內(nèi)存空間,因為char類型占用16位,因而其至多可以定義2的16次方個字符, 同時因為其也是占用兩個字節(jié),因此也可以將單個中文漢字定義為char類型。對char類型的變量進行初始化時需要在其值的兩邊用單引號括起來,定義方法如下:
char a=’a’;//正確
char a=’你’;
char a=’ab’;//錯誤
也可以將0-65535范圍內(nèi)的整數(shù)定義為char變量,JVM將根據(jù)ASCII碼轉(zhuǎn)換為對應(yīng)的字符。
char a=97;//如果輸出,將輸出字符a
-->整數(shù)型
了解整數(shù)類型之前,先需要了解計算機中的各類數(shù)字進制表現(xiàn)形式:
二進制:只有1和0兩個值
八進制:0開頭。由0-7表示。
十進制:正常顯示,即日常使用的數(shù)字類型。不能以0開頭(0除外)。
十六進制:0x或者0X開頭。0-9由數(shù)字表示,10-15由a-f表示。
進制間的轉(zhuǎn)換:
學會各類進制與十進制之間的轉(zhuǎn)換,則各種之間也就明了了。
二進制與十進制的轉(zhuǎn)換。
二進制111則表示為1*22+1*21+1*20=4+2+1=7(2的平方,2的1次方,2的0次方)
八進制與十進制的轉(zhuǎn)換。
八進制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次方)
十六進制與十進制的轉(zhuǎn)換
十六進制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
重點只要會二進制與十進制互轉(zhuǎn)即可。
網(wǎng)上有個段子,說是一個程序員522那天送花給女朋友,被拒絕了。通過心算后得出
522=5*16平方+2*16的1次方+2*16的0次方=1280+32+2=1314得出522是程序員的情人節(jié)。之后把花扔了,覺得女方配不上這么聰明的男人。
整數(shù)型數(shù)據(jù)類型根據(jù)所占內(nèi)存大小不同分為byte,short,int,long。(在內(nèi)存中的二進制表示時所有的第一位均做符號位 1負0正)。在代碼中,整數(shù)型的默認類型是int,浮點型默認類型是double。
負數(shù)的二進制表示法:
原碼,反碼,補碼。
-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。
負數(shù)的表示即為對應(yīng)的補碼。
byte 8位;表示2的8次方個數(shù):負2的7次方到正2的7次方減1
short 16位;? 同上
int 32位 ;同上
long? 64位;? 同上
由于相應(yīng)的數(shù)據(jù)類型只能取相應(yīng)范圍內(nèi)的數(shù)值,因此,在定義變量并初始化時,若變量取值超出其相應(yīng)范圍,則會發(fā)生報錯或者發(fā)生相應(yīng)的強制類型轉(zhuǎn)換。看如下代碼
byte b=12;
byteb2=129;//false(超過范圍)byte最大為127
char c1='a';
String s="a";
int i1=c1;//char 既能當字符也能當數(shù)字。
inti2=s;//false
String不能當數(shù)字用,因為它是一個引用,是個地址。
int i3=20;
b=i3;//false 變量和常量的區(qū)別。不能保證i3在byte范圍內(nèi),因為i3可能會有改變,20永遠是20,i3不一定。
--> 浮點型
float 32位
double 64位。
二者都是近似值。
單精度
float f=1.0//錯誤,默認為double
雙精度。
二者的取值范圍和精度是不同的 float的精度是6位有效數(shù)字,取值范圍是10的-38次方到10的38次方,float占用4字節(jié)空間 double的精度是15位有效數(shù)字,取值范圍是10的-308次方到10的308次方,double占用8字節(jié)空間。
--> 基本數(shù)據(jù)類型強制類型轉(zhuǎn)換
double d1=1.0;
double d2=0.54;
float f;
f=(float)(d1-d2);
用于解決上面的問題。但仍然不要超過各類型的范圍。上面成功的是自動類型轉(zhuǎn)換。
所謂自動類型轉(zhuǎn)換:
1、整數(shù)之間,小范圍向大范圍自動轉(zhuǎn)換。
2、整數(shù)向浮點自動轉(zhuǎn)。
3、范圍以內(nèi)的常數(shù)自動轉(zhuǎn)。
問題:如下將輸出什么?
byte b=(byte)128;
System.out.println(b);
答案:-127,為什么?

Java中數(shù)字默認為Int類型,占32位。因此,在內(nèi)存中128是如下表示:
0000 0000 0000 0000 0000 0000 1000 0000
在將128轉(zhuǎn)換為byte類型時,只占8位。在內(nèi)存中為
1000 0000 即為-127。
強制類型轉(zhuǎn)換時,只截取當前位數(shù)內(nèi)的字符進行截取。
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把關(guān)于byte
short的運算都轉(zhuǎn)成int以后再進行運算
練習:用Scanner輸入一個秒級數(shù)字,將其轉(zhuǎn)換成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();
-->算術(shù)運算符:+ = * / %
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
-->邏輯運算符:
短路運算:(且&&? 或||),非短路運算:(且& 或 |)
短路運算中,當前面的一個表達式可以決定結(jié)果時,后面的語句將不再執(zhí)行,非短路運算會繼續(xù)判斷后面的。因而短路運算其效率高于非短路運算。
? ? ? 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,表明&&后面未執(zhí)行
? ? ?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,表明&后面的也執(zhí)行了
-->位運算:& | ^
&(AND)|(OR) ^(XOR異或) ~(補碼)按位取反=加1再取反(全1的補碼是-1)。只要掌握好負數(shù)的內(nèi)在占位情況就好計算。
int a=5&-4;//將5與-4進行與運算。
????? System.out.println(a);//4
????? //內(nèi)存中格式為:
????? //5是????? 0000 00000000 0000 0000 0000 0000 0101
????? //-4是?? 1111 1111 11111111 1111 1111 1111 1100
????? //&結(jié)果? 0000 0000 0000 0000 0000 0000 0000 0100
-->移位運算:
>>右移:全部向右移動,移到右段的低位被舍棄,最高位則移入原來最高位的值。右移N位相當于除以2n。
>>>無符號右移:同上,只是最高位變成0.因此負數(shù)的移位與>>有區(qū)別,正數(shù)與>>無區(qū)別。
<<左移:全部向左移動,右側(cè)低位補0。
移位運算一般而言都是int類型(默認類型),因此,當移位位數(shù)超過32位時,取對32的求余即可。Java中默認理解為超過32位的移位無意義。
? ? ?System.out.println(7 >> 2);
????? //00000111-->00000001??相當于7/(2*2)=1
????? System.out.println(7 >> 34);
????? // java移位時,先將移位數(shù)%32,此處34%32=2。由相當于7>>2
????? System.out.println(7 >> -30);
????? // 負數(shù)次數(shù)時,先加上32倍數(shù),轉(zhuǎn)成正數(shù)以后才移位
????? System.out.println(-7 >> 2);// -2
????? //負數(shù)的高位仍然是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;
//可以轉(zhuǎn)換類型的就轉(zhuǎn)換成同一類型
System.out.println((a>b)?b:a);//3.0
//不可以轉(zhuǎn)換類型的就保持原有類型
System.out.println((a>b)?"ok":a);//3,早期版本可能不支持如此寫法。
-->運算符的優(yōu)先級:
=最低,其余根據(jù)需要添加相應(yīng)的括號()即可。()最高。
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("請輸入您的分數(shù)");
????? int y = sc.nextInt();
????? switch (y) {
????? case 5:
??????? System.out.println("優(yōu)");
??????? 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、循環(huán)語句
程序執(zhí)行到控制語句時,會有多個選擇,選擇哪一個取決于選擇條件,選擇完成后只會執(zhí)行某一個條件下的語句,但循環(huán)是不一樣的。
循環(huán):反復做同一件事情的時候,如,打印1-10000;找出1-10000里面所有的奇數(shù)。
for/while/do while其中for/while是等價的。do while不同。
-->for
for( ; ; ){}小括號內(nèi)是三段論,第一段循環(huán)變量(用于控制循環(huán)次數(shù)的變量)的聲明和初始化。第二段放條件,第三段放循環(huán)變量的變化。大括號內(nèi)書寫循環(huán)體(反復執(zhí)行的語句);
for (int i = 1; i <= 10; i++) {
??????? System.out.println("i=" + i);
????? }
死循環(huán):按中止按鈕或者在控制臺中按ctrl+c,或者ctrl+d結(jié)束循環(huán)。for(;;)
循環(huán)次數(shù)不定的循環(huán):for(;;){循環(huán)語句; if(條件){break;}}。break可以跳出循環(huán):
Scannersc=new Scanner(System.in);
????? for(;;){
????? Stringstr=sc.next();
????? ?if(str.equals("bye")) break;
????? System.out.println("你說:"+str);
????? }
????? //break后到這里,已經(jīng)跳出循環(huán)。
????? sc.close();
練習
1、 用兩種方式輸出1-100內(nèi)的奇數(shù)。
2、 做一個猜數(shù)據(jù)的小游戲,生成1-100的隨機數(shù),然后猜,用鍵盤輸入int,提示輸入的數(shù)字是更大還是更小,如果猜對就輸出猜對了,并輸出猜了幾次并退出程式。
3、 打印一個圖形,如下所示:
*
**
***
****
*****
4、 打印一個圖形,第一行一個*,第二行3個*,第三行5個星,打印幾行由系統(tǒng)輸入決定。
5、 打印1-100里面的所有質(zhì)數(shù),所謂質(zhì)數(shù),即只可以被1和其本身整除的數(shù)字。
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++;//每進入一次循環(huán),則統(tǒng)計一遍次數(shù).
????? System.out.println("請輸入一個數(shù)字:");
????? int guess=sc.nextInt();
????? //通過比較,判斷所猜數(shù)字是否與系統(tǒng)數(shù)字一致
????? if(guess
???????? System.out.println("小了");
????? }else if(guess>num) {
???????? System.out.println("大了");
????? }else {
???????? System.out.println("恭喜你,猜對了!總共猜了"+count+"次!");
???????? if(count<5) {
??????????? System.out.println("你可以去買彩票了!");
???????? }
???????? break;//猜對后,結(jié)束循環(huán)退出程序.
????? }
?? }
????? sc.close();
-->break與continue的區(qū)別
break結(jié)束當前循環(huán),continue結(jié)束當前這個變量所在的循環(huán),繼續(xù)下一變量的判斷。
as: for (int i = 1; i <= 9; i++) {
??????????? for (int j = 1; j <= i; j++) {
??????????????? if (i * j % 12 == 0) {
???????? ???????? continue;//i*j=12的倍數(shù)時,不打印,繼續(xù)下一循環(huán)。
??????????????? }
??????????????? if (i * j % 28 == 0) {
?????????????????? break;//i*j=28的位數(shù)時,退出當前里面的這個for循環(huán)
??????????????? }
??????????????? if (i * j % 32 == 0) {
?????????????????? break as;//退出整個循環(huán)
??????????????? }
??????????????? System.out.print(j + "*" + i + "=" + (i * j) + "? ");
??????????? }
??????????? System.out.println();//一個小循環(huán),則換一行
???????? }
?? }
-->while
while(條件){循環(huán)語句;循環(huán)變量變化;}
int i = 0;
????? //打印100以內(nèi)的奇數(shù)
????? while (i < 101) {
???????? if (i % 2 != 0)
??????????? System.out.print(i + " ");
???????? i++;
????? }
while死循環(huán):while(true){循環(huán)語句;}
次數(shù)不確定的while循環(huán):while(true){循環(huán)語句;if(條件) break;}
do…while:do {循環(huán)體;循環(huán)變量變化;}while(true);此種循環(huán)循環(huán)體至少執(zhí)行一次,無論條件是否滿足。
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、 給定一個整數(shù),將其反向輸出,如給定1234,則輸出4321.
2、 打出空心菱形。
3、 打印空形矩形。
4、 打印空心三角形。
5、 打一條內(nèi)三角形。