01-java基础加强,eclipse工具使用,快捷键,断点调试,单元测试,jdk5新特性,增强for循环,集合map,list,可变参数,枚举,反射,泛型
一、eclipse工具的使用
1. java代碼的位置
?????? 1) 選擇工作空間 workspace? 選擇一個(gè)文件夾存放程序(代碼) 不要用中文和空格
?????? 2) 新建一個(gè)java 工程(Project)
?????? 3) 建包建類
?
2. 快捷鍵
?????? alt + / :代碼自動(dòng)補(bǔ)齊,需要配置的
????????????? 打開preferences(首選項(xiàng)), 搜keys,打開快捷鍵配置面板
????????????? 搜 alt+/ ,取消綁定
????????????? 搜 content assist ,取消原先的綁定,配置成alt+/
?
?????? ctrl+1: 錯(cuò)誤自動(dòng)修復(fù),注意,放行的紅叉是可修復(fù)的,圓形的是不可修復(fù)的
?
?????? 導(dǎo)包的三種方式:
?????? 1)將類名敲完整,按下alt+/ 進(jìn)行補(bǔ)齊,會(huì)自動(dòng)導(dǎo)包
?????? 2) ctrl+1,修正錯(cuò)誤
?????? 3) ctrl+shift+o 整理包,導(dǎo)入需要的包,去掉多余的導(dǎo)包語句
?
?????? ctrl+shift+f : 代碼格式化
?
?????? 管理透視圖
??????
?????? ctrl+2,L? 自動(dòng)聲明變量
?
?????? shift+enter? 光標(biāo)直接進(jìn)入下一行
?
?????? ctrl+alt+方向鍵(向上向下)? 復(fù)制行
?
?????? alt+ 方向鍵(向上向下) 移動(dòng)當(dāng)前行
?
3. 斷點(diǎn)調(diào)試
?????? 1) 可以對(duì)程序進(jìn)行調(diào)試
?????? 在行的開頭雙擊左鍵打斷點(diǎn),用debug方式來運(yùn)行程序,程序就會(huì)停留在斷點(diǎn)位置
?????? F5 跳入(step into) 跳入方法內(nèi)部? F6 跳過,讓當(dāng)前行運(yùn)行? F7跳出返回上一層程序
?????? resume 直接運(yùn)行到下一個(gè)斷點(diǎn)
?
?????? 2) 查看源代碼建議使用斷點(diǎn)調(diào)試的方式,注意當(dāng)前運(yùn)行環(huán)境需要包含源碼
?
4. junit單元測(cè)試
?????? 1) 寫一個(gè)java類,聲明測(cè)試方式
?????? ?????? 修飾符為 public void ,
?????? ?????? 在方法前面加注解,(@Test)
?????? ?????? 此方法就可以進(jìn)行測(cè)試了(交給junit運(yùn)行)
?????? 2) 需要在測(cè)試方法前做初始化工作
?????? ????? 寫一個(gè)靜態(tài)方法? public static void init()
?????? ?????? 在方法前加注解 @BeforeClass
?????? 3) 需要在測(cè)試后釋放資源
?????? ????? 寫一個(gè)靜態(tài)方法
?????? ?????? 在方法前加注解 @AfterClass
?
二、jdk5新特性
?
java 1995 誕生,版本: jdk1.0—jdk1.1 – jdk1.2 – jdk1.3 –jdk1.4 – 2005老虎版 jdk5.0 – jdk6 -- jdk7
?
1. 靜態(tài)導(dǎo)入
1) 導(dǎo)入類的靜態(tài)屬性
import static java.lang.System.out;
out.println("haha");
2) 導(dǎo)入類的靜態(tài)方法
import static java.lang.Math.*; // 導(dǎo)入Math類的所有靜態(tài)成員
int num = abs(-10);
?
2. 基本數(shù)據(jù)類型的包裝類
int --> Integer
byte --> Byte
short --> Short
long --> Long
char --> Character
double --> Double
float --> Float
boolean --> Boolean
?
1) Integer x = 1; x = x + 1;? 經(jīng)歷了什么過程?裝箱à拆箱à裝箱
2) 為了優(yōu)化,虛擬機(jī)為包裝類提供了緩沖池, Integer池的大小 -128~127 一個(gè)字節(jié)的大小
3) String池
/*1. String s = "abc", 虛擬機(jī)首先會(huì)檢查String池里有沒有"abc"對(duì)象(通過equals方法)
?????? // 如果有,直接返回引用,如果沒有,會(huì)在池里創(chuàng)建一個(gè)“abc”對(duì)象,并返回引用
?????? String s1 = "abc";
?????? String s2 = "abc";
?????? System.out.println(s1==s2); // result: true
?????? */
??????
?????? /* 2. String str = new String("abc"); 不管緩沖池是否有"abc", 都會(huì)在堆內(nèi)存創(chuàng)建一個(gè)"abc"對(duì)象,返回引用
?????? // 此時(shí),負(fù)責(zé)檢查并維護(hù)緩沖池,其實(shí)堆內(nèi)存的對(duì)象是緩沖池中"abc"對(duì)象的一個(gè)拷貝
?????? String s1 = new String("abc");
?????? String s2 = new String("abc");
?????? System.out.println(s1==s2); // result: false
?????? */
??????
?????? /* 3. String s = "a" + "b" + "c" + "d";? java編譯器有個(gè)合并已知量的優(yōu)化功能
?????? // 在編譯階段就把"a" + "b" + "c" + "d" 合并為 ”abcd“
?????? String s = "a" + "b" + "c" + "d";
??? //? String s = "abcd";
?????? System.out.println(s=="abcd");// result: true
?????? */
??????
?????? /* 4.? String s1 = "a"; String s2 = "b"; String s3 = s1 + s2;
?????? // String是常量,不能相加的,java如何實(shí)現(xiàn)的?
?????? ?StringBuilder sb = new StringBuidler(s1);
?????? ?sb.append(s2);
?????? ?s3 = sb.toString();
?????? ?
?????? ?也就是說實(shí)際上s3是方法返回的String對(duì)象
?????? ?凡是方法返回的字符串對(duì)象都是在堆內(nèi)存的,并且不負(fù)責(zé)維護(hù)緩沖池
?????? */
?????? ?String s1 = "a";
?????? ?String s2 = "b";
?????? ?String s3 = s1 + s2; // 堆內(nèi)存的對(duì)象
?????? ?
?????? ?System.out.println(s3=="ab");// result: false
?
3. 增強(qiáng)for循環(huán)
1) 作用:
?對(duì)存儲(chǔ)對(duì)象的容器進(jìn)行迭代??
2) ?jdk5以前怎么迭代
3) 增強(qiáng)for循環(huán)迭代數(shù)組
String [] arr = {"a", "b", "c"};?? //數(shù)組的靜態(tài)定義方式,只試用于數(shù)組首次定義的時(shí)候
// 傳統(tǒng)方式
for(int i=0; i<arr.length; i++) {
??? // i依次表示數(shù)組的角標(biāo)
??? String s = arr[i];
??? System.out.println(s);
}
System.out.println("-------------------------------------");
// 在jdk5中我們可以使用增強(qiáng)for循環(huán)迭代
// 增強(qiáng)for循環(huán)括號(hào)里寫兩個(gè)參數(shù),第一個(gè)是聲明一個(gè)變量,變量類型必須是數(shù)組元素的類型
// 第二個(gè)就是需要迭代的容器
// for循環(huán)會(huì)循環(huán)容器的length次, 每次都將容器的第n-1個(gè)元素賦值給聲明的變量
for(String s : arr) {
??? // 循環(huán)體, 執(zhí)行arr.length
??? // 每次都將arr中的第n-1個(gè)元素給s
??? System.out.println(s);?? //
}
?
4) 單列集合 Collection
List list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
?
// 傳統(tǒng)方式1
/* 1.獲得迭代器
Iterator iter = list.iterator();
// 2.循環(huán)判斷迭代器是否有下一個(gè)
while(iter.hasNext()) {
??? String str = (String) iter.next(); // 將迭代器的指針移向下一個(gè),并將迭代當(dāng)前指向的元素返回
??? System.out.println(str);
}
*/
// 傳統(tǒng)方式2
for(Iterator iter=list.iterator(); iter.hasNext(); ) {
??? String s = (String) iter.next();
??? System.out.println(s);
}
System.out.println("--------------------------------");
// 增強(qiáng)for循環(huán), 沒有使用泛型的集合能不能使用增強(qiáng)for循環(huán)迭代?能
for(Object obj : list) {
??? String s =? (String) obj;
??? System.out.println(s);
}
?
5) 雙列集合 Map
Map map = new HashMap();
map.put("a", "aaa");
map.put("b", "bbb");
map.put("c", "ccc");
?
// 傳統(tǒng)方式迭代1
// 1. 獲得所有的key
Set keys = map.keySet();
// 2.迭代keys獲得所有的key
Iterator iter = keys.iterator();
while(iter.hasNext()) {
??? String key = (String) iter.next(); // a b c
??? // 3.根據(jù)key獲得對(duì)應(yīng)的value
??? String value = (String) map.get(key);
??? System.out.println(key + "=" + value);
}
System.out.println("---------------------------------");
// 傳統(tǒng)方式2,必須掌握這種方式
// 1.獲得所有的鍵值對(duì)Entry對(duì)象
Set entrys = map.entrySet();
// 2.迭代出所有的entry
iter = entrys.iterator();
while(iter.hasNext()) {
??? Map.Entry entry = (Entry) iter.next();
??? // 分別獲得key和value
??? String key = (String) entry.getKey();
??? String value = (String) entry.getValue();
??? System.out.println(key + "=" + value);
}
System.out.println("-------------------------------------");
System.out.println("增強(qiáng)for循環(huán)迭代,");
// 增強(qiáng)for循環(huán)迭代,
// 原則上map集合是無法使用增強(qiáng)for循環(huán)來迭代的,
// 因?yàn)樵鰪?qiáng)for循環(huán)只能針對(duì)實(shí)現(xiàn)了Iterable接口的集合進(jìn)行迭代
// Iterable是jdk5中新定義的接口,就一個(gè)方法iterator方法
// 只有實(shí)現(xiàn)了Iterable接口的類,才能保證一定有iterator方法
// java有這樣的限定是因?yàn)樵鰪?qiáng)for循環(huán)內(nèi)部還是用迭代器實(shí)現(xiàn)的
?
// 而實(shí)際上,我們可以通過某種方式來使用增強(qiáng)for循環(huán)
for(Object obj : map.entrySet()) {
??? // obj 依次表示Entry
??? Map.Entry entry = (Entry) obj;
??? System.out.println(entry.getKey() + "=" + entry.getValue());
}
6)集合迭代注意問題
// 在使用迭代器迭代集合的過程中,不能對(duì)集合進(jìn)行增刪操作
@Test
public void test4() {
??? List list = new ArrayList();
???
??? list.add("wangwu");
??? list.add("zhangsan");
??? list.add("lisi");
?
??? Iterator iter = list.iterator();
??? while(iter.hasNext()) {
?????? String name = (String) iter.next();
?????? if("wangwu".equals(name)) {
?????????? // 從集合中刪掉
?????????? //list.remove(name);
?????????? // 迭代過程中刪除元素需要調(diào)用迭代器的方法
?????????? iter.remove();??? // 刪除我迭代的集合被我迭代的最后一個(gè)元素
?????? }
??? }
// 1 2 4
??? System.out.println(list.size());
}
?
@Test
public void test5() {
??? List list = new ArrayList();
???
??? list.add("aa");
??? list.add("bb");
???
??? // 使用ListIterator迭代器
??? ListIterator listIterator = list.listIterator();
??? while(listIterator.hasNext()) {
?????? listIterator.next();
?????? // 迭代過程中增加元素
?????? listIterator.add("cc");
??? }
??? System.out.println(list.size());
}
7) 增強(qiáng)for循環(huán)注意問題
//在使用增強(qiáng)for循環(huán)時(shí),不能對(duì)元素進(jìn)行賦值
int[] arr = {1,2,3};
?
for(int num : arr) {
??? num = 0;
}
?
System.out.println(arr[1]);
?
4. 可變參數(shù)
1) jdk5中方法的形參可以定義為可變參數(shù),傳入實(shí)參個(gè)數(shù)可變
// 設(shè)計(jì)一個(gè)方法求n個(gè)數(shù)的和
public static int getSum(int... arr) {
??? // 可變參數(shù)在方法中仍被看做一個(gè)數(shù)組
??? int sum = 0;
??? for(int num : arr)
?????? sum += num;
??? return sum;
}
?
2)Arrays.asList為例演示傳入不同參數(shù)的情況
// list長(zhǎng)度為3
List list = Arrays.asList("a","b","c");
// list長(zhǎng)度為1, 因?yàn)榭紤]1.4語法
String[] arr = {"a","b","c"};
List list = Arrays.asList(arr);
// 同時(shí)符合1.4和1.5的語法,此時(shí)會(huì)優(yōu)先考慮1.4的語法
?????? // 原因是有了新功能要保證以前的代碼不出錯(cuò),向后兼容
// 現(xiàn)在就需要將arr作為一個(gè)元素存入集合
Object obj = arr;
List list2 = Arrays.asList(obj);?? // 此時(shí)只符合1.5的語法,不符合1.4的語法,沒有歧義
?
List list3 = Arrays.asList(new Object[]{arr});?? // 優(yōu)先考慮1.4,所以數(shù)組會(huì)拆開
//System.out.println(list3.size());
// 基本數(shù)據(jù)類型數(shù)組只符合1.5的語法
int[] nums = {1,2,3};
list = Arrays.asList(nums);
System.out.println(list.size());
?
5. 枚舉
問題:對(duì)象的某個(gè)屬性的值不能是任意的,必須為固定的一組取值其中的某一個(gè)
解決辦法:
1)??? 在setGrade方法中做判斷,不符合格式要求就拋出異常
2)??? 直接限定用戶的選擇,通過自定義類模擬枚舉的方式來限定用戶的輸入
?????? 寫一個(gè)Grade類,私有構(gòu)造函數(shù),對(duì)外提供5個(gè)靜態(tài)的常量表示類的實(shí)例
3)??????? jdk5中新定義了枚舉類型,專門用于解決此類問題
4)??????? 枚舉就是一個(gè)特殊的java類,可以定義屬性、方法、構(gòu)造函數(shù)、實(shí)現(xiàn)接口、繼承類
//枚舉類就是一個(gè)java類,也可以聲明屬性,方法,構(gòu)造函數(shù)
public enum Grade4 {
??? A("90-100"),B("80-89"),C("70-79"),D("60-69"),E("0-59");
???
??? private String value;
??? private Grade4(String value) {
?????? this.value = value;
??? }
???
??? public String getValue() {
?????? return value;
??? }
}
?
//枚舉類就是一個(gè)java類, 也可以繼承抽象和實(shí)現(xiàn)接口
public enum Grade5 {
??? // 抽象類不能創(chuàng)建實(shí)例對(duì)象
??? A("90-100"){
?????? // new了一個(gè)Grade5的子類實(shí)例
?????? public String toLocaleString() {
?????????? return "優(yōu)";
?????? }
??? }
??? ,B("80-89"){
?????? // new了一個(gè)Grade5的子類實(shí)例
?????? public String toLocaleString() {
?????????? return "良";
?????? }
??? }
??? ,C("70-79"){
?????? // new了一個(gè)Grade5的子類實(shí)例
?????? public String toLocaleString() {
?????????? return "中";
?????? }
??? }
??? ,D("60-69"){
?????? // new了一個(gè)Grade5的子類實(shí)例
?????? public String toLocaleString() {
?????????? return "差";
?????? }
??? }
??? ,E("0-59"){
?????? // new了一個(gè)Grade5的子類實(shí)例
?????? public String toLocaleString() {
?????????? return "不及格";
?????? }
??? };
???
??? private String value;
??? private Grade5(String value) {
?????? this.value = value;
??? }
???
??? public String getValue() {
?????? return value;
??? }
???
??? // 對(duì)外提供一個(gè)方法,返回枚舉的本地信息
??? // 一個(gè)方法不知道如何實(shí)現(xiàn),可以定義為抽象的
??? public abstract String toLocaleString();
???
}
?
l? 練習(xí):請(qǐng)編寫一個(gè)關(guān)于星期幾的枚舉WeekDay,要求:
???? 枚舉值:Mon,Tue,Wed,Thu,Fri,Sat,Sun ?星期一。。。。星期日
???? 該枚舉要有一個(gè)方法,調(diào)用該方法返回中文格式的星期。
?
?
6. 反射
1)java代碼的階段
一段java代碼在程序運(yùn)行期間會(huì)經(jīng)歷三個(gè)階段: source-->class-->runtime
?
2) Class 對(duì)象
?????? 在java中用一個(gè)Class對(duì)象來表示一個(gè)java類的class階段
?????? Class對(duì)象封裝了一個(gè)java類中定義的成員變量、成員方法、構(gòu)造方法、類名、包名等
獲得class對(duì)象的三種方式和區(qū)別
// 1. 根據(jù)給定的類名來獲得 ?用于類加載
String classname = "cn.itcast.reflect.Person";?? // 來自配置文件
Class clazz = Class.forName(classname);?? // 此對(duì)象代表Person.class
?
?
?
// 2. 如果拿到了對(duì)象,不知道是什么類型 ??用于獲得對(duì)象的類型
Object obj = new Person();
Class clazz1 = obj.getClass();? // 獲得對(duì)象具體的類型
?
// 3. 如果是明確地獲得某個(gè)類的Class對(duì)象? 主要用于傳參
Class clazz2 = Person.class;???
// 在java中所有的類型都會(huì)對(duì)應(yīng)一個(gè)Class對(duì)象 int Integer
Class intClazz = int.class;
Class intarrClazz = int[].class;
Class voidClazz = void.class;
?
3)反射
反射就是獲得一個(gè)java類的各個(gè)組成部分
??? // 反射類的成員方法
??? Class clazz = Person.class;
??? Method method = clazz.getMethod(methodName, new Class[]{paramClazz1, paramClazz2});
??? method.invoke();
???
??? // 反射類的構(gòu)造函數(shù)
??? Constructor con = clazz.getConstructor(new Class[]{paramClazz1, paramClazz2,...})
??? con.newInstance(params...)
?
??? // 反射類的屬性
??? Field field = clazz.getField(fieldName);
??? field.setAccessible(true);
??? field.setObject(value);
?
4) 反射用在哪里
?????? 到底框架是什么?? 框架就是將開發(fā)中大量重復(fù)的代碼集中起來寫個(gè)通用的程序
?????? 框架就是用反射來實(shí)現(xiàn)的
?????? 框架需要現(xiàn)在的類調(diào)用將來寫的類
?
?????? 框架是將來的程序員調(diào)用的,框架不能實(shí)現(xiàn)完整的功能,框架只是一些一些通用的代碼
?????? 框架要運(yùn)行一定會(huì)依賴將來寫的類
?????? 現(xiàn)在寫的類要調(diào)用將來寫的類,我們先針對(duì)接口進(jìn)行調(diào)用,將來的類需要實(shí)現(xiàn)接口,那么方法就固定了
?????? 但是將來寫的類的類名我們無法獲知,這時(shí)就需要調(diào)用者通過配置文件告訴框架具體的類名
?
7. 泛型
1) 泛型是一種可變化的類型
?????? 類型不確定,需要調(diào)用者來指定
??????
2) 用途:
?????? 一個(gè)類的多個(gè)成員方法用到的參數(shù)類型或返回值類型都是未知的類型,但又需要是同一個(gè)類型,就可將方法的
?????? 參數(shù)類型定義為泛型,此泛型必須在類上先予以聲明才能在方法中使用
?
?????? 一個(gè)方法的多個(gè)參數(shù)和返回值需要是同一個(gè)類型,也可以用泛型來解決,在返回值前面聲明泛型
?
3. 泛型的基本概念
以List<E>為例:<>念著typeof 例, List<String> 就是 List typeof String
List<E>中的E稱為類型參數(shù)變量???? 方法定義參數(shù)形式參數(shù)?
List<Integer>中的Integer稱為實(shí)際類型參數(shù)
整個(gè)List<E>稱為泛型類型?? GenericType
整個(gè)List<Integer>稱為參數(shù)化的類型
?
4. 泛型的使用
?????? 1)使用帶泛型的類時(shí),在創(chuàng)建對(duì)象時(shí)可以為泛型指定實(shí)際類型參數(shù),指定的具體類型相當(dāng)于給泛型傳參
?????? 2)子類在繼承父類的時(shí)候,可以為父類定義的泛型指定實(shí)際類型參數(shù)
?????? class B<T>
?????? class A extends B<String>
?????? 通過子類A獲得的父類類型就是一個(gè)參數(shù)化的類型
?????? 3)調(diào)用方法時(shí)傳入?yún)?shù)的具體類型將作為方法中泛型的實(shí)際類型
?
總結(jié)
以上是生活随笔為你收集整理的01-java基础加强,eclipse工具使用,快捷键,断点调试,单元测试,jdk5新特性,增强for循环,集合map,list,可变参数,枚举,反射,泛型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 美团生意贷可以循环使用吗
- 下一篇: Tomcat方面的知识点