1. 程式人生 > >Java學習筆記整理

Java學習筆記整理

1.
擴充套件的賦值運算子其實隱含了一個強制型別轉換
  s += 1;
等價於 s = (s的資料型別)(s+1)




2.
鍵盤錄入
①import java.util.Scanner;


②Scanner sc = new Scanner(System.in);


③int x = sc.nextInt();




3.
implements 是實現介面的關鍵字(裡面有對介面抽象方法的具體實現)
interface 是代表介面的名詞
abstract 是抽象類


extend不支援多繼承方法,implements繼承只能繼承一個類,但是用implements來實現多個介面,用逗號隔開。
形式是:class A extends D implements B,C




定義一個介面的時候用 Interface  
在使用這個介面的時候用implements


4.
類的關係圖示中:
—> (實線箭頭)表示繼承
--> (虛線箭頭)表示介面類interface
—  (實線)     表示介面的具體實現類implements


5.
 extend  設定泛型上限(父類)
 super   設定泛型下限(子類)


通常對集合中的元素進行取出操作時,可以用下限


6.
集合的一些技巧


需要唯一嗎? 
需要:Set
    需要制定順序:
           需要:TreeSet
           不需要:HashSet
           但是想要一個和儲存一致的順序:有序:LinkHashSet


不需要:List
    需要頻繁增刪嗎?
      需要:LinkedList
      不需要:ArrayList


7.
Runtime沒有構造方法摘要,說明這類不可以建立物件。
又發現還有非靜態的方法,說明這類應該提供靜態的返回該類物件的方法
而且只有一個,說明Runtime類使用了單例設計模式。


8.
位元組流的兩個頂層父類
①InputStream   ②OutputStream
字元流的兩個頂層父類
①Reader       ②Writer




//需求:將一些文字儲存到硬碟的一個檔案中
記住,如果要操作文字資料,建議優先考慮字元流
而且要將資料從記憶體寫到硬碟上,要使用字元流中的輸出流Writer


既然是往一個檔案中寫入資料,那麼在建立物件是,就必須明確檔案
檔案不存在,則自動建立
檔案存在,則會被覆蓋
eg. FileWriter fw = new FileWriter("demo.txt");


如果建構函式中加入true,可以實現對檔案進行續寫


//需求:讀取一個文字檔案,將讀取的字元列印到控制檯
①建立讀取字元資料的流物件


在建立讀取流物件時,必須要明確被讀取的檔案,及檔案必須存在
用一個讀取流關聯一個已存在檔案
FileReader fr = new FileReader("demo.txt");


//使用read方法讀取單個字元
 
9.
裝飾設計模式:對一組物件的功能進行增強時,就可以使用該模式進行問題的解決


繼承和裝飾都能實現對功能的拓展增強


有什麼區別呢?
裝飾比繼承更為靈活


特點:裝飾和被裝飾類都必須所屬於同一個藉口或者父類


10.
轉換流:
InputStreamReader:位元組到字元的橋樑,解碼。
OutputStreamWriter:字元到位元組的橋樑,編碼。


流的操作規律:
之所以要弄清楚這個規律,是因為流物件太多,開發是不知道用哪個物件合適


想要知道開發時用到哪些物件,只要通過四個明確即可


①明確源和目的(匯)
   源:InputStream  Reader
   目的:OutputStream  Writer
②明確資料是否是純文字資料
   源:是純文字:Reader
       否:InputStream
   目的:是純文字: Writer
         否:OutputStream
③明確具體的裝置
   源裝置:
      硬碟:File
      鍵盤:System.in
      記憶體:陣列
      網路:Socket流
   目的裝置:
      硬碟:File
      控制檯:System.out
      記憶體:陣列
      網路:Socket流   
④是否需要其他額外功能
     1.是否需要高效(緩衝區):
        是:就加上buffer
  
