java基礎語法筆記,java語法筆記
這段時間看了一些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)字節流
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011813514721.gif)
![]()
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 }
View Code
(2)字符流
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011813514721.gif)
![]()
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
----------------------------------
按行讀寫文件(提高效率)
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011813514721.gif)
![]()
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 }
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的方式*************************************
***代碼如下****
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011813514721.gif)
![]()
1 Connection con=null;
2 Statement sm=null;
3 ResultSet rSet=null;
4 try {
5 // 1、加載驅動(作用是把需要的驅動程序加入內存)
6 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
7 //2、得到連接
8 con=DriverManager.getConnection("jdbc:odbc:MySqlSever", "sa", "920606");
9
10 //3、創建Statement或者PreparedStatement[區別]
11 //Statement用處是:主要用於發送sql語句到數據庫
12 sm=con.createStatement();
13
14 //4、執行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 }
View Code
*************1、使用PreparedStatement的方式*************************************
****此方法有以下有點
1>效率有所提高(因為對sql語句進行了預編譯)
2>防止sql注入
***代碼如下****
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011813514721.gif)
![]()
1 Connection connection=null;
2 PreparedStatement ps=null;
3 ResultSet rSet=null;
4
5 try {
6 //1、引入驅動
7 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
8 //2、創建連接
9 connection=DriverManager.getConnection("jdbc:odbc:MySqlSever", "sa", "920606");
10 //3、創建PreparedStatement對象
11 ps=connection.prepareStatement("select * from cakecategory where CGname=?");
12 ps.setString(1, "蛋糕");
13
14 //4、獲取結果集
15 rSet=ps.executeQuery();
16
17 //5、循環讀取
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 }
View Code
(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”語句
*****推薦使用第二種解決方法!
*********************實例代碼如下**********************************
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011813514721.gif)
![]()
1 Connection con=null;
2 PreparedStatement ps=null;
3 ResultSet rSet=null;
4
5
6 try {
7 //1、引入驅動
8 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
9 //2、創建連接
10 con=DriverManager.getConnection("jdbc:microsoft:sqlserver://127.0.0.1:1433;database=CakeSales","sa","920606");
11
12 //3、創建preparedStatement對象
13 ps=con.prepareStatement("use CakeSales select * from cakecategory");
14 //ps.setString(1, "蛋糕");
15
16 //4、接收結果集
17 rSet=ps.executeQuery();
18 //5、循環讀取數據
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 }
View Code
(3)演示使用JDBC直接連接數據庫進行ddl操作(也就是新建,刪除,備份,恢復數據庫)
******************************實例代碼如下******************************
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011813514721.gif)
![]()
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 }
View Code
十、java中的可變參數
關鍵字:...(沒錯,就是三個點。好像C語言中也是三個點)
例子:下面是我下的連接數據庫的可變參數
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011813514721.gif)
![]()
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 }
View Code
****c#中的可變參數用的是parameter關鍵字
十一、java網絡編程
和C#中的網絡編程Socket差不多
1>服務器端代碼及過程如下: 先建立ServerSocket監聽->然後等待客戶端連接->之後讀取客戶端發來的消息或者向客戶端發送消息
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011813514721.gif)
![]()
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>客戶端代碼及過程如下: 先連接服務器->之後讀取服務器發來的消息或者向服務器發送消息
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011813514721.gif)
![]()
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序列化接口***************************************
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017011813514721.gif)
![]()
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