java語法基礎

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         }
相關文章
相關標籤/搜索