需求1:複製一個文字檔案。


      1.明確源和目的。
       源:InputStream Reader
       目的:OutputStream Writer
      2.是否是純文字?
       是:
       源:Reader
       目的:Writer
      3.明確具體裝置
       源:
         硬碟:File
       目的:
         硬碟:File


       FileReader fr = new FileReader("a.txt")
       FileWriter fw = new FileWriter("b.txt")
      4.需要額外功能嗎?
       需要:需要高效
       BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));
       BufferedWriter bufw = new BufferedWriter(new FileWriter("b.txt"));


 
需求2:讀取鍵盤錄入資訊,並寫入到一個檔案中。


      1.明確源和目的。
       源:InputStream Reader
       目的:OutputStream Writer
      2.是否是純文字?
       是:
       源:Reader
       目的:Writer
      3.明確具體裝置
       源:
         鍵盤:System.in
       目的:
         硬碟:File


       InputStream is = System.in;
       FileWriter fw = new FileWriter("b.txt");
       這樣做就可以完成,但是麻煩,將讀取的位元組資料轉成字串,再有字元流操作。
      4.需要額外功能嗎?
       需要:轉換,將位元組流轉成字元流,因為明確的源是Reader,這樣操作文字資料更便捷
             所以要將已有的位元組流轉成字元流,使用到位元組—>字元,InputStreamReader;
       InputStreamReader isr = new InputStream(System.in);
       FileWriter fw = new FileWriter("b.txt");


       還需要功能想高效
       BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
       BufferedWriter bufw = new BufferedWriter(new FileWriter("b.txt");




需求3:將一個檔案檔案資料顯示在控制檯上


      1.明確源和目的。
       源:InputStream Reader
       目的:OutputStream Writer
      2.是否是純文字?
       是:
       源:Reader
       目的:Writer
      3.明確具體裝置
       源:
         硬碟:File
       目的:
         控制檯:System.out


       FileReader fr = new FileReader("a.txt");
       OutputStream out = System.out; 
      4.需要額外功能嗎?
       需要,轉換:
       FileReader fr = new FileReader("a.txt");
       OutputStreamWriter osw = new OutputStreamWriter(System.out));
       需要,高效
       BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));
       BufferedWriter bufw = new BufferedWriter(new FileWriter(System.out));


需求4:讀取鍵盤錄入資料,顯示在控制檯上
       1.明確源和目的。
       源:InputStream Reader
       目的:OutputStream Writer
      2.是否是純文字?
       是:
       源:Reader
       目的:Writer
      3.明確裝置
       源: 
           鍵盤:System.in
       目的:
           控制檯:System.out
       
       InputStream is = System.in;
       OutputStream os = System.out;
      4.明確額外功能
       需要轉換,因為是位元組流,但是操作的卻是文字資料
       所以使用字元流操作起來更為便捷
       InputStreamReader isr = new InputStreamReader(System.in);
       OutputStreamWriter osw = new OutputStreamWriter(System.out);


       為了使其高效
       BufferedStreamReader bufr = new BufferedReader(new InputStreamReader(System.in));
       BufferedStreamWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));




需求5:將一箇中文字串資料按指定的編碼表寫入到一個文字檔案中
      1.目的:OutputStream Writer
      2.是純文字:Writer
      3.裝置:鍵盤File
      FileWriter fw = new FileWriter("a.txt");
      fw.writer("你好");
 
      注意:既然需求中已經明確了指定的編碼表的的動作
      那就不可以使用FileWriter ,因為FileWriter內部是使用預設的本地碼錶
      只能使用其父類,OutputStreamWriter;
      OutputStreamWriter接收一個位元組輸出流物件,既然是操作檔案,那麼該物件應該是FileOutputStream


      OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("a.txt"),charsetName);
      
      需要高效:
      BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("a.txt").charsetName));


什麼時候使用轉換流呢
      1.源或目的對應得裝置是位元組流,但是操作的卻是文字資料,可以使用轉換作為橋樑
        提高對文字操作的便捷
      2.一旦操作文字涉及到具體的指定編碼表時,必須使用轉換流。




