java不少語法都跟C#相似,下面列舉一些不一樣的地方******注意***** java中的系統方法首字母都是小寫的,而C#中首字母都是大寫的
一、java中繼承的用法
class children extends parent
{
}
而c#中:
class children :parent
{
}
java中繼承接口的用法
class children implements parent
{
}
而c#中:
class children :parent
{
}
二、還有一點很重要的事java中的main函數所在的類名必須和文件名相同。
其次是在一個文件中只能main函數所在的類是public修飾的,其餘不能帶public ,一個文件中只能有一個public類。
java中的靜態成員既能夠實例化對象調用,也能夠類名來點出來,非靜態成員只能實例化對象調用。****沒有靜態類
而在C#中靜態成員不能實例化對象調用
三、java中方法的重寫就方法的覆蓋,貌似真的是覆蓋,就是從新寫一遍
而C#中的重寫要用關鍵字override,而且只能是抽象和虛方法或者標記爲override才能重寫。
四、java中有一個特殊的static語句塊功能,static語句塊中的語句在構造函數以前執行且只執行一次java
五、java和C#中初始化類的時候都是先初始化變量後執行函數代碼sql
六、java中final的用法:
不想讓類中的成員被子類修改
修飾類的時候,被修飾的類不能被繼承
變量被final修飾的時候,必須賦初值
final和const相似(只是相似)
C#中不行讓類被繼承能夠用關鍵字sealed修飾(密封)
不能讓子類修改,不知道用什麼方法數據庫
七、java中的集合
java中的ArraList集合跟C#中很類似,二者都是一樣的聲明方式。
1、List類型的集合
都是用的add方法(不一樣的事C#中的系統方法通常首字母大寫)
有一個不一樣的地方是java中集合的取值方式用的事get("這裏是對應的座標")方法來取。而C#用的事跟數組同樣的方法用下標取值:a[0]。
C#中的鍵值對集合有兩種取值方法,一種是下標取值,一種是下標加鍵取值
java中獲取集合中數量的方法是size(),而C#中用的是count()方法。
刪除都是用的remove()方法,清空用的都是clear()方法。
LinkedList集合比ArrayList多了addFirst()和addLast()方法,分別指的是每次都添加在最前面或者最後面。(在有些需求的時候頗有用)
vector和ArrayList的用法基本上同樣
stack和ArrayList的用法也是基本上同樣(可是值得注意的事stack由於棧的特色,因此每次插入新值的時候都是插在最前面的)
2、Map類型的集合(帶有鍵值對的集合,相似於C#中的鍵值對集合)
主要有Hashmap,Hashtable等
添加鍵值對用put()方法。
讀取方法:
//取出鍵的視圖
Iterator<String > iterator=hashMap.keySet().iterator();
//遍歷全部鍵
while (iterator.hasNext()) {
String string = (String) iterator.next();
((animal)hashMap.get(string)).sayhi();//讀取並調用方法
}
3、總結
一、若是要求線程安全,應該使用Vector、Hashtable
二、若是不要求線程安全,應該使用ArrayList、LinkedList、HashMap
三、若是要求鍵值對,則使用HashMap,Hashtable
四、若是數據量很大,又要線程安全考慮Vector
Java中兩個字符串比較值是否相等必定要用 s1.equals(s2)方法,不能直接用==來比較,這樣比較的只是字符串的引用地址。編程
4、java中子類構造函數中調用父類的構造函數用super();只能在子類的構造函數中寫c#
而C#中直接在子類構造函數後面寫:base()數組
例如:public son:father安全
{
son():base()
{
}
}
5、swing主要佈局方式
flowLayout(流式佈局)、borderLayout(邊界佈局)、GridLayout(網格佈局)等
6、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鎖)服務器
7、java IO流
(1)字節流網絡
1 public static void main(String[] args) throws IOException { 2 File file=new File("e:\\wode.txt");//打開文件 3 if(!file.exists()){ 4 try { 5 file.createNewFile();//建立文件 6 System.out.println("建立成功!"); 7 } catch (IOException e) { 8 e.printStackTrace(); 9 } 10 } 11 12 FileOutputStream fos=new FileOutputStream(file);//寫操做 13 String string="你好啊\r\n世界!"; 14 try { 15 fos.write(string.getBytes());//寫入數據 16 } catch (IOException e) { 17 e.printStackTrace(); 18 }finally{ 19 try { 20 fos.close(); 21 } catch (IOException e) { 22 e.printStackTrace(); 23 } 24 } 25 26 FileInputStream fis=new FileInputStream(file);//讀操做 27 int n=0; 28 byte []bytes=new byte[4*1024]; 29 30 //fis.read(bytes, 0, (int) file.length());//按字節讀取(一次讀完) 31 //String s=new String(bytes,0,(int) file.length()); 32 //System.out.println(s); 33 34 while ((n= fis.read(bytes))!=-1) {//分塊讀取 35 String s=new String(bytes,0,n); 36 System.out.println(s); 37 } 38 }
(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 }
----------------------------------
按行讀寫文件(提升效率)
1 public static void main(String[] args) { 2 BufferedReader bfr=null; 3 BufferedWriter bfw=null; 4 5 FileReader fileReader; 6 try { 7 fileReader = new FileReader("e:/wode.txt"); //讀操做(做爲 BufferedReader的構造參數) 8 bfr=new BufferedReader(fileReader); // 按行讀操做 9 FileWriter fileWriter=new FileWriter("e:/個人.txt"); //寫操做(做爲BufferedWriter的構造參數) 10 bfw=new BufferedWriter(fileWriter); //按行寫操做 11 String string=null; 12 while ((string=bfr.readLine())!=null) { //循環讀每一行,讀到末尾返回null 13 System.out.println(string); 14 bfw.write(string+"\r\n"); //按行寫 15 } 16 } catch (Exception e) { 17 e.printStackTrace(); 18 }finally{ 19 try { 20 bfr.close(); 21 bfw.close(); 22 } catch (IOException e) { 23 e.printStackTrace(); 24 } 25 26 27 } 28 29 }
8、數據庫
(1)開發時數據庫的選擇條件:
<1>成本
<2>功能多少
<3>併發性(最終用戶多少)
<4>安全性
(2)基本查詢
<1> sal between 100 and 200 //表示 sal>=100 and sal<=200
<2>like(模糊查詢)
%:表示0到多個模糊字符 _;表示單個模糊字符
例如:一、查詢姓李的人的名字
select name from emp where name like '李%';
二、查詢名字的第二個字爲明的人的名字
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='路徑'
9、JDBC
(1)演示使用JDBC-odbc橋接方式鏈接數據庫cakesales
<1>配置數據源(在控制面板→管理工具→odbc配置工具裏面)
<2>在程序中去鏈接數據源
*************一、使用Statement的方式*************************************
***代碼以下****
1 Connection con=null; 2 Statement sm=null; 3 ResultSet rSet=null; 4 try { 5 // 一、加載驅動(做用是把須要的驅動程序加入內存) 6 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 7 //二、獲得鏈接 8 con=DriverManager.getConnection("jdbc:odbc:MySqlSever", "sa", "920606"); 9 10 //三、建立Statement或者PreparedStatement[區別] 11 //Statement用處是:主要用於發送sql語句到數據庫 12 sm=con.createStatement(); 13 14 //四、執行crud(增刪改查) 15 16 //增長 17 //int i=sm.executeUpdate("insert into cakecategory values('小蛋糕',1)"); 18 19 //刪除 20 //int i=sm.executeUpdate("delete from cakecategory where CGname='小蛋糕'"); 21 22 //更新 23 //int i=sm.executeUpdate("update cakecategory set CGname='蛋糕' where CGname='小蛋糕'"); 24 25 //System.out.println(i); 26 27 28 //查詢表信息 29 rSet=sm.executeQuery("select * from cakecategory"); 30 while (rSet.next()) { 31 int id=rSet.getInt(1); 32 String name=rSet.getString(2); 33 int state=rSet.getInt(3); 34 System.out.println(id+"\t"+name+"\t"+state); 35 } 36 37 } catch (Exception e) { 38 // TODO Auto-generated catch block 39 e.printStackTrace(); 40 }finally{ 41 try { 42 if(rSet!=null) 43 rSet.close(); 44 if(sm!=null) 45 sm.close(); 46 if(con!=null) 47 con.close(); 48 } catch (SQLException e) { 49 // TODO Auto-generated catch block 50 e.printStackTrace(); 51 }
*************一、使用PreparedStatement的方式*************************************
****此方法有如下有點
1>效率有所提升(由於對sql語句進行了預編譯)
2>防止sql注入
***代碼以下****
1 Connection connection=null; 2 PreparedStatement ps=null; 3 ResultSet rSet=null; 4 5 try { 6 //一、引入驅動 7 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 8 //二、建立鏈接 9 connection=DriverManager.getConnection("jdbc:odbc:MySqlSever", "sa", "920606"); 10 //三、建立PreparedStatement對象 11 ps=connection.prepareStatement("select * from cakecategory where CGname=?"); 12 ps.setString(1, "蛋糕"); 13 14 //四、獲取結果集 15 rSet=ps.executeQuery(); 16 17 //五、循環讀取 18 while (rSet.next()) { 19 int id=rSet.getInt(1); 20 String name=rSet.getString(2); 21 int state=rSet.getInt(3); 22 System.out.println(id+"\t"+name+"\t"+state); 23 } 24 } catch (Exception e) { 25 // TODO: handle exception 26 e.printStackTrace(); 27 }finally{ 28 try { 29 if(rSet!=null) 30 rSet.close(); 31 if(ps!=null) 32 ps.close(); 33 if(connection!=null) 34 connection.close(); 35 } catch (SQLException e) { 36 // TODO Auto-generated catch block 37 e.printStackTrace(); 38 } 39 }
(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賬號的默認數據庫致使的。若是使用的庫不是當前賬號的默認庫的話,就會找不到表
解決方法:1、把賬號的默認數據庫改成要查詢的庫
修改方法:打開數據庫,在左側菜單欄->安全性->登陸名->sa 右鍵 屬性 找到下面的默認數據庫修改爲要用的就好了
2、在執行查詢前先執行「use xxx」語句
*****推薦使用第二種解決方法!
*********************實例代碼以下**********************************
1 Connection con=null; 2 PreparedStatement ps=null; 3 ResultSet rSet=null; 4 5 6 try { 7 //一、引入驅動 8 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); 9 //二、建立鏈接 10 con=DriverManager.getConnection("jdbc:microsoft:sqlserver://127.0.0.1:1433;database=CakeSales","sa","920606"); 11 12 //三、建立preparedStatement對象 13 ps=con.prepareStatement("use CakeSales select * from cakecategory"); 14 //ps.setString(1, "蛋糕"); 15 16 //四、接收結果集 17 rSet=ps.executeQuery(); 18 //五、循環讀取數據 19 while (rSet.next()) { 20 int id=rSet.getInt("CGid"); 21 String name=rSet.getString(2); 22 int state=rSet.getInt(3); 23 System.out.println(id+"\t"+name+"\t"+state); 24 } 25 } catch (Exception e) { 26 // TODO Auto-generated catch block 27 e.printStackTrace(); 28 }finally{ 29 try { 30 if(rSet!=null) 31 rSet.close(); 32 if(ps!=null) 33 ps.close(); 34 if(con!=null) 35 con.close(); 36 } catch (SQLException e) { 37 // TODO Auto-generated catch block 38 e.printStackTrace(); 39 } 40 }
(3)演示使用JDBC直接鏈接數據庫進行ddl操做(也就是新建,刪除,備份,恢復數據庫)
******************************實例代碼以下******************************
1 Connection con=null; 2 PreparedStatement ps=null; 3 try { 4 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); 5 //不指定數據庫鏈接 6 //con=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;", "sa", "920606"); 7 con=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;database=xinjiande", "sa", "920606"); 8 9 //新建數據庫 10 //ps=con.prepareStatement("create database xinjiande"); 11 12 //新建表 13 //ps=con.prepareStatement("use xinjiande create table users(uid int primary key identity(1,1))"); 14 15 16 //刪除表 17 //ps=con.prepareStatement("use xinjiande drop table users"); 18 19 //刪除數據庫 20 ps=con.prepareStatement("drop database xinjiande"); 21 22 //備份數據庫 23 24 //ps=con.prepareStatement("backup database xinjiande to disk='e:/xinjiande.bak'"); 25 26 //恢復數據庫 27 //ps=con.prepareStatement("restore database xinjiande from disk='e:/xinjiande.bak'"); 28 29 if(!ps.execute()){ 30 System.out.println("ok"); 31 } 32 } catch (Exception e) { 33 // TODO: handle exception 34 e.printStackTrace(); 35 }finally{ 36 try { 37 if(ps!=null){ 38 ps.close(); 39 } 40 if(con!=null){ 41 con.close(); 42 } 43 } catch (SQLException e) { 44 // TODO Auto-generated catch block 45 e.printStackTrace(); 46 } 47 }
10、java中的可變參數
關鍵字:...(沒錯,就是三個點。好像C語言中也是三個點)
例子:下面是我下的鏈接數據庫的可變參數
1 public sqlHelper(String sql,String ...strings){ 2 try { 3 this.sql=sql; 4 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); 5 con=DriverManager.getConnection("jdbc:sqlserver://127.0.0.1:1433;database=javaTset", "sa", "920606"); 6 ps=con.prepareStatement(sql); 7 if(strings!=null){ 8 int i=1; 9 for(String s:strings){ 10 ps.setString(i, s); 11 i++; 12 } 13 } 14 } catch (Exception e) { 15 // TODO: handle exception 16 e.printStackTrace(); 17 } 18 }
****c#中的可變參數用的是parameter關鍵字
11、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 }
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 }
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 }