由于之前是看書學習java蚁阳,真正學到j(luò)ava面向?qū)ο蟮臅r候螺捐,才開始看畢向東老師的視頻矮燎,覺得輕松愉快定血,甚至有些興奮和幸福。因為我找到了java的樂趣所在漏峰。
為什么還要返回來總結(jié)這些看似簡單的知識點呢糠悼?要正視這個問題,首先有一點浅乔,確實是為了總結(jié)而總結(jié)倔喂,這點私心還是存在的靖苇。但是學java席噩,我深刻明白不是為了學習而學習的。返回來總結(jié)的另一個重要的原因贤壁,就是鞏固知識點悼枢,別看這些小知識點,卻蘊含著大智慧脾拆,就拿下面這個程序來說吧馒索,這里就涉及到了一個類型轉(zhuǎn)換的問題(文章中會提到的)莹妒。而且,我發(fā)現(xiàn)绰上,現(xiàn)在返過來總結(jié)這些知識點旨怠,可以讓自己學到更多的知識,我會首先將后面講到的關(guān)于這些知識點的問題補充過來蜈块,還能通過網(wǎng)上查找到一些資料鉴腻,融入到自己的知識中來,并添加進來百揭,這樣爽哎,對看我文章的人,和我自己都有額外的收獲器一。好课锌,開始整理:
一、基本概念概述
1盹舞、關(guān)鍵字:
被java賦予了特殊含義的單詞产镐。總結(jié)如下:
1踢步、類型定義符關(guān)鍵字:
整數(shù)類型:byte,short丑掺,int获印,long 浮點類型:float、double
字符類型:char 布爾類型:boolean
2街州、循環(huán)判斷修飾符關(guān)鍵字:
表判斷:if兼丰、else、else if唆缴;switch鳍征、case;
表循環(huán):for面徽,while艳丛、do while;
表繼續(xù):continue趟紊;表結(jié)束:break氮双;
3、訪問權(quán)限修飾符關(guān)鍵字:
私有的:private霎匈;受保護的:protected戴差;公有的:public。
修飾符間的比較見后面文章的總結(jié)铛嘱。
4暖释、類袭厂、函數(shù)、變量修飾符關(guān)鍵字:
抽象的:abstract球匕;最終的:final嵌器;靜態(tài)的:static;同步的:synchronized谐丢;枚舉類:enum爽航。
5、類與類間關(guān)系的關(guān)鍵字
繼承的:extends乾忱;實現(xiàn)的:implements讥珍。
6、實例的建立窄瘟、引用及判斷的關(guān)鍵字:
創(chuàng)建:new衷佃;當前引用:this;父類引用:super蹄葱;判斷所屬:instanceof氏义。
7、異常處理的關(guān)鍵字:
嘗試(檢查異常):try图云; 捕獲(異常):捕獲異常惯悠; 最終(一定執(zhí)行):finally;
拋出(異常對象):throw竣况; 拋出(異常):throws克婶。
8、包關(guān)鍵字:
包:package丹泉;導入(包)import情萤。
9、其他修飾符關(guān)鍵字(現(xiàn)在不做重點說明摹恨,以及java保留關(guān)鍵字不再闡述):
native:定義本地方法筋岛;
strictfp:即strict float point,精確浮點晒哄;
transient:變量修飾符睁宰,用它聲明一個實例變量,當對象存儲時揩晴,它的值不需要維持勋陪。
volatile:類型修飾符,用來修飾被不同線程訪問和修改的變量硫兰。
assert:斷言诅愚,作為異常處理的一種高級形式,在測試代碼運行時使用。
2违孝、標識符:
1刹前、定義:程序中自定義的一些名稱。如類名
2雌桑、命名規(guī)則:
a.由26個英文字符大小寫喇喉,數(shù)字0-9,符號中的_和$校坑,組成拣技。
b.數(shù)字不可以開頭,不可以使用關(guān)鍵字
c.嚴格區(qū)分大小寫耍目,起名為了提高閱讀性膏斤,盡量使用有意義的名字
3、名稱規(guī)范:
a.包名:多單詞組成是全部為小寫字母邪驮。如:packageperson
b.類名和接口名:首個單詞大寫莫辨,多個單詞組成時,后面的每個單詞首字母大寫毅访。如:StringDemo
c.變量名和函數(shù)名: 首個單詞小寫沮榜,多個單詞組成時,后面的每個單詞首字母大寫喻粹。如:functionTest
d.常量名:所有字母都大寫蟆融。多個單詞組成時,用下劃線(“_”)連接磷斧。如MAX_VALUE
3振愿、變量:
1、概述:將不確定的數(shù)據(jù)進行存儲弛饭,會在內(nèi)存中開辟一塊空間,存放在棧內(nèi)存中萍歉。每一個變量都隸屬于一種類型侣颂。它代表著一個值,便于在語句中靈活使用枪孩,且比具體值更有意義憔晒。
2、聲明變量:a.數(shù)據(jù)類型 變量名; b.數(shù)據(jù)類型 變量名 = 初始化值;
3蔑舞、變量初始化:對于上面的a拒担,系統(tǒng)默認初始化值,也稱隱式初始化攻询。對于b从撼,是顯式初始化值。
默認初始化值:
數(shù)值類型:byte钧栖、short低零、int :0 婆翔; long:0L; float:0.0f掏婶; double:0.0d
字符類型:char:''(空字符啃奴,打印時無顯示)
布爾類型:boolean:false
引用型默認初始化值為null。
4雄妥、常量:
在java中最蕾,使用final聲明常量,變量名要全部大寫老厌。
如:
public static final double PI = 3.1415926;
需要注意的是:
a.聲明變量并賦初值后瘟则,這個值就不能再更改了。
b.類常量的聲明位于main方法的外部梅桩,或無main函數(shù)的類的全局中的位置壹粟。這樣,可以在同一個類中的其他地方使用這個常量宿百。
c.上面默認初始化的那些值皆為常量值趁仙。
二、數(shù)據(jù)類型
java中的數(shù)據(jù)類型分為基本數(shù)據(jù)類型和引用數(shù)據(jù)類型(后面會具體體現(xiàn)垦页,這里主要講基本數(shù)據(jù)類型)雀费。他們的共性之處在于,都是存在于棧內(nèi)存中的痊焊。但是基本數(shù)據(jù)類型和引用數(shù)據(jù)類型在內(nèi)存中的本質(zhì)是有區(qū)別的盏袄,基本數(shù)據(jù)類型本身的值就是在棧內(nèi)存中的,無需引用任何數(shù)據(jù)薄啥,自己管自己的辕羽。但是引用數(shù)據(jù)類型則不一樣,它在棧內(nèi)存中也有值垄惧,只不過這值是地址值刁愿,拿的別人的東西。下面我就簡單總結(jié)一下關(guān)于基本數(shù)據(jù)類型到逊。
先來看一個小程序:
class JavaDemo
{
public static void main(String [] args)
{
int i = 5;
float f = 6.5f;
double d = i + f;
System.out.println("打印d為:" + d);//結(jié)果為:打印d為11.5
}
}
通過這個小程序铣口,我們來主要說一下關(guān)于數(shù)據(jù)類型的問題。
1觉壶、基本數(shù)據(jù)類型:
上面程序中提到的int脑题、float、double等是數(shù)據(jù)類型中的幾種铜靶。這些都屬于基本數(shù)據(jù)類型叔遂。對于基本數(shù)據(jù)類型,上面也說到了,是自己的值存放在棧內(nèi)存中掏熬。對于基本數(shù)據(jù)類型佑稠,主要有八種,分別為:
1旗芬、整數(shù)類型:
byte: 字節(jié)型 -------> 1字節(jié)舌胶,取值范圍:(-2E7 ~ 2E7 - 1)-128 ~ 127
short:短整型 -------> 2字節(jié),取值范圍:(-2E15 ~ 2E15 - 1)-32768 ~ 32767
int: 整型 -------> 4字節(jié)疮丛,取值范圍:(-2E31 ~ 2E31 - 1)-2147483648 ~ 214748367 ---超過20億
long: 長整型 -------> 8字節(jié)幔嫂,取值范圍:(-2E61 ~ 2E61 - 1)-9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807
2、浮點型:
float: 單精度浮點型 -------> 4字節(jié)誊薄,取值范圍:大約± 3.402 823 47E + 38F(有效位6 ~ 7位)
double:雙精度浮點型 -------> 8字節(jié)履恩,取值范圍:大約± 1.797 693 134 862 315 70E + 308(有效位15位)
3、字符型:
char:字符型 ------->用于表示單個字符呢蔫。如‘A’切心。
4、布爾型:
boolean:布爾型 ------->表示邏輯判斷條件片吊,有兩個值為true和false绽昏。
2今妄、基本數(shù)據(jù)類型說明:
1阅虫、int類型:在整數(shù)類型中,對數(shù)據(jù)進行賦值的時候安皱,默認是int類型的爷贫,就是說认然,可以直接使用任何整型數(shù)據(jù),基本上是作為int使用的漫萄。大數(shù)值單說卷员。
2、double類型:在浮點型類型中腾务,和int相似子刮,默認的是double類型的。
3窑睁、char類型:每一個字符都對應一個ASCll碼,如'A'對應著65葵孤,'a'對應著97担钮。
public static void main(String[] args) {
char ch1 = 97;
char ch2 = 'a';
System.out.println("ch1 = " + ch1); //ch1 = a
System.out.println("ch2 = " + ch2); //ch2 = a
}
4、對于基本數(shù)據(jù)類型尤仍,在進行參數(shù)傳遞時箫津,是進行的值傳遞。
5、基本數(shù)據(jù)類型的初始化:
整型默認初始化為: 0 字符型默認初始化為:null
浮點型默認初始化為: 0.0(f) 布爾型默認初始化為:false
3苏遥、關(guān)于基本類型轉(zhuǎn)化與提升問題
1饼拍、自動類型轉(zhuǎn)換:
也稱為隱式類型轉(zhuǎn)化。當一個“小”(指范圍刑锾俊)數(shù)據(jù)與“大”數(shù)據(jù)進行運算時师抄,java默認會向“大”數(shù)據(jù)方向轉(zhuǎn)換,然后再運算教硫,如上面的程序中的運算叨吮,就是講i = 5轉(zhuǎn)為i = 5.0在和f進行運算,然后再提升為double類型瞬矩。
注:
a.所有byte茶鉴、short、char類型的值將提升為int類型景用。
b.自動類型轉(zhuǎn)換關(guān)系:byte -->short(char) -->int -->long -->float -->double
2涵叮、強制類型轉(zhuǎn)換:
和自動轉(zhuǎn)換類型相反,格式:int i = (int)6.53;伞插,就是將“大”數(shù)據(jù)強轉(zhuǎn)為“小”數(shù)據(jù)割粮。
注:
a.會損失精度,如6.53轉(zhuǎn)完后為6蜂怎,會將小數(shù)點后的值去除穆刻,只保留整數(shù)位。
b.強制類型轉(zhuǎn)換關(guān)系:double -->float -->long -->int -->short(char) -->byte
c.對于int m = (int)'a';//結(jié)果為97杠步,因為a在ASCll碼中的值為97氢伟。
4、關(guān)于證書數(shù)據(jù)大小溢出的問題
當整數(shù)的數(shù)據(jù)大小超出了可以表示的范圍幽歼,而程序中又沒有做數(shù)值范圍的檢查時朵锣,這個整型變量所輸出的值將發(fā)生紊亂,且不是預期的運行結(jié)果甸私。
public static void main(String[] args) {
int x = Integer.MAX_VALUE;
System.out.println("x = " + x); //x = 2147483647
System.out.println("x+1 = " + (x + 1)); //x+1 = -2147483648
System.out.println("x+2 = " + (x + 2)); //x+2 = -2147483647
System.out.println("x + 2 = "+(x+2L)); //x + 2 = 2147483649
System.out.println("x + 3 = "+((long)x+3)); //x + 3 = 2147483650
}
類似于計數(shù)器的內(nèi)容到最大值時會自動歸零诚些。
通過顯式指明數(shù)據(jù)類型,避免溢出:
· 在表達式的常量部分加上L
· 利用強制類型轉(zhuǎn)換的方式
· 對于long類型的溢出皇型,就沒有辦法處理了诬烹,就需要在程序中加上變量值的界限檢查。
三弃鸦、運算符
1绞吁、概述:
數(shù)據(jù)的存儲不僅僅只為了存,更多的是運算唬格,那么該如何對這些數(shù)據(jù)進行運算呢家破?先說一說基本的運算符及運算颜说。
2、運算符:
1汰聋、算數(shù)運算符
正號:+ 負號:-
加法:+ 減法:- 乘法:* 除法:/ 取模:%
自增:++门粪,即自加1,可至于前或后烹困;如:++a(a先自增玄妈,然后再和a相加),a++(先和a相加韭邓,a再自增)
自減:- -措近,即自減1, 可至于前或后女淑;如:- -a(a先自減瞭郑,然后再和a相減),a- -(先和a相減鸭你,a再自減)
字符串相連:+
2屈张、賦值運算符:=、+=袱巨、-=阁谆、*=、/=愉老、%=等
如:
s += 5
场绿,就是將s的值和5相加再賦值給s。但是這種運算和s = s + 5;是有區(qū)別的嫉入。
s += 5
有自我提升的功能焰盗,而 s = s + 5;可能就會編譯失敗。比如咒林,s為short型的值熬拒,對于后者那么編譯時就會報錯:可能損失精度。對于前者垫竞,會將5強轉(zhuǎn)為short型澎粟,在與s的值相加,然后再賦值給s欢瞪。
3活烙、比較運算符:==、!=遣鼓、< 瓣颅、> 、<= 譬正、>= 宫补、instanceof
結(jié)果均為boolean型,即所得的值為true或者false
如:
5 == 3
為false
曾我;5 != 3
為true
4粉怕、邏輯運算符:&、|抒巢、^贫贝、!、&&蛉谜、||
與: &稚晚; 如:true & false 為false;
或:|型诚; 如:true | false為true客燕;
非: !; 如: ! true 為false
異或: ^狰贯; 如:true ^ false 為true(真異或真為假)
短路:&&:只要有一邊為false也搓,結(jié)果則為false
||:只要有一邊為true,結(jié)果則為true
5涵紊、位運算:<< 傍妒、>> 、>>> 摸柄、 &颤练、|、^ 驱负、~嗦玖;在二進制水平上運算
左移:<<;3 << 2 = 12 ---->322=12
右移:>>电媳;3 >> 1 = 1 ---->3/2 =1
無符號右移:>>>踏揣; 3 >>> 1 = 1 ---->3/2 =1
與: &;6 & 3 = 2
或:|匾乓;6 | 3 = 7
異或: ^捞稿;6 ^ 3 = 5。一個數(shù)以后兩次相同點數(shù)拼缝,那么結(jié)果還為本身娱局。在加密和解密中有應用。
:反碼: 6 = -7咧七,其實就是對當前數(shù)的二進制的取反衰齐。
注:
a.對于>>,最高位補什么由原有數(shù)據(jù)的最高位值而定继阻,若最高位為0耻涛,右移后废酷,用0補空位。如果最高位為1抹缕,右移后澈蟆,用1補空位。
b.對于>>>卓研,無論最高位是0還是1趴俘,右移后,都用0補空位奏赘。
3寥闪、進制操作
1、概述:java中有四種進制形式:二進制磨淌,八進制疲憋,十進制,十六進制伦糯。
整數(shù)的表現(xiàn)形式:
二進制: 0和1柜某,逢2進1.如110(表示六)
八進制: 0 - 7,逢8進1敛纲;以0開頭表示喂击。如015(表示十三)
十進制: 0 - 9,逢10進1淤翔。如12(表示十二)
十六進制:0 - 9翰绊、A - F,逢16進1旁壮;以0x開頭表示监嗜。如0x3c(表示60)
2、進制特點:
a.二進制:始于電信號抡谐。任何計算機底層都是用二進制表示的裁奇。
b.八進制:將二進制的三位表示一位,即為八進制麦撵,最大值為7(2^3-1)刽肠。
c.十六進制:將二進制的四位表示一位,即為十六進制免胃,最大值為15(2^4-1)音五。
d.進制數(shù)越大,位數(shù)越短羔沙。
3躺涝、進制間轉(zhuǎn)化:
1)十進制轉(zhuǎn)二進制:取2的余數(shù)運算
例:求6的二進制:6/2商3---余0,3/2商1---余1,1/2---余1扼雏;最終余1或除盡余0坚嗜,則將每次除得的余數(shù)倒敘排列為110夯膀,即十進制的6轉(zhuǎn)為二進制是110.
2)二進制轉(zhuǎn)十進制:取2的冪運算
例:求110的十進制:02^0 +12^1 +1*2^2 = 6,其中012...代表各位數(shù)惶傻。
3)二進制轉(zhuǎn)八進制:從右向左取二進制三位為一位棍郎,不足補0,算出每三位的十進制值(不會超過7)
例:求10011011的八進制:八位補一位為010,011,011银室;計算010 = 2, 011 = 3, 011 =3;則八進制為233
4)二進制轉(zhuǎn)十六進制:從右向左取二進制四位為一位励翼,不足補0蜈敢,算出每四位的十進制值(不會超過15,過了9汽抚,記為A/B/C/D/E/F)
例:求10011011的十六進制:補位為0000,0000,1001,1011抓狭,計算0000 = 0, 0000 = 0,1001 = 9, 1011 = B(11),則十六進制為9B
5)八進制造烁、十六進制轉(zhuǎn)二進制:先轉(zhuǎn)為十進制否过,再轉(zhuǎn)為二進制。
6)二進制的負數(shù)形式:取反后再求其補碼
例:求-6的二進制:
0000-0000 0000-0000 0000-0000 0000-0110
^ 1111-1111 1111-1111 1111-1111 1111-1111
--------------------------------------------------------------------
1111-1111 1111-1111 1111-1111 1111-1001
+ 0000-0000 0000-0000 0000-0000 0000-0001
--------------------------------------------------------------------
1111-1111 1111-1111 1111-1111 1111-1010
則-6的二進制為:1111-1111 1111-1111 1111-1111 1111-1010
惭蟋。
說明:二進制的負數(shù)形式的最高位皆為1.
/**
需求|:定義一個方法苗桂,使其可將十進制轉(zhuǎn)換為二進制、八進制及十六進制
思路|:查表法|:
1定義一個表告组,存放十六進制的所有元素煤伟,此表也就包含了二進制和八進制的元素
2通過十進制&15(或7,或1)的運算木缝,得到進制最后一位數(shù)便锨,倒序存入數(shù)組
3然后移位(>>>4或3或1),得到一個新數(shù)
4重復此過程我碟,知道數(shù)值為零放案,結(jié)束
5將數(shù)組打印
*/
import java.util.*;
class Trans
{
public static int scan()
{
Scanner in = new Scanner(System.in);
System.out.print("請輸入十進制數(shù)字:");
int num = in.nextInt();
return num;
}
public static void trans(int num,int base,int offset)
{
if(num ==0)
{
System.out.println("\n轉(zhuǎn)換后的數(shù)為:" + 0);
return ;
}
StringBuffer sa = new StringBuffer();
char[] ch = { '0','1','2','3',
'4','5','6','7',
'8','9','A','B',
'C','D','E','F'};
char[] arr = new char[32];
int pos = arr.length;
while(num!=0)
{
int temp = num & base;
arr[--pos] = ch[temp];
num >>>=offset;
}
for(int i=pos;i<arr.length;i++)
{
sa.append(arr[i]);
}
System.out.println("后的數(shù)為:" + sa);
}
//轉(zhuǎn)換為二進制
public static void toBin(int num)
{
System.out.print("轉(zhuǎn)換成二進制");
trans(num,1,1);
}
//轉(zhuǎn)換為八進制
public static void toBa(int num)
{
System.out.print("轉(zhuǎn)換成八進制");
trans(num,7,3);
}
//轉(zhuǎn)換為十六進制
public static void toHex(int num)
{
System.out.print("轉(zhuǎn)換成十六進制");
trans(num,15,4);
}
public static void main(String [] args)
{
int x = 0;
x = scan();
toBin(x);
toBa(x);
toHex(x);
}
}
4、三元運算符:
格式:布爾型表達式 ? 表達式1 : 表達式2
說明:當布爾型表達式的值為true時矫俺,則計算表達式1吱殉;否則計算表達式2。
如:
返回兩個數(shù)中較小的值----> x < y ? x : y恳守。
注意:
a.這個是有返回值的考婴,需要由變量接收這個返回值,如:int a = x < y ? x : y;
b.表達式1和表達式2必須都返回相同類型催烘,或是相同類型的數(shù)據(jù)沥阱。
5、運算符優(yōu)先級:
運算符間有不同的優(yōu)先級伊群。就是誰先運算的問題考杉。具體如下:從左向右運算的:
運算級別由高到低
1級—— 方法調(diào)用:[ ] . ()
2級—— 一元運算符:! 策精、~ 、++崇棠、-- 咽袜、+、-枕稀;強制類型轉(zhuǎn)換:( )询刹;創(chuàng)建:new
3級—— 二元運算符:*和 / 優(yōu)于 + 和 -
4級—— 位運算:<<、>> 萎坷、>>>
5級—— 比較運算符:< 凹联、> 、<= 哆档、>= 蔽挠、instanceof 優(yōu)于 ==、!=瓜浸、
6級—— 邏輯運算符:&澳淑、|、^插佛、!杠巡、&&、||
7級—— 三元運算符:? :
8級—— 算數(shù)運算符等: =朗涩、+=忽孽、-=、*=谢床、/=兄一、%=、&=识腿、|=出革、 ^=、 <<=渡讼、>>= 骂束、>>>=
上面除了第2、7和8級的是從右向左運算成箫,其他的都是從左向右進行的運算展箱。
6、轉(zhuǎn)義字符:
1蹬昌、概述:通過 \ 來轉(zhuǎn)變后面字母或符號的含義混驰。如:\n表示換行。
2、常用轉(zhuǎn)義字符:
\b:退格 \n:換行
\t:制表符栖榨,相當于tab鍵 \r:回車
\\:表示反斜杠????':表示單引號????":表示雙引號
四昆汹、final關(guān)鍵字
final:最終。是java中的修飾符
1婴栽、final關(guān)鍵字的特點:
1满粗、可修飾類、變量(成員變量愚争、靜態(tài)變量映皆、局部變量)、函數(shù)
2轰枝、被final修飾的類不可被繼承劫扒,為避免被繼承,子類需要復寫父類中的方法
3狸膏、被final修飾的方法不可被復寫
4、被final修飾的變量是常量時添怔,只能賦值一次湾戳。final既可修飾成員變量,又可修飾局部變量
??描述事物時广料,一些數(shù)據(jù)為固定的砾脑,為增強閱讀性,都給這些值起名艾杏,而此值不被改變
如:數(shù)學函數(shù)中的圓周率PI是一個固定值韧衣,在java中北定義為final的,是為了讓程序更加嚴謹
public static final double PI = 3.141592654
5购桑、內(nèi)部類定義在類中的局部位置上時畅铭,只能訪問該局部被final修飾的局部變量
2、final關(guān)鍵字的體現(xiàn)
1勃蜘、final方法:
如果一個類不允許其子類覆蓋某個方法硕噩,則可以把這個方法聲明為final方法。
也就是說缭贡,被final修飾后炉擅,是不能有“子方法”的,就是不能在子類中重寫父類中的這個方法阳惹。
class Fu
{
final void Fun()
{
System.out.println("fu-final");
}
}
class Zi extends Fu
{
void Fun()
{
System.out.println("zi-final");
}
}
class FinalDemo
{
public static void main(String [] args)
{
Zi z = new Zi();
z.Fun();
}
}
當編譯運行的時候會出錯:
2谍失、final類:
final類是最終類,是不能被擴展的類莹汤,即沒有子類快鱼。因此當類不允許被繼承,不允許被改變其中被實現(xiàn)的細節(jié),那么就可以將父類定義成final的攒巍。
注意:抽象類不能用final來修飾嗽仪,即一個類不能既是最終類又是抽象類。