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