11.
抽象類(abstract class)和介面(instance)的聯絡和區別:


   1、抽象類和介面都不能直接例項化,如果要例項化,抽象類變數必須指向實現所有抽象方法的子類物件,介面變數必須指向實現所有介面方法的類物件。


   2、抽象類要被子類繼承,介面要被類實現。


   3、介面只能做方法申明,抽象類中可以做方法申明,也可以做方法實現


   4、接口裡定義的變數只能是公共的靜態的常量,抽象類中的變數是普通變數。


   5、抽象類裡的抽象方法必須全部被子類所實現,如果子類不能全部實現父類抽象方法,那麼該子類只能是抽象類。同樣,一個實現介面的時候,如不能全部實現介面方法,那麼該類也只能為抽象類。


   6、抽象方法只能申明,不能實現。abstract void abc();不能寫成abstract void abc(){}。


   7、抽象類裡可以沒有抽象方法


   8、如果一個類裡有抽象方法,那麼這個類只能是抽象類


   9、抽象方法要被實現,所以不能是靜態的,也不能是私有的。


   10、介面可繼承介面,並可多繼承介面,但類只能單根繼承。


  特別是對於公用的實現程式碼,抽象類有它的優點。抽象類能夠保證實現的層次關係,避免程式碼重複。然而,即使在使用抽 象類的場合,也不要忽視通過介面定義行為模型的原則。從實踐的角度來看,如果依賴於抽象類來定義行為,往往導致過於複雜的繼承關係,而通過介面定義行為能 夠更有效地分離行為與實現,為程式碼的維護和修改帶來方便。




12.
系統找不到指定檔案


問題在:d:\test.txt這個檔案。此檔案沒有副檔名(即不用寫副檔名)


解決方法:電腦工具欄-資料夾選項(左上方)-檢視-高階設定:-隱藏已知檔案型別的副檔名(勾選去掉-應用-確定)




13.
如何新增外掛?(使用JFrame圖形化介面操作Swing)
File-->New-->Other-->Wizards中選擇相關檔案
(如要用更加圖形化的操作Swing選擇WindowsBuider下的Swing Design中的JFrame)




14.
傳送與接收可以開啟2個console視窗觀察演示,注意選擇DisplaySelectConsole


15.
常用dos命令
可以在命令提示符中使用
../ 上一層目錄
md 資料夾名 新建資料夾
cd 資料夾名 進入到該目錄(重要)
cd.. 返回上一層目錄
cd\ 返回根目錄
cd.>檔名 新建檔案
rd 資料夾名 刪除資料夾(只能刪除空資料夾)
copy 檔案(夾)名1 檔案(夾)名2 1複製到2中
move 檔案(夾)名1 檔案(夾)名2 1剪下到2中
del 檔名 刪除檔案
del 資料夾名 刪除資料夾內的所有檔案
ren 檔案(夾)名1 檔案(夾)名2 將名字1改成名字2
dir 資料夾名 檢視該目錄下的所有檔案資訊
type 檔名 檢視檔案內容


16.
在cmd下執行java程式時注意目錄中加上包名
eg. java 包名.class檔名  (java和包名之間有空格)
同時,用java命令時,應該執行的是class檔案,在bin資料夾中,src中的是java檔案


17.
伺服器mycat程式碼如何在本地瀏覽器開啟網頁
①執行程式碼
②馬上用IE瀏覽器開啟例如http://192.168.0.102:9090/格式的網址即可
     192.168.0.102為本機IP地址,9090為程式碼中服務端socket的埠號


程式執行結果窗口出現例如以下資訊:


