這段時間看了一些java,急了一些筆記,記下一遍以後復習用!
2016-07-24 15:12:40
java很多語法都跟C#類似,下面列舉一些不同的地方******注意***** java中的系統方法首字母都是小寫的,而C#中首字母都是大寫的
1、java中繼承的用法
class children extends parent
{
}
而c#中:
class children :parent
{
}
java中繼承接口的用法
class children implements parent
{
}
而c#中:
class children :parent
{
}
2、還有一點很重要的事java中的main函數所在的類名必須和文件名相同。
其次是在一個文件中只能main函數所在的類是public修飾的,其他不能帶public ,一個文件中只能有一個public類。
java中的靜態成員既可以實例化對象調用,也可以類名來點出來,非靜態成員只能實例化對象調用。****沒有靜態類
而在C#中靜態成員不能實例化對象調用
3、java中方法的重寫就方法的覆蓋,貌似真的是覆蓋,就是重新寫一遍
而C#中的重寫要用關鍵字override,並且只能是抽象和虛方法或者標記為override才能重寫。
4、java中有一個特殊的static語句塊功能,static語句塊中的語句在構造函數之前執行且只執行一次
5、java和C#中初始化類的時候都是先初始化變量後執行函數代碼
6、java中final的用法:
不想讓類中的成員被子類修改
修飾類的時候,被修飾的類不能被繼承
變量被final修飾的時候,必須賦初值
final和const類似(只是類似)
C#中不行讓類被繼承可以用關鍵字sealed修飾(密封)
不能讓子類修改,不知道用什麼方法
7、java中的集合
java中的ArraList集合跟C#中很相似,兩者都是同樣的聲明方式。
一、List類型的集合
都是用的add方法(不同的事C#中的系統方法一般首字母大寫)
有一個不同的地方是java中集合的取值方式用的事get("這裡是對應的坐標")方法來取。而C#用的事跟數組一樣的方法用下標取值:a[0]。
C#中的鍵值對集合有兩種取值方法,一種是下標取值,一種是下標加鍵取值
java中獲取集合中數量的方法是size(),而C#中用的是count()方法。
刪除都是用的remove()方法,清空用的都是clear()方法。
LinkedList集合比ArrayList多了addFirst()和addLast()方法,分別指的是每次都添加在最前面或者最後面。(在有些需求的時候很有用)
vector和ArrayList的用法基本上一樣
stack和ArrayList的用法也是基本上一樣(但是值得注意的事stack因為棧的特點,所以每次插入新值的時候都是插在最前面的)
二、Map類型的集合(帶有鍵值對的集合,類似於C#中的鍵值對集合)
主要有Hashmap,Hashtable等
添加鍵值對用put()方法。
讀取方法:
//取出鍵的視圖
Iterator<String > iterator=hashMap.keySet().iterator();
//遍歷所有鍵
while (iterator.hasNext()) {
String string = (String) iterator.next();
((animal)hashMap.get(string)).sayhi();//讀取並調用方法
}
三、總結
1、如果要求線程安全,應該使用Vector、Hashtable
2、如果不要求線程安全,應該使用ArrayList、LinkedList、HashMap
3、如果要求鍵值對,則使用HashMap,Hashtable
4、如果數據量很大,又要線程安全考慮Vector
Java中兩個字符串比較值是否相等一定要用 s1.equals(s2)方法,不能直接用==來比較,這樣比較的只是字符串的引用地址。
四、java中子類構造函數中調用父類的構造函數用super();只能在子類的構造函數中寫
而C#中直接在子類構造函數後面寫:base()
例如:public son:father
{
son():base()
{
}
}
五、swing主要布局方式
flowLayout(流式布局)、borderLayout(邊界布局)、GridLayout(網格布局)等
六、java多線程
要使用多線程的類需要繼承Thread,需要繼承其他類的時候,要繼承Runnable接口
繼承Thread的時候,啟用線程的方法:
類名(繼承了Thread的) th=new 類名();
th.start();
繼承了Runnable接口的時候,啟用線程的方法:
類名 l=new 類名();
Thread th=new Thread(l);
th.start();
thread.currentThread().getName();//用於顯示當前是哪個線程在執行(顯示的事線程的下標)
防止多線程並發的方法,加上synchronized(object){需要阻止並發的代碼段}(如同C#中的Block鎖)
七、java IO流
(1)字節流
(2)字符流
1 public static void main(String[] args) { 2 FileReader fReader=null; //讀操作 3 FileWriter fileWriter=null; //寫操作 4 try { 5 fReader=new FileReader("e:\\wode.txt"); //直接讀取路徑 6 fileWriter=new FileWriter("e:/我的.txt"); 7 int n=0; 8 char[] c=new char[1024]; 9 while ((n=fReader.read(c))!=-1) {//循環讀取,讀到結尾返回-1(每次讀取c的大小) 10 String s=new String(c,0,n); //將字符數組轉換成字符串 11 //System.out.println(c); 12 fileWriter.write(s); //寫入數據 13 System.out.println("寫入成功"); 14 15 } 16 } catch (Exception e) { 17 e.printStackTrace(); 18 }finally{ 19 try { 20 fReader.close(); 21 fileWriter.close(); 22 } catch (IOException e) { 23 e.printStackTrace(); 24 } 25 } 26 } View Code ----------------------------------
按行讀寫文件(提高效率)
八、數據庫
(1)開發時數據庫的選擇條件:
<1>成本
<2>功能多少
<3>並發性(最終用戶多少)
<4>安全性
(2)基本查詢
<1> sal between 100 and 200 //表示 sal>=100 and sal<=200
<2>like(模糊查詢)
%:表示0到多個模糊字符 _;表示單個模糊字符
例如:1、查詢姓李的人的名字
select name from emp where name like '李%';
2、查詢名字的第二個字為明的人的名字
select name from emp where name like '_明%';
<3>查詢條件是一個字段符合多個條件的時候,一般用in(批量查詢)
例如:查詢員工的年齡是22,25,31歲的員工的姓名
select name fron emp where age in(22,25,31);
<4>判斷字段內容為null時返回指定的信息用isnull()函數
isnull(age,0); //這句話表示當age不為null時就返回實際的值,當為null時就返回0
<5>使用 Oder by 進行排序
order by age asc //默認升序
order by age desc //降序排列
例子:按照部門號升序,工資降序排列
select * from emp order by dempno asc ,sal desc;
<6> group by having
having 是用來篩選group by 分組後的數據
**在選擇列中如果有列、表達式、分組函數,那麼這些列和表達式必須有一個出現在group by子句中,否則就會出錯!
<7>經典案例
--顯示公司每個員工的名字和她的上級的名字
//這裡可以把emp表看成兩張表,分別是worker、boss
select worker.ename,boss.ename from emp worker,emp boss where worker.mgr=boss.empno
<8>分頁查詢
//這裡的num1指的是每一頁顯示的行數,num2指的是第幾頁
select top num1 * from emp where empno not in (select top num1*num2 from emp);
<8>***瘋狂在一個表中插入數據
insert into test(name,pass) select name,pass from test
insert into test select name,pass from test
<9>刪除表中的重復記錄
select distinct * into #temp from testTable
delete from tsetTable
insert into tsetTable select * from #temp
drop table #temp
<unique>唯一約束,不能重復,可以為null
<check>范圍約束
<default>默認值
<foreign key>外鍵 用法:foreign key reference table2(id)
(3)備份、恢復數據庫
備份:
backup database 要備份的數據庫名字 to disk='路徑';
恢復:
restore database 數據庫名 from disk='路徑'
九、JDBC
(1)演示使用JDBC-odbc橋接方式連接數據庫cakesales
<1>配置數據源(在控制面板→管理工具→odbc配置工具裡面)
<2>在程序中去連接數據源
*************1、使用Statement的方式*************************************
***代碼如下****
*************1、使用PreparedStatement的方式*************************************
****此方法有以下有點
1>效率有所提高(因為對sql語句進行了預編譯)
2>防止sql注入
***代碼如下****
(2)演示使用JDBC直接連接數據庫cakesales
1>不用配置數據源,直接代碼連接
2>此種方法需要引入外部的三個jar包,操作如下:
選中項目 右鍵-> 選擇屬性->選擇java構建路徑->選擇 庫 ->選擇添加 然後導入三個驅動文件即可(msbase.jar 、 mssqlserver.jar 、 msutil.jar)
3>遇到幾個典型的錯誤,如下
1)java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver
這個原因是因為沒有打開sqlserver的監聽端口導致的,解決方法如下:
*****選中計算機右鍵—>管理—>服務和應用程序—>sql server管理器—>sql server 網絡配置—>MSSQLSERVER協議—>TCP/IP—>IP 地址 就可以看見了
2)java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]對象名 'cakecategory' 無效。
這是由於SQLSERVER帳號的默認數據庫導致的。如果使用的庫不是當前帳號的默認庫的話,就會找不到表
解決方法:一、把帳號的默認數據庫改為要查詢的庫
修改方法:打開數據庫,在左側菜單欄->安全性->登錄名->sa 右鍵 屬性 找到下面的默認數據庫修改成要用的就行了
二、在執行查詢前先執行“use xxx”語句
*****推薦使用第二種解決方法!
*********************實例代碼如下**********************************
(3)演示使用JDBC直接連接數據庫進行ddl操作(也就是新建,刪除,備份,恢復數據庫)
******************************實例代碼如下******************************
十、java中的可變參數
關鍵字:...(沒錯,就是三個點。好像C語言中也是三個點)
例子:下面是我下的連接數據庫的可變參數
****c#中的可變參數用的是parameter關鍵字
十一、java網絡編程
和C#中的網絡編程Socket差不多
1>服務器端代碼及過程如下: 先建立ServerSocket監聽->然後等待客戶端連接->之後讀取客戶端發來的消息或者向客戶端發送消息
1 try { 2 //開始監聽 3 ServerSocket ss=new ServerSocket(9999); 4 //等待客戶端連接 5 Socket socket=ss.accept(); 6 7 //讀取客戶端發來的消息 8 BufferedReader bfr=new BufferedReader(new InputStreamReader(socket.getInputStream())); 9 10 //向客戶端發消息 11 PrintWriter pWriter=new PrintWriter(socket.getOutputStream(),true); 12 13 Scanner scanner=new Scanner(System.in); 14 while (true) { 15 16 String string=bfr.readLine();//讀取消息 17 System.out.println(string); 18 19 20 String s=scanner.next();//接收控制台輸入 21 pWriter.println(s);//發送消息 22 23 24 } 25 26 } catch (IOException e) { 27 // TODO Auto-generated catch block 28 e.printStackTrace(); 29 } View Code
2>客戶端代碼及過程如下: 先連接服務器->之後讀取服務器發來的消息或者向服務器發送消息
1 try { 2 Socket socket=new Socket("127.0.0.1", 9999);//連接服務器 3 4 //發送消息 5 PrintWriter pWriter=new PrintWriter(socket.getOutputStream(),true); 6 //讀取客戶端發來的消息 7 BufferedReader bReader=new BufferedReader(new InputStreamReader(socket.getInputStream())); 8 9 Scanner scanner=new Scanner(System.in); 10 while (true) { 11 //發送消息 12 String s=scanner.next(); 13 pWriter.println(s); 14 15 16 //讀取消息 17 String string=bReader.readLine(); 18 System.out.println(string); 19 20 } 21 22 } catch (Exception e) { 23 // TODO Auto-generated catch block 24 e.printStackTrace(); 25 } View Code
3>*****對象流傳輸例子如下,發送用的是ObjectOutputStream,接收用的是ObjectInputStream
*********************注意:對象必須要繼承Serializable序列化接口***************************************
1 public class conSK { 2 public static Socket sk; 3 ObjectOutputStream oop; 4 public conSK(){ 5 System.out.println("gr"); 6 try { 7 sk=new Socket("127.0.0.1", 9999); 8 9 } catch (Exception e) { 10 // TODO Auto-generated catch block 11 e.printStackTrace(); 12 } 13 } 14 15 /** 16 * 向服務器發送數據 17 * @param object 18 */ 19 public void sendMsg(Object object){ 20 try { 21 oop=new ObjectOutputStream(sk.getOutputStream()); 22 oop.writeObject(object); 23 //System.out.println(((User)object).getPwd()); 24 } catch (IOException e) { 25 // TODO Auto-generated catch block 26 e.printStackTrace(); 27 } 28 } 29 30 31 /** 32 * 接收服務器發過來的消息 33 * @return 返回Object類型 34 */ 35 public Object getMsg(){ 36 Object object =null; 37 try { 38 ObjectInputStream oop=new ObjectInputStream(sk.getInputStream()); 39 object=oop.readObject(); 40 } catch (Exception e) { 41 // TODO Auto-generated catch block 42 e.printStackTrace(); 43 } 44 return object; 45 } 46 } View Code