GET / HTTP/1.1 請求行 請求方式 /myweb/1.html  請求的資源路徑 http協議版本
請求訊息頭,屬性名:屬性值
Accept: text/html, application/xhtml+xml, image/jxr, */*//可以接受的網頁型別
Accept-Language: zh-CN
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393
Accept-Encoding: gzip, deflate
Host: 192.168.0.102:9090
Connection: Keep-Alive
//空行
//應答體




18.
網路結構:
 1.C/S  client/server
   
  特點:
     該結構的軟體,客戶端和服務端都需要編寫
     開發成本較高,維護較為麻煩
  好處:
     客戶端在本地可以分擔一部分運算


 2.B/S  browser/server


  特點:
      該結構的軟體,只開發服務端,不開發客戶端,因為客戶端直接由瀏覽器取代
      開發成本相對低,維護更為簡單
  缺點:
      所有運算都在伺服器端進行


19.碰撞實驗
當遊戲設計中的人物移動過程中,遇到了障礙,應該不能通過障礙,此時我們就要考慮所有模型
之間的碰撞問題,也就是我們所說的碰撞實驗
模型碰撞思想
1.人物在螢幕上顯示,顯示在哪裡?程式怎麼知道人物的位置?


2.什麼是障礙?計算機如何知道樹木就是障礙?羊不是障礙?
 二維陣列中的資料1代表障礙,0代表空地
 我們設計資料2代表人物,人物的資料在原始的二維陣列中是不存在的,因此我們把
 人物新增到程式中時,必須把這個資料2放到二維陣列中
 
3.當人物遇到障礙後,怎麼辦?障礙針對人物的位置不同,是否會對人物的移動產生影響
碰到障礙時不做任何事情,即在下列程式碼類似的加入到方向移動程式碼中
if(datas[wy][wx+1] == 1){//向著某一方向移動,加減一
//判斷遇到障礙後不做任何事情
return;
       }




碰撞模型設計
 碰撞模型是通過陣列中的資料進行檢測的,不同資料碰撞檢測不同


人物模型移動設計
 人物模型移動是通過兩個整數來模擬當前人物在陣列中的位置
 
碰撞模型實現
 對不可通過的資料進行判斷,比如說樹木對應得資料1,不可通過,那麼就可以使用判斷的方式提前結束移動操作


特殊碰撞實現
 當人物遇到箱子怎麼辦?
  


20.
建立Java Web專案直接在other裡選上Web Project,注意右上角開啟Java Enterprise檢視
同時,新建專案執行後 IE開啟網址格式為
http://本地本機地址:8080/專案名稱/  
http://192.168.0.102:8080/Web.html/




21.myeclipse常用快捷鍵:
            程式碼提示  Alt   /
            快速導包  ctrl shift o 
            程式碼修復  ctr1  1
            單行註釋  ctrl  /        取消 再按一遍
            多行註釋  ctrl shift /   取消 ctrl shift \
              刪除行  ctrl  d
        程式碼的格式化  ctrl shift F   有縮排的效果。有時候不好使,點選source - format
                查詢  ctrl  f
        移動選中文字  alt  上或下


22.Myeclipse編譯Java檔案出現無法載入主類的問題:沒有在bin檔案下生成class檔案
解決方法:project->properties->java build path->Libraries,將jar路徑不正確的引用(不用的)remove了,然後Add Extenal JARs,重新新增jar包。




23.debug的除錯模式(斷點除錯模式)
        * 使用這種模式,除錯程式(看到程式裡面資料的變化)


        * 使用debug第一步需要設定一個斷點(讓程式執行停止在這一行)
             - 顯示出來行號
             - 雙擊左邊,出現一個圓點,表示設定了一個斷點
        * 使用debug as 方式,執行程式
             - 提示是否進入到除錯頁面,yes
             - 在斷點的那一行,有一個綠色條,表示程式停止在這一行,沒有向下執行
        * 可以讓程式向下執行
             - 使用 step over ,快捷鍵是F6(單步執行)
             - resume  F8:表示除錯結束,直接向下執行
                    ** 比如當前的斷點之後還有斷點,跳到下一個斷點
                    ** 如果當前斷點後面沒有斷點,直接執行結束
         
        * debug的另外一個用途
             ** 檢視程式的原始碼(如api函式)
             ** F7 step into:進入到原始碼的方法
             ** step return:返回








24.jdk5.0新特性
jdk1.1  1.2  1.4  5.0  6.0  7.0  8.0
** 泛型、列舉、靜態匯入、自動拆裝想、增強for、可變引數
** 反射


 ==== 泛型 ====
 ① 泛型的簡介
        * 為什麼要使用泛型?
                - 一般用在集合上
                ** 比如現在把一個字串型別的值放入到集合裡面,這個值放入到集合之後,失去本身的型別,只能是Object型別
                這個時候,比如想要對這個值進行型別轉換,很容易出現型別轉換錯誤,可使用泛型來解決


        * 在集合上如何使用泛型
                - 常用集合 list set map
                - 泛型語法 集合<String> 比如 List<String>
        
            - 在list上使用泛型
                程式碼:
                @Test
                Public void testList(){
                     List<String> list = new ArrayList<String>();
                     list.add("aaaa");
                     list.add("bbbb");
                     list.add("bbbb");


                     Iterator<String> it = list.iterator();
                     while(it.hasNext){
                             System.out.println(it.next());
                 }


            - 在Set上來使用泛型
                 Set<String> set


            - 在Map上來使用泛型
                      key   value
                 Map<String,String> map


         * 在泛型裡面寫是一個物件,String 不能寫基本的資料型別 比如int
                ** 應該寫基本的資料型別對應的包裝類
                      byte -- Byte
                      short -- Short


                      int -- Integer


                      long -- Long


                      float -- Float
                      double -- Double
                      char -- Character
                      boolean -- Boolean


 ② 泛型使用在方法上
         * 定義一個數組,實現指定位置上的陣列元素的交換
         * 方法邏輯相同,只是資料型別不同,這個時候使用泛型方法
           - 使用泛型方法 需要定義一個型別,使用大寫字母 T 表示:任意的型別
             寫在返回值之前  eg .<T> void 
             表示定義了一個型別 這個型別是 T
           public static <T> void swap1(T[] arr,int a,int b){
                       T temp = arr[a];
                       arr[a] = arr[b];
                       arr[b] = temp;
           }
  
 ③ 泛型在類上的使用(瞭解)
         * 在一個類上定義一個型別,這個型別可以在類裡面直接使用


           public class TestDemo<T>{
               
               //可以在類裡面直接使用T的型別
               T aa;    
               public void test1(T bb){}


               //寫一個靜態方法 在類上面定義的泛型,不能在靜態方法裡面使用
               public static <A> void test2(A cc){}
               }


 ④ 泛型擦除
         * 首先泛型只是出現在原始碼階段,當編譯之後泛型就不存在了


         
               


 ==== 列舉 ====
 ① 什麼是列舉
          ** 需要在一定的範圍內取值,這個值只能是這個範圍內中的任意一個
          ** 現實場景:交通訊號燈,有三種顏色,但是每次只能亮三種顏色中的任意一個


          ** enum 列舉型別名稱 {物件1,物件2,物件3;} (注意分號位置)


          ** 列舉的構造方法也是私有的


          ** 特殊列舉的操作
          -- 在列舉類裡面有構造方法
                    ** 構造方法裡面有引數,需要在每個例項上面都寫引數
          -- 在列舉類裡面有抽象方法
                    ** 在列舉的每個例項裡面都重寫這個抽象方法




 ② 列舉的api的操作
          ** name():返回列舉的名稱
          ** ordinal():列舉的下標,下標從0開始
          ** valueOf(Class<T> enumType,String name):得到列舉的物件


          ** 還有兩個方法,但是這兩個方法不在api裡面,編譯的時候生成兩個方法
               - valueof(String name)  轉換列舉物件
               - values()  獲取所有列舉物件陣列




 ==== 靜態匯入(瞭解) ====
          * 可以再程式碼裡面,直接使用靜態匯入方式,匯入靜態方法或者常量
          * import static XX.XX.xxx (import java.util.Arrays.sort)


          ** 比如現在實現一個計算器,在Math類裡面


 ==== 自動拆裝箱 ====
          * 裝箱
               ** 把基本的資料型別轉換成對應的包裝類
          * 拆箱
               ** 把包裝類轉換成基本的資料型別
          **   
               //自動裝箱
               Integer i = 10;


               //自動拆箱
               int m = i;


          ** 在jdk1.4裡面實現拆裝箱
                //裝箱
                Integer m = new Integer(10);
                //拆箱
                int a = m.intValue();
                
          ** jdk是會向下相容的
          
          ** 練習
          public static void main(String[] args){
                 doSomething(10);
          }


          public static void doSomething(double m){
                  System.out.println("double...");


          public static void doSomething(Integer a){
                  System.out.println("Integer...");
          }
          == 執行的結果是會呼叫 doSomething(double m)
          == 首先在jdk1.4裡面肯定呼叫這個方法,如果呼叫下面的方法,需要型別轉換(10變成Integer要裝箱,Integer與int有區別),但是jdk1.4不能自動拆裝箱
          == 由於jdk是向下相容的,所有,在jdk1.4呼叫這個方法,在jdk5.0裡面還是會呼叫這個方法     
           
          ** 記住:八種基本的資料型別對應得包裝類
                  * int -- Integer
                  * char -- Character


 ==== 增強for迴圈 ====
          * 語法 for(遍歷出來的值 : 要遍歷的集合){}
          * 陣列:實現Iterable介面的集合可以使用增強for迴圈


          * 在集合上使用增強for迴圈遍歷
                  list set 實現了Iterable 介面,所以可以使用增強for迴圈
                  map沒有實現Iterable介面,所以不能使用增強for迴圈


          * 增強for迴圈出現目的:為了替代迭代器
          ** 增強for迴圈的底層實現就是迭代器




 ==== 可變引數 ====
          * 可變引數可以應用在什麼場景:
          ** 實現兩個數的相加,實現三個數的相加,四個數的相加
          -- 如果實現的多個方法,這些方法裡面邏輯基本相同,唯一不同的是傳遞的引數的個數,可以使用可變引數


          * 可變引數的定義方法: 資料型別...陣列的名稱  eg.(int...nums)
          * 理解為一個數組,這個陣列儲存傳遞過來的引數


          * 注意的地方
               (1)可變引數需要寫在方法的引數列表中,不能單獨定義
               (2)方法的引數列表中只能有一個可變引數
               (3)方法的引數列表中的可變引數,必須放在引數的最後  - add(int a,int...num)




25.反射
 ① 反射的原理(***理解***)
          * 應用在一些通用性比較高的程式碼中
          * 後面學到的框架,大多數都是使用反射來實現的


          * 在框架開發中,都是基於配置檔案開發
                     ** 在配置檔案中配置了類,可以通過反射得到類中的所有內容,可以讓類中的某個方法來執行


          * 類中的所有內容:屬性、沒有引數的構造方法、有引數的構造方法、普通方法


          * 畫圖分析反射的原理
                     * 首先需要把java檔案儲存到本地硬碟 .java
                     * 編譯java檔案,成.class檔案
                     * 使用jvm,把class檔案通過類載入器載入到記憶體中
                     * 萬事萬物都是物件,class檔案在記憶體中使用class類表示


                     * 當使用反射時候,首先需要獲取到Class類,得到了這個類之後,就可以得到class檔案裡面的所有內容
                            - 包含屬性、構造方法、普通方法
                     * 屬性通過一個類 Filed
                     * 構造方法通過一個類 Constructor
                     * 普通方法通過一個類 Method


          
 ②使用反射操作類裡面的屬性
          * 首先獲取到Class類
            Class clazz1 = Person.class;
            Class clazz2 = new Person().getClass();
            Class clazz3 = Class.forName("cn.itcast.test09.Person");


          * 比如:要對一個類進行例項化,可以new,不使用new,怎麼獲取?




                  //操作無引數的構造方法
                  //得到Class
                  Class c1 = Class.forName("cn.itcast.test.Person");
                  //得到Person的例項
                  Person p = (Person) c1.newInstance();
                  //設定值
                  p.setName("zhangsan");
                  System.out.println(p.getName());




                  //操作有引數的構造方法
                  //得到Class
                  Class c1 = Class.forName("cn.itcast.test.Person");
                  //使用有引數的構造方法
                  //c1.getConstructors();//獲取所有的構造方法
                  //傳遞是有引數的構造方法裡面引數型別,型別使用class形式傳遞
                  Constructor cs = c1.getConstructor(String class,String class);
                  //通過有引數的構造方法設定值
                  //通過有引數的構造方法建立Person例項
                  Person p1 = (Person) cs.newInstance("lisi","100");
                  System.out.println(p1.getId()+" "+p1.getName());




                  //操作name屬性
                  try {
                       //得到Class類
                       Class c2 = Class.forName("cn.itcast.test.Person");
                       //得到name屬性
                       //c2.getDeclaredFields();//表示得到所有的屬性
                       //得到Person類的例項
                       Person p11 = (Person) c2.newInstance();
                       //通過這個方法得到屬性,引數是屬性的名稱
                       Field f1 = c2.getDeclaredField("name");
                       //設定的是私有屬性,設定true為可操作
                       f1.setAccessible(true);
                       //設定name值  set方法,兩個引數:第一個引數是類的例項,第二個引數是設定的值
                       f1.set(p11,"wangwu");//相當於在p.name = "wangwu";
                       System.out.println(f1,get(p11));//相當於p.name
                   }catch(Exception e){
                       e.printStackTrace();
                   }
                  
          
 ③ 使用反射操作普通方法
           * 使用Method類表示普通方法
           * 程式碼
           //操作普通方法,比如操作 setName


           //得到Class類
           Class c4 = Class.forName("cn.itcast.test.Person");
           //得到Person例項
           Person p4 = (Person) c4.newInstance();
           //得到普通方法
           //c4.getDeclaredMethods();//得到所有的普通方法
           //傳遞兩個引數:第一個引數:方法名稱,第二個方法:通過方法設定的值
           Method m1 = c4.getDeclareMethod("setName",String.class);
           //讓setName方法執行,執行設定值
           //使用invoke傳遞兩個引數:第一個引數,person例項;第二個引數,設定的值
           //執行了invoke方法之後,相當於,執行了setName方法,同時通過這個方法設定了一個值是niuqi
           m1.invoke(p4,"niuqi");
           System.out.println(p4.getName()); 


           * //操作的私有的方法,需要設定值是true
           * //m1.setAccessible(true);


           * 當操作的方法是靜態的方法時候,因為靜態方法呼叫方式是 類名、方法名,不需要類的例項
           * 使用反射操作靜態方法的時候,也不需要例項
                - 在invoke方法的第一個引數裡面,寫一個null
                      - m1.invoke(null,"niuqi");




26.Tomcat的安裝及Myeclipse的配置
 ①下載免安裝版zip檔案,解壓資料夾到一個路徑中
 ②在Myeclipse的 Window - preference - Server Runtime Environments 中新增安裝的tomcat相同的版本,再瀏覽選擇①中所解壓出的資料夾,新增確定。
 ③最後,在Myeclipse中下方的servers中空白處右鍵點New - servers -選擇即可(若②完成時下方以及彈出相關tomcat則不需要進行③)
     


27.修復Myeclipse
 開啟安裝包(E盤Baiduyun資料夾),選擇repair,重新配置參考JavaWeb教程中day10的1  


28.Mycelipse匯入專案


File- import -General(Existing..) -Select root directory 中Browser瀏覽專案資料夾 -勾選下方Copy  projects into workspace -finish即可




29.Myeclipse匯入專案出現亂碼
 匯入 一個JSP 專案,註釋 出現 亂碼!(一般是不會發生的!)
    - 原因是因為,我的專案是 GBK編碼, 目前只要是國內的專案,一般都是吧(哈哈 有點絕對了)
      然而,我的MyEclispe 設定預設編碼 的是UTF-8 !所以,在單擊專案右鍵的時候,選擇 屬相欄,並沒有 GBK專案 
    - 解決方法:
       修改該專案的編碼格式
         修改單個工程的編碼方式:右鍵點選專案--Preferences--Resource--將Text
         file encoding改為GBK(下拉框沒有GBK可直接輸入框中)


30.Myeclipse中使用程式碼進行檔案建立時,若路徑只寫如(1.txt),則會在專案程式碼目錄下生成該檔案