欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      達(dá)內(nèi)學(xué)習(xí)心得:JDBC總結(jié):系列筆記之四

      時(shí)間:2019-05-12 06:52:01下載本文作者:會(huì)員上傳
      簡(jiǎn)介:寫寫幫文庫小編為你整理了多篇相關(guān)的《達(dá)內(nèi)學(xué)習(xí)心得:JDBC總結(jié):系列筆記之四》,但愿對(duì)你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫還可以找到更多《達(dá)內(nèi)學(xué)習(xí)心得:JDBC總結(jié):系列筆記之四》。

      第一篇:達(dá)內(nèi)學(xué)習(xí)心得:JDBC總結(jié):系列筆記之四

      達(dá)內(nèi)學(xué)習(xí)心得:JDBC總結(jié):系列筆記之四

      參賽學(xué)員:常彥博 獲獎(jiǎng)獎(jiǎng)項(xiàng):二等獎(jiǎng)

      說明:(又花了幾個(gè)小時(shí)把JDBC筆記轉(zhuǎn)成了word版!筆記內(nèi)容真實(shí),都是課上及TTS上內(nèi)容,不是從網(wǎng)上復(fù)制粘貼來的!同時(shí)也不會(huì)去刷點(diǎn)擊率!不想評(píng)分的按F5刷新頁面即可!不用選擇分?jǐn)?shù),一旦選擇就不能改了!也可以拿到電子版后再來評(píng)分!Q在下)1)此筆記為本人系列筆記之一:Java、Oracle、PL/SQL、JDBC、XML、HTML、CSS、JavaScript、Servlet??

      2)筆記內(nèi)容整理了:JDBC(范傳奇老師主講,占筆記內(nèi)容100%)。3)此筆記已打印出成品,一共19頁?。ú话夸洠?。排版格式大部分按照畢業(yè)論文做的!有目錄、章節(jié)、頁眉、頁腳、縮進(jìn)、一二三級(jí)標(biāo)題等。同時(shí)排版格式也照顧到了雙面打印,所以電子版可直接雙面打印,不需要調(diào)格式。

      因此,本人的系列筆記平均花費(fèi)20個(gè)小時(shí)以上(筆記純手工輸入)!每天的總結(jié)、排版很辛苦!之前有很多朋友拿到了我分享的筆記,因此還望各位尊重他人勞動(dòng)成果(你懂得~~)。4)評(píng)選系統(tǒng)由于不能上傳word版,所以格式、布局上不太好看,如文中的注意事項(xiàng)有特殊項(xiàng)目符號(hào),這里顯示的是字母u和字母v,有的圖片也不能顯示!內(nèi)容太長(zhǎng),老是提交失敗!只能一點(diǎn)一點(diǎn)發(fā)!

      5)希望大家多多支持,評(píng)選結(jié)束后,我會(huì)找時(shí)間統(tǒng)一分享給大家所有的筆記!之前拿到過的朋友,也可以再要,因?yàn)樾薷摹⒏铝撕芏鄡?nèi)容。

      ——————————————————————————————————————————————————————————————————— 目錄

      一、JDBC概述 1 1.1 什么是JDBC 1 1.2什么是驅(qū)動(dòng) 1 1.3 SQL lite 1 1.4如何使用Java連接某種數(shù)據(jù)庫 1 1.5連接數(shù)據(jù)庫并操作 1 1.6連接數(shù)據(jù)庫時(shí)常見的錯(cuò)誤 1

      二、JDBC核心API 2 2.1 Connection 2 2.2 Statement 2 2.3 ResultSet 2 2.4 DriverManager 2 2.5 UUID3 2.6案例:使用JDBC連接數(shù)據(jù)庫,并操作SQL語句 3 2.7案例:通過JDBC創(chuàng)建表 4 2.8案例:使用JDBC向表中插入數(shù)據(jù) 4 2.9遍歷Student_chang表 5

      三、JDBC核心API:PreparedStatement 6 3.1Statement的缺點(diǎn) 6 3.2PreparedStatement的優(yōu)點(diǎn) 6 3.3案例詳見第五章StudentDAO類 6

      四、Connection封裝 7

      五、DAO 8 5.1持久類封裝 8 5.2 DAO層 8 5.3 Properties類 8 5.4案例:注冊(cè)系統(tǒng) 8

      六、批處理 12 6.1批處理的優(yōu)點(diǎn) 12 6.2 JDBC批處理API 12 6.3案例:詳見8.4案例step7 12

      七、事務(wù)處理 13 7.1事務(wù)特性ACID 13 7.2 JDBC中對(duì)事務(wù)的支持(API)13

      八、DAO事務(wù)封裝 14 8.1ThreadLocal原理 14 8.2原理圖 14 8.3ThreadLocal核心API 14 8.4案例:登錄系統(tǒng)(使用ThreadLocal實(shí)現(xiàn)連接共享)14

      九、分頁查詢 17 9.1分頁查詢的基本原理 17 9.2為何使用分頁查詢 17 9.3 Oracle分頁查詢SQL語句 17 9.4 MySQL分頁查詢SQL語句 17 9.5“假”分頁 17 9.6案例:分頁查詢 18

      一、JDBC概述 1.1 什么是JDBC 1)Java的設(shè)計(jì)者希望使用相同的方式訪問不同的數(shù)據(jù)庫。

      2)JDBC是Java用于統(tǒng)一連接數(shù)據(jù)庫并操作數(shù)據(jù)庫的一組通用接口定義(即通過一系列接口定義了訪問數(shù)據(jù)庫的通用API)。

      3)JDBC是連接數(shù)據(jù)庫的規(guī)范,不同的數(shù)據(jù)庫廠商若想讓Java語言可以對(duì)其操作,就需要實(shí)現(xiàn)一組類,這組類需要實(shí)現(xiàn)Java提供的這組用于連接數(shù)據(jù)庫的接口,并實(shí)現(xiàn)其中定義的相關(guān)方法。那么不同的數(shù)據(jù)庫廠商根據(jù)各自數(shù)據(jù)庫的特點(diǎn),去提供對(duì)JDBC的實(shí)現(xiàn)(實(shí)現(xiàn)類包),那么這組類就是該數(shù)據(jù)庫的驅(qū)動(dòng)包了。4)原理圖:

      1.2什么是驅(qū)動(dòng)

      簡(jiǎn)單的說就是讓軟件知道如何去操作硬件。1.3 SQL lite 是輕量級(jí)的數(shù)據(jù)庫,常用于嵌入式。1.4如何使用Java連接某種數(shù)據(jù)庫 需要兩個(gè)部分:1)使用JDBC連接數(shù)據(jù)庫(導(dǎo)入某數(shù)據(jù)庫的.jar包)。

      2)提供對(duì)該數(shù)據(jù)庫的驅(qū)動(dòng)包(使用靜態(tài)方法Class.forName注冊(cè)驅(qū)動(dòng))。1.5連接數(shù)據(jù)庫并操作

      1)打開與數(shù)據(jù)庫的連接(使用DriverManager.getConnection獲取連接)。2)執(zhí)行SQL語句(使用Statement或者PreparedStatement)。3)得到結(jié)果。

      1.6連接數(shù)據(jù)庫時(shí)常見的錯(cuò)誤

      1)報(bào)錯(cuò)ClassNotFoundException則有兩種情況: ①驅(qū)動(dòng)包沒導(dǎo)入。

      ②Class.forName()中的字符串拼寫有誤。2)報(bào)錯(cuò)port number,應(yīng)注意:

      ①連接數(shù)據(jù)庫時(shí)輸入數(shù)據(jù)庫路徑時(shí)沒有添加端口號(hào)。

      ②Oracle數(shù)據(jù)庫的完整寫法應(yīng)為:jdbc:oracle:thin:@IP地址:端口號(hào):數(shù)據(jù)庫名 u 注意事項(xiàng):Oracle數(shù)據(jù)庫默認(rèn)端口號(hào)1521。MySql數(shù)據(jù)庫默認(rèn)端口號(hào)為3306

      二、JDBC核心API 2.1 Connection 接口,需導(dǎo)入java.sql.Connnection包,與特定數(shù)據(jù)庫進(jìn)行連接(會(huì)話)。2.2 Statement 接口,需導(dǎo)入java.sql.Statement包,用于執(zhí)行靜態(tài)SQL語句并返回它所生成結(jié)果的對(duì)象。1)ResultSet executeQuery(String sql)throws SQLException方法:執(zhí)行給定的SQL語句(通常為靜態(tài)SQL SELECT語句),該語句返回單個(gè)ResultSet對(duì)象。

      2)boolean execute(String sql)throws SQLException方法:執(zhí)行給定的SQL語句,該語句可能返回多個(gè)結(jié)果。如果第一個(gè)結(jié)果為ResultSet對(duì)象,則返回true;如果其為更新計(jì)數(shù)或者不存在任何結(jié)果,則返回false。詳細(xì)介紹請(qǐng)看2.6案例注釋。

      3)int executeUpdate(String sql)throws SQLException方法:執(zhí)行給定SQL語句,該語句可能為INSERT、UPDATE、DELETE(DML語句),或者不返回任何內(nèi)容的DDL語句。返回值:①對(duì)于數(shù)據(jù)操作語句(DML語句),返回行計(jì)數(shù)。②對(duì)于DDL語句,返回0。

      4)boolean execute(String sql)方法:返回結(jié)果為true、false,常用與執(zhí)行表級(jí)操作的SQL語句,如建表、刪表等,創(chuàng)建表若失敗實(shí)際上是會(huì)直接拋出異常的。false:為建表成功的標(biāo)志。5)exectue()方法:原則上可以執(zhí)行任意SQL語句。返回true:若執(zhí)行結(jié)果為一個(gè)結(jié)果集(ResultSet)。返回false:為其他信息(如影響表數(shù)據(jù)總條數(shù)等)。所以我們通常不會(huì)使用execute去執(zhí)行查詢語句。

      6)int executeUpdate(String sql)throws SQLException方法:返回值int,返回值為當(dāng)前執(zhí)行的SQL語句影響了數(shù)據(jù)庫數(shù)據(jù)的總條數(shù);該方法常用與執(zhí)行insert、update、delete語句。7)在底層一定會(huì)用到網(wǎng)絡(luò)Socket和流,但我們不用關(guān)心使用字符還是字節(jié)接收,都由Statement做了。2.3 ResultSet 接口,表示數(shù)據(jù)庫結(jié)果集的數(shù)據(jù)表(很像一個(gè)集合),通常通過執(zhí)行查詢數(shù)據(jù)庫的語句生成。1)ResultSet特點(diǎn):按行遍歷,按字段取值。

      2)它的next()方法包含了是否有下一條記錄的hasnext()方法。

      3)按字段取值時(shí),getString(int)方法中的int,代表結(jié)果集的第幾列,u 注意事項(xiàng):這里的int從1開始,和Java對(duì)索引的習(xí)慣不同。2.4 DriverManager 它是管理一組JDBC驅(qū)動(dòng)程序的類。1)Connection getConnection(String url,String user,String password)方法:靜態(tài)方法,建立與給定數(shù)據(jù)庫URL的連接(DriverManager試圖從已注冊(cè)的JDBC驅(qū)動(dòng)程序集中選擇一個(gè)適當(dāng)?shù)尿?qū)動(dòng)程序)。

      2)DriverManager如何知道某種數(shù)據(jù)庫已注冊(cè)的?

      例如:oracle.jdbc.driver.OracleDriver類在Class.forName()的時(shí)候被載入JVM; 而OracleDriver是JDBC中Driver的子類,它被要求在靜態(tài)初始化的時(shí)候要將自身驅(qū)動(dòng)的信息通過DriverManager的靜態(tài)方法注冊(cè)進(jìn)去,這樣DriverManager就知道應(yīng)該如何通過OracleDriver去連接該數(shù)據(jù)庫了。所以之后就可以通過DrvierManager的另一個(gè)靜態(tài)方法:getConnection()來根據(jù)之前注冊(cè)的驅(qū)動(dòng)信息獲取連接了:

      Connection conn=DriverManager.getConnetion(“",”“,”“);2.5 UUID UUID為通用唯一標(biāo)識(shí)碼(Universally Unique Indentifier)對(duì)于大數(shù)據(jù)量的表來說,UUID是存放ID最好的方式。1)Java提供的支持

      UUID類:UUID.randomUUID().toString():獲得一個(gè)36位不重復(fù)的字符串。2)Oracle提供的支持

      函數(shù)sys_guid():獲取一個(gè)32位不重復(fù)的字符串。2.6案例:使用JDBC連接數(shù)據(jù)庫,并操作SQL語句 /** 連接數(shù)據(jù)庫一定要捕獲異常的 */ Connection conn=null;//定義在try外面是用于在finally塊中關(guān)閉它,同時(shí)局部變量在使用前,一定要初始化!

      try{ /** 與數(shù)據(jù)庫進(jìn)行連接分為兩步:1)注冊(cè)驅(qū)動(dòng):不同的數(shù)據(jù)庫實(shí)現(xiàn)不盡相同,所以要使用不同數(shù)據(jù)庫廠商提供的驅(qū)動(dòng)包。連接不同數(shù)據(jù)庫,傳入的字符串不盡相同,但是目的相同,都是注冊(cè)驅(qū)動(dòng)。而對(duì)于驅(qū)動(dòng)包路徑,名字是固定的,基本上不會(huì)變的!2)根據(jù)數(shù)據(jù)庫的位置(路徑)以及用戶名和密碼進(jìn)行連接 */ Class.forName(”oracle.jdbc.driver.OracleDriver“);/** 路徑:不同數(shù)據(jù)庫連接的路徑寫法不盡相同,Oracle的寫法:

      jdbc:oracle:thin:@HOST:DB_NAME

      其中HOST包含兩部分:IP地址和端口號(hào);本機(jī)則使用localhost或127.0.0.1 */ conn=DriverManager.getConnection(”jdbc:oracle:thin:@192.168.0.20:1521:tarena“, ”jsd1304“,”jsd1304“);/** 使用SQL語句來操作數(shù)據(jù)庫,若想執(zhí)行SQL語句,我們需要使用一個(gè)專門處理SQL語句的類,這個(gè)類叫做Statement */ Statement state=conn.createStatement();/** user_tables是Oracle用于存儲(chǔ)當(dāng)前用戶創(chuàng)建的所有表的信息,其中一個(gè)字段叫做table_name用戶保存的表名 */ String sql=”SELECT table_name FROM user_tables“;/** 通過Statement執(zhí)行查詢語句,當(dāng)查詢完畢后,數(shù)據(jù)庫會(huì)將查詢結(jié)果返回,Statement會(huì)將查詢結(jié)果存儲(chǔ)到ResultSet中 */ ResultSet rs=state.executeQuery(sql);while(rs.next()){ //按行遍歷,包含了是否有下一條記錄的方法hasnext()/** 按字段取值;整數(shù)參數(shù):結(jié)果集的第幾列。注意:這里從1開始,和Java對(duì)索引的習(xí)慣不同 */ String tableName=rs.getString(1);System.out.println(tableName);} /** 底層一定會(huì)用到網(wǎng)絡(luò)socket和流,但我們不用關(guān)心使用字符還是字節(jié)接收,都由Statement做了 */ rs.close();state.close();}catch(Exception e){ e.printStackTrace();}finally{ if(conn!=null){ try { conn.close();} catch(SQLException e){ e.printStackTrace();} } } u 注意事項(xiàng): 養(yǎng)成良好的編碼習(xí)慣:所有SQL關(guān)鍵字用純大寫,其他內(nèi)容用純小寫。2.7案例:通過JDBC創(chuàng)建表 Connection conn=null;try{ //1 注冊(cè)驅(qū)動(dòng)

      Class.forName(”oracle.jdbc.driver.OracleDriver“);//2 打開連接,支持import java.sql.*,但全導(dǎo)入較耗費(fèi)性能 conn=DriverManager.getConnection(”jdbc:oracle:thin:@192.168.0.20:1521:tarena“,”jsd1304“,”jsd1304“);//3 創(chuàng)建用于執(zhí)行SQL語句的Statement Statement state=conn.createStatement();//創(chuàng)建建表語句

      String sql=”CREATE TABLE Student_chang(“ + ”id varchar2(36)PRIMARY KEY,“ +”name varchar2(30),“ + ”age number(2),“ + ”sex varchar2(2)“ + ”)“;//execute()方法詳見2.2節(jié)

      if(!state.execute(sql)){ System.out.println(”創(chuàng)建表成功!“);}else{ System.out.println(”創(chuàng)建失敗!“);} state.close();}catch(Exception e){ e.printStackTrace();}finally{ if(conn!=null){

      try { conn.close();} catch(SQLException e){

      e.printStackTrace();

      }

      } } 2.8案例:使用JDBC向表中插入數(shù)據(jù) Connection conn=null;try{ Class.forName(”oracle.jdbc.driver.OracleDriver“);conn=DriverManager.getConnection(”jdbc:oracle:thin:@192.168.0.20:1521:tarena“,”jsd1304“,”jsd1304“);Statement state=conn.createStatement();//UUID詳見2.5 String uuid=UUID.randomUUID().toString();System.out.println(uuid);String sql=”INSERT INTO Student_chang VALUES('“+uuid +”','Chang',22,'1')“;

      //或String sql=”INSERT INTO Student_chang VALUES(sys_guid(),'chang',23,'1')“;//判斷insert語句是否成功,看返回值是否大于0,executeUpdate方法詳見2.2 if(state.executeUpdate(sql)>0){ System.out.println(”插入數(shù)據(jù)成功“);} state.close();}catch(Exception e){ e.printStackTrace();}finally{ if(conn!=null){ try { conn.close();} catch(SQLException e){

      e.printStackTrace();} } } 2.9遍歷Student_chang表 Connection conn=null;try{ Class.forName(”oracle.jdbc.driver.OracleDriver“);conn=DriverManager.getConnection(”jdbc:oracle:thin:@192.168.0.20:1521:tarena“,”jsd1304“,”jsd1304“);Statement state=conn.createStatement();String sql=”SELECT * FROM Student_chang“;ResultSet rs=state.executeQuery(sql);while(rs.next()){ String id=rs.getString(1);String name=rs.getString(”name“);//不知第幾列也可寫列名 int age=rs.getInt(”age“);String sex=rs.getString(4).equals(”1“)?”男“:”女“;System.out.println(id+”,“+name+”,“+age+”,"+sex);} rs.close();state.close();}catch(Exception e){ e.printStackTrace();}finally{ if(conn!=null){ try { conn.close();} catch(SQLException e){ e.printStackTrace();} } }

      三、JDBC核心API:PreparedStatement 3.1Statement的缺點(diǎn)

      1)用Statement操作時(shí)代碼的可讀性和可維護(hù)性差,編寫SQL語句復(fù)雜。

      2)Statement操作SQL語句,每執(zhí)行一次都要對(duì)傳入的語句編譯一次,效率比較差。3)不安全可能出現(xiàn)SQL注入攻擊,詳見9.6案例step3。

      4)擴(kuò)展:XSS攻擊、html代碼注入攻擊、struts2 OGNL存在可以遠(yuǎn)程執(zhí)行底層操作系統(tǒng)命令的漏洞。

      3.2PreparedStatement的優(yōu)點(diǎn)

      1)PreparedStatement實(shí)例包含已編譯的SQL語句。包含于PreparedStatement對(duì)象中的SQL語句可具有一個(gè)或多個(gè)IN參數(shù)。IN參數(shù)的值在SQL語句創(chuàng)建時(shí)未被指定。該語句為每個(gè)IN參數(shù)保留一個(gè)問號(hào)(“?”)作為占位符,不考慮類型。每個(gè)問號(hào)的值必須在該語句執(zhí)行之前,通過適當(dāng)?shù)膕etString、setInt、setDouble??等方法來提供。

      2)由于PreparedStatement對(duì)象已預(yù)編譯過,所以其執(zhí)行速度要快于Statement對(duì)象。因此,多次執(zhí)行的SQL語句經(jīng)常創(chuàng)建為PreparedStatement對(duì)象,以提高效率。3)PreparedStatement繼承于Statement,其中三種方法:execute、executeQuery、executeUpdate都已被更改為不再需要參數(shù)了。因?yàn)槲覀冊(cè)讷@取PreparedStatement時(shí)已經(jīng)將SQL語句傳入了。所以執(zhí)行就可以,不需要再傳入SQL。4)PreparedStatement可以進(jìn)行批量處理。5)可以防止SQL注入攻擊。u 注意事項(xiàng):

      v 使用預(yù)編譯語句,你傳入的任何內(nèi)容就不會(huì)和原來的語句發(fā)生任何匹配的關(guān)系,只要全使用預(yù)編譯語句,你就不用對(duì)傳入的數(shù)據(jù)作任何的過濾。

      v 對(duì)一個(gè)表只作一個(gè)操作用PreparedStatement,效率高、方便 v 對(duì)表進(jìn)行2種及以上的操作用Statement。3.3案例詳見第五章StudentDAO類 ???????? ????????

      五、DAO 5.1持久類封裝

      對(duì)象關(guān)系映射(ORM)使用描述對(duì)象和數(shù)據(jù)庫之間映射的元數(shù)據(jù),將Java程序中的對(duì)象自動(dòng)持久化到關(guān)系數(shù)據(jù)庫中。1)表和類對(duì)應(yīng)。2)表中的字段和類的屬性對(duì)應(yīng)。3)記錄和對(duì)象對(duì)應(yīng)。5.2 DAO層

      1)DAO:數(shù)據(jù)連接對(duì)象(DataAccessObjects)

      2)作用:將數(shù)據(jù)庫中的數(shù)據(jù)轉(zhuǎn)化為Java的對(duì)象并返回(即讀數(shù)據(jù)),將Java的對(duì)象轉(zhuǎn)化為數(shù)據(jù)庫中表的一條數(shù)據(jù)(即寫數(shù)據(jù))。

      3)Java對(duì)象在這里就是所謂的實(shí)體entity,DAO要達(dá)到的目的:對(duì)數(shù)據(jù)庫數(shù)據(jù)的操作面向?qū)ο蠡?/p>

      4)實(shí)體:用Java中的對(duì)象去描述數(shù)據(jù)庫中的某表中的某一條記錄。

      比如:Student表有字段id、name、age、sex,則對(duì)應(yīng)的Java類中有Student類,屬性有id、name、age、sex 5)實(shí)體類:用于對(duì)應(yīng)數(shù)據(jù)庫中的表。通常實(shí)體類的名字和數(shù)據(jù)庫中表的名字一致。u 注意事項(xiàng):實(shí)體類代表表,屬性代表字段,對(duì)象代表一條數(shù)據(jù)。5.3 Properties類

      用于讀取“.properties”文本文件的類,導(dǎo)入java.util.Properties包。1)“.properties”文件是一個(gè)純文本文件,里面定義的內(nèi)容格式有要求,必須是key=value的形式,并且以行為單位。一行只記錄一條數(shù)據(jù)!2)Properties類可以方便的讀取properties文件,并將內(nèi)容以類似HashMap的形式進(jìn)行讀取。3)db.properties文件里的內(nèi)容如下:

      jdbc.driver=oracle.jdbc.driver.OracleDriver

      jdbc.url=jdbc:oracle:thin:@192.168.0.20:1521:tarena

      jdbc.user=jsd1304

      jdbc.pwd=jsd1304 u 注意事項(xiàng):讀取的都是字符串!不用寫雙引號(hào),無空格!

      4)getProperty(String key)方法:該方法可以從properties文件中獲取數(shù)據(jù),如:jdbc.driver=oracle.jdbc.driver.OracleDriver。獲取方式是將jdbc.driver以key作為參數(shù)調(diào)用方法。返回的就是等號(hào)右面的值oracle.jdbc.driver.OracleDriver了。

      第二篇:達(dá)內(nèi)學(xué)習(xí)心得:俄羅斯方塊項(xiàng)目總結(jié)

      達(dá)內(nèi)學(xué)員:我的俄羅斯方塊項(xiàng)目總結(jié)

      獲獎(jiǎng)學(xué)員:陳啟壯 所獲獎(jiǎng)項(xiàng):三等獎(jiǎng) 內(nèi)容

      俄羅斯方塊一共三個(gè)類中間用等號(hào)隔開 軟件的開發(fā)過程 明確業(yè)務(wù)需求

      用自然語言,將業(yè)務(wù)功能描述清楚

      ...2 業(yè)務(wù)分析

      找到有哪些業(yè)務(wù)對(duì)象,和圖片的分析

      tetris(俄羅斯方塊)

      |-- score 累計(jì)分?jǐn)?shù)

      |-- lines 銷毀的行數(shù)

      |-- Wall(墻 20行x10列)

      |-- 20row(行)

      |--10 col cell(列)

      |-- tetromino(4格方塊,有7種形態(tài))

      |-- 4 cell

      |--nextOne 下一個(gè)準(zhǔn)備下落的方塊

      |-- 4 cell 數(shù)據(jù)模型,一切業(yè)務(wù)對(duì)象轉(zhuǎn)換為數(shù)字表示

      場(chǎng)地按照行列劃分為20x10格子

      格子有屬性row,col,color 4 類 設(shè)計(jì)

      Tetris

      |--int score

      |--int lines

      |--Cell[20][10] wall

      |--Tetromino tetromino

      |

      |--Cell[4] cells

      |--row

      |--col

      |--color 5 算法設(shè)計(jì),就是如何利用數(shù)據(jù)的計(jì)算實(shí)現(xiàn)軟件的功能

      4格方塊的初始形態(tài): I S Z J L T O

      就在初始數(shù)據(jù)的數(shù)值狀態(tài)設(shè)計(jì)

      四格方塊的下落計(jì)算:就是將每個(gè)格子的row+1

      就是將下落的業(yè)務(wù)功能,轉(zhuǎn)換為數(shù)字計(jì)算實(shí)現(xiàn)

      左右移動(dòng)

      下落流程控制:控制方塊下落與墻之間的控制關(guān)系

      1 合理的文字流程描述

      2 分析文字描述中的功能(動(dòng)作)為方法

      3 用流程控制語句連接方法實(shí)現(xiàn)功能 嚴(yán)格測(cè)試結(jié)果?。詄stCase 左右移動(dòng)流程控制

      分?jǐn)?shù)計(jì)算

      界面的繪制

      鍵盤事件控制

      旋轉(zhuǎn)流程控制

      加速下降流程控制

      開始流程控制(Timer)

      暫停流程控制

      繼續(xù)流程控制

      結(jié)束流程控制

      首先是Cell類,最基本的類包含3個(gè)私有屬性和get,set方法,重寫Object類的toString輸出方法,并規(guī)定格子所具有的3個(gè)移動(dòng)功能 package com.tarena.tetris;//包:小寫英文字母,域名倒寫.項(xiàng)目名 /** * 最小的格子

      */ public class Cell{

      private int row;

      private int col;

      private int color;

      public Cell(int row, int col, int color){

      super();

      this.row = row;

      this.col = col;

      this.color = color;

      }

      public int getCol(){

      return col;

      }

      public void setCol(int col){

      this.col = col;

      }

      public int getColor(){

      return color;

      }

      public void setColor(int color){

      this.color = color;

      }

      public int getRow(){

      return row;

      }

      public void setRow(int row){

      this.row = row;

      }

      public void left(){

      col--;

      }

      public void right(){

      col++;

      }

      public void drop(){

      row++;

      }

      public String toString(){

      return row+“,”+col;

      } } =============================================================== package com.tarena.tetris;import java.util.Arrays;import java.util.Timer;import java.util.TimerTask;

      import javax.swing.JPanel;//是能夠顯示的矩形面板區(qū)域 import javax.swing.JFrame;//窗口框

      import javax.swing.border.LineBorder;//實(shí)現(xiàn)邊框 import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.event.KeyAdapter;import java.awt.event.KeyListener;import java.awt.event.KeyEvent;/* * 俄羅斯方塊類

      * 俄羅斯方塊 擴(kuò)展了(extends)系統(tǒng)的顯示面板,增加了墻和

      * 正在下落的方塊

      * */ public class Tetris extends JPanel{

      public static final int ROWS = 20;

      public static final int COLS= 10;

      /*代表方塊下落著陸的墻*/

      private Cell[][] wall = new Cell[ROWS][COLS];

      /*是正在下落的方塊*/

      private Tetromino tetromino;

      /*下一個(gè)進(jìn)入的方塊*/

      private Tetromino nextOne;

      private static int score;

      private int lines;

      Timer timer;

      private boolean gameOver = false;

      private boolean pause = false;//暫停

      private static final int[] SCORE_LEVEL={0,1,4,10,100};

      private static final Graphics Graphics = null;

      /*銷毀(destory)滿行*/

      //

      0 1 2 3 4

      /*在Tetris中添加方法,檢查游戲是否結(jié)束*/

      public void rotateRightAction(){

      tetromino.rotateRight();

      if(outOfBounds()||coincide()){

      tetromino.rotateLeft();

      }

      }

      public void rotateLeftAction(){

      tetromino.rotateLeft();

      if(outOfBounds()||coincide()){

      tetromino.rotateRight();

      }

      }

      /*在Tetris中添加方法,檢查游戲是否結(jié)束*/

      private boolean gameOver(){

      gameOver = wall[0][4]!=null;

      return gameOver;

      }

      /*在Tetris中添加方法*/

      public void hardDropAction(){

      while(canDrop()){

      tetromino.softDrop();

      }

      tetrominoLandToWall();

      destroy();

      if(gameOver()){

      gameOverAction();

      }

      nextTetromino();

      }

      public void destroy(){

      int lines = 0;//統(tǒng)計(jì)本次銷毀的行數(shù)

      for(int row = 0;row

      Cell[] line = wall[row];

      if(fullCell(line)){

      clearLine(row,wall);

      lines++;//每消除一行就累計(jì)加1

      }

      }

      score += SCORE_LEVEL[lines];

      this.lines +=lines;

      }

      public static void clearLine(int row,Cell[][] wall){

      for(int i=row;i>1;i--){

      System.arraycopy(wall[i-1],0,wall[i],0,wall[i].length);

      }

      Arrays.fill(wall[0],null);

      }

      public static boolean fullCell(Cell []line){

      for(int col = 0;col

      if(line[col]==null){

      return false;//找到空格子,這行沒有滿

      }

      }

      return true;

      }

      public String toString(){//顯示全部的墻

      String str = “";

      for(int row = 0;row

      Cell[] line = wall[row];

      for(int col = 0;col

      Cell cell = line[col];

      if(tetromino.contains(row,col)){

      str +=row+”,“+col+” “;

      }else{

      str = str + cell + ” “;

      }

      }

      str +=”n“;

      }

      return str;

      }

      /*4格方塊下降流程

      * 方塊移動(dòng)到區(qū)域最下方或是著地到其他方塊上無法移動(dòng)時(shí),* 就會(huì)固定到該處,而新的方法快出現(xiàn)在區(qū)域上方開始下落。

      * 如果能下降就繼續(xù)下降,* 否則就著陸到墻上,并且生成(隨機(jī))下一個(gè)方塊

      * */

      public void softDropAction(){

      if(canDrop()){//如果能下降

      tetromino.softDrop();//方塊繼續(xù)下降

      }else{

      tetrominoLandToWall();//著陸到墻上

      destroy();//

      if(gameOver()){

      gameOverAction();

      }

      nextTetromino();//生產(chǎn)(隨機(jī))下一個(gè)方塊

      }

      }

      private void startGameAction(){

      gameOver = false;

      pause = false;

      score = 0;

      lines = 0;

      emptyWall();

      nextTetromino();

      repaint();

      timer = new Timer();

      timer.schedule(new TimerTask(){

      public void run(){

      softDropAction();

      repaint();

      }

      }, 500, 500);

      }

      private void emptyWall(){

      for(int row=0;row

      Arrays.fill(wall[row],null);

      }

      }

      /*清理游戲結(jié)束現(xiàn)場(chǎng),如:停止定時(shí)器等*/

      private void gameOverAction(){

      timer.cancel();//停止定時(shí)器

      }

      /*檢查 方塊 是否能夠繼續(xù)下落:到底最低部,或者墻上

      * 的下方有方塊,返回false不能下降,返回true可以下降

      * */

      public boolean canDrop(){

      //檢查到底部

      Cell[] cells = tetromino.getCells();

      for(Cell cell:cells){

      if(cell.getRow()==ROWS-1){

      return false;

      }

      }

      //檢查墻上下方是否有方塊

      for(Cell cell:cells){

      int row = cell.getRow();

      int col = cell.getCol();

      Cell block = wall[row+1][col];

      if(block!=null){

      return false;

      }

      }

      return true;

      }

      /*方塊“著陸”到墻上,* 取出每個(gè)小cell

      * 找到cell的行號(hào)row和列號(hào)col

      * 將cell放置到wall[row][col]位置上

      * */

      public void tetrominoLandToWall(){

      Cell[] cells = tetromino.getCells();

      for(Cell cell:cells){

      int row = cell.getRow();

      int col = cell.getCol();

      wall[row][col] = cell;

      }

      }

      /*生產(chǎn)(隨機(jī))下一個(gè)方塊

      * 1 下一個(gè)變?yōu)楫?dāng)前的* 2 隨機(jī)產(chǎn)生下一個(gè)

      * */

      public void nextTetromino(){

      if(nextOne==null){//第一次nextOne是null時(shí)候先生產(chǎn)一個(gè)

      nextOne = Tetromino.randomTetromino();

      }

      tetromino = nextOne;//下一個(gè)變?yōu)楫?dāng)前的

      nextOne = Tetromino.randomTetromino();//隨機(jī)產(chǎn)生下一個(gè)

      if(tetromino==null){//處理第一次使用時(shí)候下一個(gè)是null

      tetromino=Tetromino.randomTetromino();

      }

      }

      /*以格子為單位左右移動(dòng)方塊

      * 1)如果遇到左右邊界就不能移動(dòng)了

      * 2)如果與墻上的格子相撞就不能移動(dòng)了

      * 變通為:

      * 1)先將方塊左移動(dòng),* 2)檢查(移動(dòng)結(jié)果是否出界),或者(重合)

      * 3)如果檢查失敗,就右移的回來

      *

      * */

      public void moveLeftAction(){

      tetromino.moveLeft();

      if(outOfBounds()|| coincide()){

      tetromino.moveRight();

      }

      }

      private boolean outOfBounds(){

      Cell[] cells = tetromino.getCells();

      for(int i = 0;i < cells.length;i++){

      Cell cell = cells[i];

      int row = cell.getRow();

      int col = cell.getCol();

      if(row == ROWS||col<0||col>=COLS){

      return true;

      }

      }

      return false;

      }

      private boolean coincide(){

      Cell[] cells = tetromino.getCells();

      for(int i = 0;i < cells.length;i++){

      Cell cell = cells[i];

      int row = cell.getRow();

      int col = cell.getCol();

      if(row >0&&row0

      &&wall[row][col]!=null){

      return true;//重合 }

      }

      return false;

      }

      public void moveRightAction(){

      tetromino.moveRight();

      if(outOfBounds()|| coincide()){

      tetromino.moveLeft();

      }

      }

      public static final int CELL_SIZE = 25;

      /*在Tetris.java中添加main方法 作為軟件的啟動(dòng)方法*/

      public static void main(String []args){

      JFrame frame = new JFrame(”俄羅斯方塊“);

      int wigth =(COLS+8)*CELL_SIZE +100;

      int height =ROWS*CELL_SIZE +100;

      frame.setSize(wigth,height);

      frame.setLocationRelativeTo(null);//居中

      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//設(shè)置關(guān)閉窗口就關(guān)閉軟件

      frame.setLayout(null);//取消默認(rèn)布局,取消自動(dòng)充滿

      Tetris panel = new Tetris();

      panel.setLocation(45,25);

      panel.setSize((COLS+8)*CELL_SIZE,ROWS*CELL_SIZE);

      panel.setBorder(new LineBorder(Color.black));

      frame.add(panel);//窗口中添加面板

      frame.setVisible(true);//顯示窗口時(shí)候調(diào)用paint()

      panel.action();

      }

      /*動(dòng)作方法,這里是讓軟件開始動(dòng)作,*/

      public void action(){

      //wall[18][2] = new Cell(18,2,0xff0000);

      startGameAction();

      //重繪方法->盡快調(diào)用paint()

      //startGameAction();

      //this 是當(dāng)前Tetris面板

      this.requestFocus();//為當(dāng)前面板請(qǐng)求獲得輸入焦點(diǎn)

      //this對(duì)象就獲得了輸入焦點(diǎn),以后任何的

      //鍵盤輸入(包括左右方向鍵)目標(biāo)就是這個(gè)面板對(duì)象了!

      //addKeyLIstener添加鍵盤監(jiān)聽,監(jiān)聽那些按鍵輸入了

      this.addKeyListener(new KeyAdapter(){

      public void keyPressed(KeyEvent e){

      int key = e.getKeyCode();//key按鍵

      if(gameOver){

      if(key==KeyEvent.VK_S){

      startGameAction();//啟動(dòng)游戲開始流程

      }

      return;

      }

      if(pause){

      if(key==KeyEvent.VK_C){

      continueAction();

      }return;

      }

      //System.out.println(”Type:“+e.getKeyCode());

      switch(key){

      case KeyEvent.VK_RIGHT :moveRightAction();break;

      case KeyEvent.VK_LEFT :moveLeftAction();break;

      case KeyEvent.VK_DOWN :softDropAction();break;

      case KeyEvent.VK_UP :rotateRightAction();break;

      case KeyEvent.VK_SPACE :hardDropAction();break;

      case KeyEvent.VK_P :pasueAction();break;

      }

      //按鍵->方塊移動(dòng)方法->改變方塊數(shù)據(jù)->repaint()

      //->盡快調(diào)用paint()->利用新數(shù)據(jù)繪制

      repaint();

      }

      private void continueAction(){

      pause = false;

      timer = new Timer();

      timer.schedule(new TimerTask(){

      public void run(){

      softDropAction();

      repaint();

      }

      }, 500, 500);

      }

      private void pasueAction(){

      pause = true;

      timer.cancel();

      }

      });

      }

      //JPanel 類利用paint(涂畫)方法繪制界面

      //子類重寫paint方法可以修改繪圖邏輯

      public static final int BORDER_COLOR = 0x667799;

      public static final int BG_COLOR = 0xC3D5EA;

      public static final int FONT_COLOR = 0;

      public void paint(Graphics g){

      //g 代表綁定在當(dāng)前面板上的畫筆

      //利用畫筆在當(dāng)前 面板上 繪制了一串字符!

      paintBackground(g);//填充背景

      paintWall(g);//繪制墻

      paintTetromino(g);//繪制當(dāng)前方塊

      paintNextOne(g);//繪制下一個(gè)方塊

      paintScore(g);//繪制分?jǐn)?shù)

      paintTetrisBorder(g);//繪制邊線

      }

      private void paintScore(Graphics g){

      int x = 12 * CELL_SIZE;

      int y = 5 * CELL_SIZE;

      Font font = new Font(getFont().getName(),Font.BOLD,25);

      String str = ”分?jǐn)?shù): “+score;

      g.setColor(new Color(FONT_COLOR));

      g.setFont(font);

      g.drawString(str, x, y);

      y+=2*CELL_SIZE;

      str = ”行數(shù): “+lines;

      g.drawString(str, x, y);

      if(gameOver){

      str = ”(T_T)![s]再來!“;

      y+=2*CELL_SIZE;

      g.drawString(str, x, y);

      }

      if(pause){

      str = ”[c]繼續(xù)!“;

      y+=2*CELL_SIZE;

      g.drawString(str, x, y);

      }else{

      str = ”[p]暫停!";

      y+=2*CELL_SIZE;

      g.drawString(str, x, y);

      }

      }

      private void paintNextOne(Graphics g){

      if(nextOne==null)//如果沒有4格方塊就返回,不繪制

      return;

      for(Cell cell : nextOne.getCells()){

      int row = cell.getRow()+1;

      int col = cell.getCol()+9;

      int x = col*CELL_SIZE;

      int y = row*CELL_SIZE;

      g.setColor(new Color(cell.getColor()));

      g.fillRect(x, y, CELL_SIZE, CELL_SIZE);

      g.setColor(new Color(BORDER_COLOR));

      g.drawRect(x, y, CELL_SIZE, CELL_SIZE);

      }

      }

      private void paintTetromino(Graphics g){

      if(tetromino==null)//如果沒有4格方塊就返回,不繪制

      return;

      for(Cell cell : tetromino.getCells()){

      int row = cell.getRow();

      int col = cell.getCol();

      int x = col*CELL_SIZE;

      int y = row*CELL_SIZE;

      g.setColor(new Color(cell.getColor()));

      g.fillRect(x, y, CELL_SIZE, CELL_SIZE);

      g.setColor(new Color(BORDER_COLOR));

      g.drawRect(x, y, CELL_SIZE, CELL_SIZE);

      }

      }

      private void paintWall(Graphics g){

      for(int row = 0;row

      for(int col = 0;col < COLS;col++){

      Cell cell = wall[row][col];

      int x = col*CELL_SIZE;

      int y = row*CELL_SIZE;

      if(cell == null){

      //g.setColor(new Color(BORDER_COLOR));

      // g.drawRect(x, y,//

      CELL_SIZE, CELL_SIZE);

      }else{

      g.setColor(new Color(cell.getColor()));

      g.fillRect(x, y,CELL_SIZE, CELL_SIZE);

      g.setColor(new Color(BORDER_COLOR));

      g.drawRect(col*CELL_SIZE, row*CELL_SIZE,CELL_SIZE, CELL_SIZE);

      }

      }

      }

      }

      private void paintBackground(Graphics g){

      g.setColor(new Color(BG_COLOR));

      g.fillRect(0, 0, getWidth(), getHeight());

      }

      private void paintTetrisBorder(Graphics g){

      g.setColor(new Color(BORDER_COLOR));

      g.drawRect(0, 0, CELL_SIZE*COLS, CELL_SIZE*ROWS-1);

      g.drawRect(CELL_SIZE*COLS,0,CELL_SIZE*8-1, CELL_SIZE*ROWS-1);

      } } =============================================================== package com.tarena.tetris;import java.util.Arrays;import java.util.Random;/* * 四格方塊類,有7種子類:I T S Z J L O * */ public abstract class Tetromino {

      public static final int I_COLOR =0xff6600;

      public static final int T_COLOR =0xffff00;

      public static final int S_COLOR =0x66ccff;

      public static final int Z_COLOR =0x00ff00;

      public static final int J_COLOR =0x0000ff;

      public static final int L_COLOR =0xcc00ff;

      public static final int O_COLOR =0xff0000;

      protected Cell[] cells = new Cell[4];

      /*四格方塊的下落,是四個(gè)格子一起下落*/

      public void softDrop(){

      for(int i = 0;i

      cells[i].drop();

      }

      }

      /*向左移動(dòng)一步*/

      public void moveLeft(){

      for(int i = 0;i

      Cell cell = cells[i];//引用賦值

      cell.left();

      }

      }

      public void moveRight(){

      //增強(qiáng)for循環(huán),是傳統(tǒng)數(shù)組迭代的“簡(jiǎn)化版本”,//也稱為foreach循環(huán)(foreach迭代)(java 5以后)

      for(Cell cell:cells){//底層實(shí)現(xiàn)就是經(jīng)典迭代

      cell.right();

      }

      }

      public Cell[] getCells(){

      return cells;

      }

      protected Offset[] states;//旋轉(zhuǎn)的狀態(tài)

      protected class Offset{

      int row0,col0;

      int row1,col1;

      int row2,col2;

      int row3,col3;

      public Offset(int row0, int col0, int row1,int col1, int row2, int col2,int row3, int col3){

      this.row0 = row0;

      this.col0 = col0;

      this.row1 = row1;

      this.col1 = col1;

      this.row2 = row2;

      this.col2 = col2;

      this.row3 = row3;

      this.col3 = col3;

      }

      }

      private int index = 10000-1;

      /*向右轉(zhuǎn)*/

      public void rotateRight(){

      index++;

      Offset offset = states[index%states.length];

      Cell axis = cells[0];//找到軸(axis)的位置

      cells[0].setRow(offset.row0+axis.getRow());

      cells[0].setCol(offset.col0+axis.getCol());

      cells[1].setRow(offset.row1+axis.getRow());

      cells[1].setCol(offset.col1+axis.getCol());

      cells[2].setRow(offset.row2+axis.getRow());

      cells[2].setCol(offset.col2+axis.getCol());

      cells[3].setRow(offset.row3+axis.getRow());

      cells[3].setCol(offset.col3+axis.getCol());

      }

      public void rotateLeft(){

      index--;

      Offset offset = states[index%states.length];

      Cell axis = cells[0];//找到軸(axis)的位置

      cells[0].setRow(offset.row0+axis.getRow());

      cells[0].setCol(offset.col0+axis.getCol());

      cells[1].setRow(offset.row1+axis.getRow());

      cells[1].setCol(offset.col1+axis.getCol());

      cells[2].setRow(offset.row2+axis.getRow());

      cells[2].setCol(offset.col2+axis.getCol());

      cells[3].setRow(offset.row3+axis.getRow());

      cells[3].setCol(offset.col3+axis.getCol());

      }

      /*隨機(jī)生成一個(gè)具體方法*/

      public static Tetromino randomTetromino(){

      Random random = new Random();

      int type = random.nextInt(7);//0~6

      switch(type){

      case 0:return new I();

      case 1:return new T();

      case 2:return new S();

      case 3:return new J();

      case 4:return new Z();

      case 5:return new L();

      case 6:return new O();

      }

      return null;

      }

      public String toString(){

      return Arrays.toString(cells);

      }

      public boolean contains(int row, int col){

      for(int i =0;i

      Cell cell = cells[i];

      if(cell.getRow()==row && cell.getCol()==col){

      return true;

      }

      }

      return false;

      }

      } class I extends Tetromino{

      public I(){

      cells[0] = new Cell(0,4,I_COLOR);

      cells[1] = new Cell(0,3,I_COLOR);

      cells[2] = new Cell(0,5,I_COLOR);

      cells[3] = new Cell(0,6,I_COLOR);

      states = new Offset[]{

      new Offset(0,0,-1,0,1,0,2,0),new Offset(0,0,0,-1,0,1,0,2),};

      } } class T extends Tetromino{

      public T(){

      cells[0] = new Cell(0,4,T_COLOR);

      cells[1] = new Cell(0,3,T_COLOR);

      cells[2] = new Cell(0,5,T_COLOR);

      cells[3] = new Cell(1,4,T_COLOR);

      states = new Offset[]{

      new Offset(0,0,1,0,-1,0,0,1),new Offset(0,0,0,-1,0,1,1,0),new Offset(0,0,1,0,-1,0,0,-1),new Offset(0,0,0,1,0,-1,-1,0),};

      } } class S extends Tetromino{

      public S(){

      cells[0] = new Cell(0,4,S_COLOR);

      cells[1] = new Cell(0,5,S_COLOR);

      cells[2] = new Cell(1,3,S_COLOR);

      cells[3] = new Cell(1,4,S_COLOR);

      states = new Offset[]{

      new Offset(0,0,-1,0,1,1,0,1),new Offset(0,0,0,1,1,-1,1,0),};

      } } class Z extends Tetromino{

      public Z(){

      cells[0] = new Cell(0,4,Z_COLOR);

      cells[1] = new Cell(0,3,Z_COLOR);

      cells[2] = new Cell(1,4,Z_COLOR);

      cells[3] = new Cell(1,5,Z_COLOR);

      states = new Offset[]{

      new Offset(0,0,-1,1,0,1,1,0),new Offset(0,0,-1,-1,-1,0,0,1),};

      } } class J extends Tetromino{

      public J(){

      cells[0] = new Cell(0,4,J_COLOR);

      cells[1] = new Cell(0,3,J_COLOR);

      cells[2] = new Cell(0,5,J_COLOR);

      cells[3] = new Cell(1,5,J_COLOR);

      states = new Offset[]{

      new Offset(0,0,-1,0,1,0,1,-1),new Offset(0,0,0,1,0,-1,-1,-1),new Offset(0,0,1,0,-1,0,-1,1),new Offset(0,0,0,-1,0,1,1,1),};

      } } class L extends Tetromino{

      public L(){

      cells[0] = new Cell(0,4,L_COLOR);

      cells[1] = new Cell(0,3,L_COLOR);

      cells[2] = new Cell(0,5,L_COLOR);

      cells[3] = new Cell(1,3,L_COLOR);

      states = new Offset[]{

      new Offset(0,0,-1,0,1,0,-1,-1),new Offset(0,0,0,1,0,-1,-1,1),new Offset(0,0,1,0,-1,0,1,1),new Offset(0,0,0,-1,0,1,1,-1),};

      } } class O extends Tetromino{

      public O(){

      cells[0] = new Cell(0,4,O_COLOR);

      cells[1] = new Cell(0,5,O_COLOR);

      cells[2] = new Cell(1,4,O_COLOR);

      cells[3] = new Cell(1,5,O_COLOR);

      states = new Offset[]{

      new Offset(0,0,0,1,1,0,1,1),new Offset(0,0,0,1,1,0,1,1),};

      } }

      第三篇:達(dá)內(nèi)培訓(xùn)總結(jié)

      達(dá)內(nèi)培訓(xùn)總結(jié)

      今年的7月初我和大多數(shù)達(dá)內(nèi)學(xué)員一樣,興奮的進(jìn)入了達(dá)內(nèi)進(jìn)行培訓(xùn),開始了C/C++的培訓(xùn)學(xué)習(xí),轉(zhuǎn)眼間4個(gè)多月已經(jīng)過了,也結(jié)束了我們培訓(xùn)課程。雖然自己學(xué)的是軟件技術(shù)專業(yè),但自己在來達(dá)內(nèi)之前也沒有接觸過C跟C++,既然走在了這條路上,我想我會(huì)一直走在這條路上,給自己的這四個(gè)月來說下幾點(diǎn):

      1、端正自己學(xué)習(xí)的態(tài)度

      在課程學(xué)習(xí)中如何端正自己的態(tài)度也是很重要的。在達(dá)內(nèi)學(xué)習(xí)的過程中,每門課的時(shí)間都是很緊的,每天很辛苦,我也想過自己到底自己要不要學(xué)C/C++,但是自己還是保持了下來,有一個(gè)良好的心態(tài)去接受新的東西,哪些是自己懂的,哪些是自己不會(huì)的,自己還是要有一個(gè)計(jì)劃,跟不上老師的講課進(jìn)度,也要試著去趕上老師的進(jìn)度,調(diào)整自己的學(xué)習(xí)方法。

      2、編程當(dāng)作興趣

      在學(xué)習(xí)之初感覺編程很枯燥,所以自己還是要培養(yǎng)出對(duì)編程的興趣。一開始其實(shí)多編程的興趣也不是很大,只是慢慢習(xí)慣了枯燥,不是很感興趣只要裝著很感興趣,久而久之開始對(duì)編程有了興趣,正所謂興趣才是最后的老師。

      3、多敲敲代碼

      程序員是代碼敲出來。在達(dá)內(nèi),每天學(xué)的東西到很多而且新的理論知識(shí)也多,然而那只是理論,和實(shí)際的應(yīng)用還有很大差距,而這些差距只有在實(shí)際的代碼編寫中我們才能體會(huì)出來。所以還是每天堅(jiān)持多敲敲多練練??傊刻煲WC一定量的代碼,這樣我們才會(huì)有真正水平上的提高。另外,在實(shí)際動(dòng)手的過程中,還要多留心編譯器錯(cuò)誤提示,也有助于我們對(duì)語言的學(xué)習(xí)和理解。

      4、多堅(jiān)持一下

      學(xué)習(xí)C/C++畢竟是非??菰锏囊患虑?,雖然我們可以培養(yǎng)自己的興趣,但是4個(gè)月的時(shí)間畢竟很讓人疲勞、很累,隨著時(shí)間的推移,我們剛開始時(shí)的興奮勁也慢慢減退了,有什么感覺沒什么希望,我們能做的就只有多堅(jiān)持一下,忍得住寂寞,才守得住陣地,保得住成果。自己還是踏踏實(shí)實(shí)的堅(jiān)持完成這4個(gè)月的學(xué)習(xí),還一直在堅(jiān)持。

      其他的也沒有什么要說的,一切多看自己的能力。

      第四篇:達(dá)內(nèi)學(xué)習(xí)心得:精心總結(jié)的面向?qū)ο?/a>

      達(dá)內(nèi)學(xué)習(xí)心得:精心總結(jié)的面向?qū)ο?/p>

      參賽學(xué)員:方錢有

      獲獎(jiǎng)獎(jiǎng)項(xiàng):二等獎(jiǎng)

      什么面向?qū)ο?

      個(gè)人分析覺得:在程序設(shè)計(jì)里,面向?qū)ο笫且环N相對(duì)說法,相對(duì)于面向過程而言的;

      面向“對(duì)象“:即重點(diǎn)在于“對(duì)象”;而面向過程:則重點(diǎn)在于“過程”,簡(jiǎn)單說:就是我我們看待事物在眼光上注重點(diǎn)不一樣;比如說:我們?cè)u(píng)判一個(gè)女孩漂亮與否,有的人看重外表,有的人則看重“心靈”,只是側(cè)重點(diǎn)不一樣。

      舉個(gè)例子:把大象裝進(jìn)冰箱!

      面向過程面向?qū)ο螅ㄗ⒅匾幌盗袆?dòng)作即過程)(注重動(dòng)作所操作的承受者[“對(duì)象”])

      “打開”冰箱“冰箱”打開“裝入”大象“大象”裝入“關(guān)閉”冰箱“冰箱”關(guān)閉

      類:通俗的說類就是“一類事物的簡(jiǎn)稱”,并且這些事物至少具有一點(diǎn)“共同的”特征.比如說:動(dòng)物就是一個(gè)類

      對(duì)象:就是某一類中一個(gè)具體的(就是可以具體描述出來的)東西,比如:動(dòng)物(類)里的“狗”就是一個(gè)對(duì)象。(個(gè)人覺得對(duì)象相對(duì)于類而言的,因?yàn)楣酚挚梢苑趾枚喾N,‘狗’相對(duì)于‘哈士奇’是一個(gè)類,‘哈士奇’是‘狗’類的一個(gè)具體對(duì)象)

      在生活中就拿描述汽車來說,我們都知道汽車都有4個(gè)輪子; 都有跑的功能 可以如下描述:

      類汽車

      屬性: 4個(gè)輪

      功能: 跑

      那么怎么在Java中描述汽車這類呢?

      class car{

      int wheel=4;//屬性: 4個(gè)輪

      void run(){//方法(功能): 跑

      System.out.println(“是汽車都會(huì)跑”);

      }

      }

      那么可見“出租車”應(yīng)當(dāng)是“汽車”這類的一個(gè)具體化(實(shí)實(shí)在在的例子即“實(shí)例”)對(duì)象,那自然出租車也就具備了汽車這類所具備的“共有”屬性功能!

      如何創(chuàng)建一個(gè)出租車對(duì)象呢?java中通過new關(guān)鍵字來創(chuàng)建一個(gè)類的實(shí)例即對(duì)象,也叫類的實(shí)例化,就是把類具體化成一個(gè)實(shí)例嘛!

      格式:類名對(duì)象名 =mew 類名()

      Cartexi =newCar();

      創(chuàng)建了“出租車”對(duì)象(實(shí)例)之后那么它也就有了如下“自己”的屬性和功能。

      int wheel=4;//屬性: 4個(gè)輪

      void run(){//功能: 跑

      System.out.println(“我是出租車我也會(huì)跑”);

      }

      我們?nèi)绾蝸碓L問對(duì)象中的它自己的屬性和方法呢?

      格式:對(duì)象.屬性;對(duì)象.方法名();這一點(diǎn)也驗(yàn)證了面向?qū)ο缶幊痰膫?cè)重點(diǎn)在于“對(duì)

      象”上;

      texi.wheel;texi.run()

      *******************************************************************************

      *******************************************************************************

      *******************************************************************************

      1.封裝:

      從字面可以解讀為將東西封起來再裝好。要想拿到里面的東西就得有相應(yīng)的方法打開,才能

      拿到。

      舉例來說:一個(gè)房間的門如果沒有上鎖,那么大家都可以進(jìn)去拿東西,但現(xiàn)在我們不想讓誰

      都進(jìn)來拿東西,我們可以將房門上鎖,只對(duì)外提供一把鑰匙,只有有鑰匙的人才能進(jìn)來,這

      就是“封裝”現(xiàn)象!

      在java程序中,“封裝”現(xiàn)象如何實(shí)現(xiàn)呢?

      可以這樣實(shí)現(xiàn):將類中的一些屬性和方法用private關(guān)鍵字修飾,將他們“私有化(即不對(duì)

      外直接公開)”,使外部其他類不能通過創(chuàng)建該類對(duì)象或通過類名直接訪問這些屬性和方法;

      只對(duì)外提供公有的方法,外部其他類必須通過該類對(duì)外提供的公有方法來訪問該類的相應(yīng)成員;例如:

      class Person{

      private String name;//將name屬性私有化(封裝)[相當(dāng)于了上鎖]使外部其他類不能直

      接訪問到

      public SetName(String name){//對(duì)外提供公有方法(相當(dāng)于房門鑰匙)供外部其他類訪問

      到本類屬性

      this.name=name;

      }

      }

      2.繼承:

      從字面來說繼承就是子父類關(guān)系的簡(jiǎn)稱,就是兒子(女兒也行,好吧)會(huì)繼承老爸的一些屬性和行為

      在java中如何描述繼承關(guān)系呢?

      注意:第一得知道在java中繼承是類與類之間或者是接口與接口之間才有繼承關(guān)系;

      通過extends關(guān)鍵字來描述繼承關(guān)系

      例如:老爸這個(gè)類

      class Dad{

      String sex=man;

      void smoke(){

      System.out.println(“老子會(huì)抽煙!”);

      }

      }

      那么我們?cè)趺磥碜寖鹤舆@個(gè)類繼承老爸這個(gè)類呢?

      class Son extends Dad{//通過extends關(guān)鍵字兒子這個(gè)類就繼承老爸這個(gè)類了

      String name;//定義自己的屬性

      String sex=man;//繼承過來的屬性,無須再定義,這里寫出來是為了好理解

      void smoke(){//繼承過來的方法,無須再定義,這里寫出來是為了好理解

      System.out.println(“老子會(huì)抽煙!”);

      }

      void playBall(){//定義自己的方法

      System.out.println(“兒子即會(huì)打球又會(huì)抽煙!”);

      }

      void somke(){//重寫的方法

      System.out.println(“我不抽20塊以下的煙”);

      }

      void smoke(int n){//重載的方法

      System.out.println(“我抽了+n+”年的煙了“);

      }

      }

      那么具有繼承關(guān)系的兩個(gè)類有什么特點(diǎn)呢?

      1)子類會(huì)將父類的屬性和方法繼承過來,當(dāng)然子類也可以自己定義的屬性和方法

      2)當(dāng)子類自己定義的方法和父類繼承過來的方法相同時(shí)會(huì)發(fā)生“重寫“現(xiàn)象!

      3)父類用private關(guān)鍵字私有的方法是不能被繼承的!

      4)子類可以使用super訪問父類的屬性和方法

      5)子類通過重寫父類方法,修改父類的功能

      6)子類構(gòu)造器一定調(diào)用父類的無參構(gòu)造器

      7)構(gòu)造器不能繼承

      3.多態(tài):

      字面意思就是多種形態(tài),也就是說一種事物同時(shí)局部多種形態(tài).注意:要出現(xiàn)多態(tài)情況,那么類和類之間一定得是繼承關(guān)系,或者類和接口是實(shí)現(xiàn)關(guān)系

      我覺得:在java中多態(tài)是相對(duì)于一個(gè)對(duì)象而言的,就是父類型引用變量引用子類對(duì)象,并

      且父類型引用變量可以接受不同子類的對(duì)象

      例如:拿上面的舉例

      Dad uncle=new Son();父類引用變量uncle即具備Son類的成員又具備父類的成員;這也稱

      為“向上造型”;

      多態(tài)時(shí)的特點(diǎn)

      1)多態(tài)時(shí)訪問成員變量,如uncle.name;

      編譯時(shí)看等號(hào)左邊,父類有該成員變量則編譯通過,否則編譯出錯(cuò)!

      運(yùn)行時(shí)也看等號(hào)左邊,有則運(yùn)行結(jié)果

      2)多態(tài)時(shí)訪問方法,如uncle.smoke()

      編譯時(shí)看等號(hào)左邊,父類有該成員方法則編譯通過,否則編譯出錯(cuò)!

      運(yùn)行時(shí)看等號(hào)右邊,父類有該方法,子類沒有該方法執(zhí)行父類方法;父類有該方法,子類也

      有該方法執(zhí)行子類方法

      3)多態(tài)時(shí)訪問靜態(tài)方法

      編譯運(yùn)行都看等號(hào)左邊

      *******************************************************************************

      *******************************************************************************

      *******************************************************************************

      *********************

      4.抽象(有爭(zhēng)議):

      什么是抽象?

      抽象就是不具體。

      一般我們把不能具體描述的東西約定俗成為“抽象”的東西。例如:我們說一個(gè)人長(zhǎng)得很

      “抽象”,n你想你能具體形容描述出來么?

      在JAVA中如何描述抽象這個(gè)概念呢?

      我覺得在java中抽象類是由抽象方法而衍生出來的,為什么呢?

      因?yàn)镴ava規(guī)定一個(gè)類中定義了抽象方法那這個(gè)類就跟著必須定義為抽象類,而不是因

      為先定義抽象類再跟著規(guī)定抽象類中的方法必須是抽象的,可能最后理解的結(jié)果是一樣的但

      性質(zhì)是不一樣的(個(gè)人理解)簡(jiǎn)單說:就是有抽象方法的類一定是抽象類,但是抽象類中不

      一定都是抽象方法,也可以有具體方法。

      首先就是當(dāng)我要在一個(gè)類定義一個(gè)方法時(shí),暫時(shí)我不知道該方法具體功能是什么;等我想好

      了我在用他實(shí)現(xiàn)一個(gè)功能時(shí)我再具體描述他功能,這樣我們就可以將這個(gè)方法用abstract關(guān)

      鍵字修飾定義為抽象方法

      (還有一點(diǎn)也就是什么時(shí)候定義抽象類的?也可以說抽象類是向上抽取而來的,就是幾個(gè)類

      據(jù)有共同的屬性和方法,不想每個(gè)類都定義一次,那么定義一個(gè)公有類(即抽象類)其他類

      只要繼承抽象類再重寫方法就行!)

      例如:我有一百塊錢,現(xiàn)在我不知道怎么用,等我想好了在具體怎么用!

      abstract class Money{//因?yàn)橛辛顺橄蠓椒ㄋ员仨毝x為抽象類

      public abstract void buySomthing();//現(xiàn)在不知道怎么用,那就把它的功能代碼體去掉

      }

      //現(xiàn)在我餓了,想買東西吃了,我就知道怎么用了

      class Hungry extends Money{

      void buySomething(){

      System.out.println(”我餓了,現(xiàn)在我要買東西吃!“)

      }

      }

      抽象類的特點(diǎn)

      1)抽象類不能實(shí)例化

      2)抽象類可以繼承抽象類

      3)繼承抽象類必須得重寫抽象方法

      5.抽象類,接口,普通類 的不同點(diǎn)和相同點(diǎn)?

      1)不同點(diǎn):

      普通類接口抽象類

      可以直接實(shí)例化對(duì)象不可以直接實(shí)例化對(duì)象不可以直接實(shí)例化對(duì)象

      可以定義任何成員只能定義抽象成員方法和常量成員

      方法必須定義為抽象其他和普通類相同

      可以被繼承類可以實(shí)現(xiàn)接口,且可以實(shí)現(xiàn)多個(gè)接口可以被繼承

      接口可以繼承多個(gè)接口抽象類有構(gòu)造方

      法,接口中不能有

      抽象類有普通成員變

      量,接口中沒有

      抽象類可以有非抽象方

      法,接口中不能有

      抽象類可以用public、protected修飾,接口中只能public(默認(rèn)public)

      抽象類包含靜態(tài)方法,接

      口中沒有

      接口中的變量只能是

      public static final,抽象類中可以是任意類型修飾

      2)相同點(diǎn):都可以用于描述(封裝)事物的,內(nèi)部類分為哪幾種?分別如何創(chuàng)建對(duì)象?

      分為 局部?jī)?nèi)部類,匿名內(nèi)部類...3種

      1)外部類名.內(nèi)部類名 對(duì)象名=new 外部類名().new 內(nèi)部類名()

      2)外部類名.內(nèi)部類名 對(duì)象名=外部類名.new 內(nèi)部類名()

      3)....不記得了第3種

      匿名內(nèi)部類

      二、集合集合的定義?

      集合:用來保存一組數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)

      集合的父接口,實(shí)現(xiàn)接口,實(shí)現(xiàn)類,實(shí)現(xiàn)類的常用方法是什么?(建議以樹狀圖畫出來,便

      于加深印象)。

      Collectionlistset

      ArraylistLinkedListHashSet

      TreeSet

      1.List集合List集合的特征是元素可重復(fù)且有序 ;我們可以把他看成是一個(gè)動(dòng)態(tài)數(shù)組,一般通過下標(biāo)

      訪問

      ArrayList和LinkedList最常用的兩個(gè)子類實(shí)現(xiàn)

      1)list可以使用for循環(huán)遍歷

      for(int i=;i

      list.get(i);

      }

      2)list的淺層復(fù)制

      調(diào)用ArraryList.clone()方法

      注意:不能使用list.clone(),clone()方法是Object類的方法,list是接口是不能繼承Object類的2.Set集合:

      不重復(fù)且無序集

      遍歷set只能迭代器,用迭代器遍歷集合遵循的操作原則:先問后取。問一次取一次。Iterator it=set.iterator();

      while(it.hashnext()){

      E e=it.next();

      }

      3)map表

      Map存儲(chǔ)數(shù)據(jù)使用key-value(鍵-值)對(duì)的形式存儲(chǔ)數(shù)據(jù)的。

      對(duì)于Map而言,要求key值是唯一的。value值可以重復(fù)

      獲取數(shù)據(jù)時(shí),使用key可以獲取其對(duì)應(yīng)的value

      遍歷map有3種方法

      1)遍歷key

      Set keySet = map.keySet();

      for(String key:keySet){

      System.out.println(”key:“ + key);

      //可以根據(jù)每一個(gè)key獲取其對(duì)應(yīng)的value值

      int value = map.get(key);

      2)遍歷value

      Collection values = map.values();

      Iterator it = values.iterator();

      while(it.hasNext()){

      int value = it.next();//不能采用 map.next()

      System.out.println(”value:“ + value);

      注意:通過迭代器在遍歷集合的過程中,不能通過集合(即不能采用 map.next())去改變集合元素?cái)?shù)量

      3)遍歷鍵值對(duì)

      Set> entries= map.entrySet();

      for(Entry entry : entries){

      //獲取一組鍵值對(duì)的鍵和值

      String key = entry.getKey();

      int value = entry.getValue();

      System.out.println(key + ”=" + value);

      Collection接口方法的定義

      這里我主要列舉 Iterator iterator()方法的使用

      Collection提供的方法 Iterator iterator()方法來獲取迭代器

      Iterator是一個(gè)接口,定義了遍歷集合應(yīng)有的方法。

      使用迭代器遍歷集合遵循的操作原則:先問后取。問一次取一次。問:boolean hashNext()

      ?。篛bject next()

      迭代器可以將取出的數(shù)據(jù)刪除掉

      刪:remove()將當(dāng)前獲取的元素刪除掉。

      注意:1)刪除的是next()取出的元素。且只能刪除一次!

      2)調(diào)用1次next()后只能調(diào)用一次remove()!

      第五篇:達(dá)內(nèi)學(xué)習(xí)心得:精心總結(jié)的面向?qū)ο?/a>

      達(dá)內(nèi)學(xué)習(xí)心得:精心總結(jié)的面向?qū)ο?/p>

      參賽學(xué)員:方錢有 獲獎(jiǎng)獎(jiǎng)項(xiàng):二等獎(jiǎng) 什么面向?qū)ο? 個(gè)人分析覺得:在程序設(shè)計(jì)里,面向?qū)ο笫且环N相對(duì)說法,相對(duì)于面向過程而言的; 面向“對(duì)象“:即重點(diǎn)在于“對(duì)象”;而面向過程:則重點(diǎn)在于“過程”,簡(jiǎn)單說:就是我我們看待事物在眼光上注重點(diǎn)不一樣;比如說:我們?cè)u(píng)判一個(gè)女孩漂亮與否,有的人看重外表,有的人則看重“心靈”,只是側(cè)重點(diǎn)不一樣。舉個(gè)例子:把大象裝進(jìn)冰箱!

      面向過程

      面向?qū)ο?/p>

      (注重一系列動(dòng)作即過程)

      (注重動(dòng)作所操作的承受者[“對(duì)象”])

      “打開”冰箱

      “冰箱”打開

      “裝入”大象

      “大象”裝入

      “關(guān)閉”冰箱

      “冰箱”關(guān)閉

      類:通俗的說類就是“一類事物的簡(jiǎn)稱”,并且這些事物至少具有一點(diǎn)“共同的”特征.比如說:動(dòng)物就是一個(gè)類

      對(duì)象:就是某一類中一個(gè)具體的(就是可以具體描述出來的)東西,比如:動(dòng)物(類)里的“狗”就是一個(gè)對(duì)象。(個(gè)人覺得對(duì)象相對(duì)于類而言的,因?yàn)楣酚挚梢苑趾枚喾N,‘狗’相對(duì)于‘哈士奇’是一個(gè)類,‘哈士奇’是‘狗’類的一個(gè)具體對(duì)象)

      在生活中就拿描述汽車來說,我們都知道汽車都有4個(gè)輪子; 都有跑的功能 可以如下描述:

      汽車

      屬性: 4個(gè)輪

      功能: 跑

      那么怎么在Java中描述汽車這類呢? class car{

      int wheel=4;//屬性: 4個(gè)輪

      void run(){//方法(功能): 跑

      System.out.println(“是汽車都會(huì)跑”);

      } } 那么可見“出租車”應(yīng)當(dāng)是“汽車”這類的一個(gè)具體化(實(shí)實(shí)在在的例子即“實(shí)例”)對(duì)象,那自然出租車也就具備了汽車這類所具備的“共有”屬性功能!

      如何創(chuàng)建一個(gè)出租車對(duì)象呢?java中通過new關(guān)鍵字來創(chuàng)建一個(gè)類的實(shí)例即對(duì)象,也叫類的實(shí)例化,就是把類具體化成一個(gè)實(shí)例嘛!格式:類名

      對(duì)象名 = mew 類名

      ()

      Car

      texi =

      new Car();創(chuàng)建了“出租車”對(duì)象(實(shí)例)之后那么它也就有了如下“自己”的屬性和功能。

      int wheel=4;//屬性: 4個(gè)輪

      void run(){//功能: 跑

      System.out.println(“我是出租車我也會(huì)跑”);

      } 我們?nèi)绾蝸碓L問對(duì)象中的它自己的屬性和方法呢? 格式:對(duì)象.屬性;

      對(duì)象.方法名();

      這一點(diǎn)也驗(yàn)證了面向?qū)ο缶幊痰膫?cè)重點(diǎn)在于“對(duì)象”上;

      texi.wheel;

      texi.run()*********************************************************************************************************************************************************************************************************************************************

      1.封裝:

      從字面可以解讀為將東西封起來再裝好。要想拿到里面的東西就得有相應(yīng)的方法打開,才能拿到。

      舉例來說:一個(gè)房間的門如果沒有上鎖,那么大家都可以進(jìn)去拿東西,但現(xiàn)在我們不想讓誰都進(jìn)來拿東西,我們可以將房門上鎖,只對(duì)外提供一把鑰匙,只有有鑰匙的人才能進(jìn)來,這就是“封裝”現(xiàn)象!

      在java程序中,“封裝”現(xiàn)象如何實(shí)現(xiàn)呢?

      可以這樣實(shí)現(xiàn):將類中的一些屬性和方法用private關(guān)鍵字修飾,將他們“私有化(即不對(duì)外直接公開)”,使外部其他類不能通過創(chuàng)建該類對(duì)象或通過類名直接訪問這些屬性和方法;只對(duì)外提供公有的方法,外部其他類必須通過該類對(duì)外提供的公有方法來訪問該類的相應(yīng)成員;例如: class Person{

      private String name;//將name屬性私有化(封裝)[相當(dāng)于了上鎖]使外部其他類不能直接訪問到

      public SetName(String name){//對(duì)外提供公有方法(相當(dāng)于房門鑰匙)供外部其他類訪問到本類屬性

      this.name=name;

      } }

      2.繼承:

      從字面來說繼承就是子父類關(guān)系的簡(jiǎn)稱,就是兒子(女兒也行,好吧)會(huì)繼承老爸的一些屬性和行為

      在java中如何描述繼承關(guān)系呢?

      注意:

      第一得知道在java中繼承是類與類之間或者是接口與接口之間才有繼承關(guān)系;通過extends關(guān)鍵字來描述繼承關(guān)系 例如:老爸這個(gè)類 class Dad{

      String sex=man;

      void smoke(){

      System.out.println(“老子會(huì)抽煙!”);

      } } 那么我們?cè)趺磥碜寖鹤舆@個(gè)類繼承老爸這個(gè)類呢?

      class Son extends Dad{//通過extends關(guān)鍵字兒子這個(gè)類就繼承老爸這個(gè)類了

      String name;//定義自己的屬性

      String sex=man;//繼承過來的屬性,無須再定義,這里寫出來是為了好理解

      void smoke(){//繼承過來的方法,無須再定義,這里寫出來是為了好理解

      System.out.println(“老子會(huì)抽煙!”);

      }

      void playBall(){//定義自己的方法

      System.out.println(“兒子即會(huì)打球又會(huì)抽煙!”);

      }

      void somke(){//重寫的方法

      System.out.println(“我不抽20塊以下的煙”);

      }

      void smoke(int n){//重載的方法

      System.out.println(“我抽了+n+”年的煙了“);

      } } 那么具有繼承關(guān)系的兩個(gè)類有什么特點(diǎn)呢?

      1)子類會(huì)將父類的屬性和方法繼承過來,當(dāng)然子類也可以自己定義的屬性和方法 2)當(dāng)子類自己定義的方法和父類繼承過來的方法相同時(shí)會(huì)發(fā)生“重寫“現(xiàn)象!3)父類用private關(guān)鍵字私有的方法是不能被繼承的!4)子類可以使用super訪問父類的屬性和方法 5)子類通過重寫父類方法,修改父類的功能 6)子類構(gòu)造器一定調(diào)用父類的無參構(gòu)造器 7)構(gòu)造器不能繼承

      3.多態(tài):

      字面意思就是多種形態(tài),也就是說一種事物同時(shí)局部多種形態(tài).注意:要出現(xiàn)多態(tài)情況,那么類和類之間一定得是繼承關(guān)系,或者類和接口是實(shí)現(xiàn)關(guān)系 我覺得:在java中多態(tài)是相對(duì)于一個(gè)對(duì)象而言的,就是父類型引用變量引用子類對(duì)象,并且父類型引用變量可以接受不同子類的對(duì)象 例如:拿上面的舉例

      Dad uncle=new Son();父類引用變量uncle即具備Son類的成員又具備父類的成員;這也稱為“向上造型”; 多態(tài)時(shí)的特點(diǎn)

      1)多態(tài)時(shí)訪問成員變量,如uncle.name;編譯時(shí)看等號(hào)左邊,父類有該成員變量則編譯通過,否則編譯出錯(cuò)!運(yùn)行時(shí)也看等號(hào)左邊,有則運(yùn)行結(jié)果 2)多態(tài)時(shí)訪問方法,如uncle.smoke()編譯時(shí)看等號(hào)左邊,父類有該成員方法則編譯通過,否則編譯出錯(cuò)!運(yùn)行時(shí)看等號(hào)右邊,父類有該方法,子類沒有該方法執(zhí)行父類方法;父類有該方法,子類也有該方法執(zhí)行子類方法 3)多態(tài)時(shí)訪問靜態(tài)方法 編譯運(yùn)行都看等號(hào)左邊

      ******************************************************************************************************************************************************************************************************************************************************************

      4.抽象(有爭(zhēng)議):

      什么是抽象?

      抽象就是不具體。

      一般我們把不能具體描述的東西約定俗成為“抽象”的東西。例如:我們說一個(gè)人長(zhǎng)得很“抽象”,n你想你能具體形容描述出來么? 在JAVA中如何描述抽象這個(gè)概念呢?

      我覺得在java中抽象類是由抽象方法而衍生出來的,為什么呢?

      因?yàn)镴ava規(guī)定一個(gè)類中定義了抽象方法那這個(gè)類就跟著必須定義為抽象類,而不是因?yàn)橄榷x抽象類再跟著規(guī)定抽象類中的方法必須是抽象的,可能最后理解的結(jié)果是一樣的但性質(zhì)是不一樣的(個(gè)人理解)簡(jiǎn)單說:就是有抽象方法的類一定是抽象類,但是抽象類中不一定都是抽象方法,也可以有具體方法。首先就是當(dāng)我要在一個(gè)類定義一個(gè)方法時(shí),暫時(shí)我不知道該方法具體功能是什么;等我想好了我在用他實(shí)現(xiàn)一個(gè)功能時(shí)我再具體描述他功能,這樣我們就可以將這個(gè)方法用abstract關(guān)鍵字修飾定義為抽象方法

      (還有一點(diǎn)也就是什么時(shí)候定義抽象類的?也可以說抽象類是向上抽取而來的,就是幾個(gè)類據(jù)有共同的屬性和方法,不想每個(gè)類都定義一次,那么定義一個(gè)公有類(即抽象類)其他類只要繼承抽象類再重寫方法就行?。?/p>

      例如:我有一百塊錢,現(xiàn)在我不知道怎么用,等我想好了在具體怎么用!abstract class Money{//因?yàn)橛辛顺橄蠓椒ㄋ员仨毝x為抽象類

      public abstract void buySomthing();//現(xiàn)在不知道怎么用,那就把它的功能代碼體去掉 } //現(xiàn)在我餓了,想買東西吃了,我就知道怎么用了 class Hungry extends Money{

      void buySomething(){

      System.out.println(”我餓了,現(xiàn)在我要買東西吃!“)

      } } 抽象類的特點(diǎn)

      1)抽象類不能實(shí)例化 2)抽象類可以繼承抽象類

      3)繼承抽象類必須得重寫抽象方法

      5.抽象類,接口,普通類 的不同點(diǎn)和相同點(diǎn)?

      1)不同點(diǎn):

      普通類

      接口

      抽象類 可以直接實(shí)例化對(duì)象

      不可以直接實(shí)例化對(duì)象

      不可以直接實(shí)例化對(duì)象

      可以定義任何成員

      只能定義抽象成員方法和常量

      成員方法必須定義為抽象其他和普通類相同

      可以被繼承

      類可以實(shí)現(xiàn)接口,且可以實(shí)現(xiàn)多個(gè)接口

      可以被繼承

      接口可以繼承多個(gè)接口

      抽象類有構(gòu)造方法,接口中不能有

      抽象類有普通成員變量,接口中沒有

      抽象類可以有非抽象方法,接口中不能有

      抽象類可以用public、protected修飾,接口中只能public(默認(rèn)public)

      抽象類包含靜態(tài)方法,接口中沒有

      接口中的變量只能是public static final,抽象類中可以是任意類型修飾

      2)相同點(diǎn):都可以用于描述(封裝)事物的,內(nèi)部類分為哪幾種?分別如何創(chuàng)建對(duì)象? 分為 局部?jī)?nèi)部類,匿名內(nèi)部類...3種

      1)外部類名.內(nèi)部類名 對(duì)象名=new 外部類名().new 內(nèi)部類名()2)外部類名.內(nèi)部類名 對(duì)象名=外部類名.new 內(nèi)部類名()3)....不記得了第3種 匿名內(nèi)部類

      二、集合集合的定義?

      集合:用來保存一組數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)

      集合的父接口,實(shí)現(xiàn)接口,實(shí)現(xiàn)類,實(shí)現(xiàn)類的常用方法是什么?(建議以樹狀圖畫出來,便于加深印象)。

      Collection

      list

      set

      Arraylist

      LinkedList

      HashSet TreeSet

      1.List集合

      List集合的特征是元素可重復(fù)且有序 ;我們可以把他看成是一個(gè)動(dòng)態(tài)數(shù)組,一般通過下標(biāo)訪問

      ArrayList和LinkedList最常用的兩個(gè)子類實(shí)現(xiàn) 1)list可以使用for循環(huán)遍歷 for(int i=;i

      list.get(i);} 2)list的淺層復(fù)制

      調(diào)用ArraryList.clone()方法

      注意:不能使用list.clone(),clone()方法是Object類的方法,list是接口是不能繼承Object類的

      2.Set集合: 不重復(fù)且無序集

      遍歷set只能迭代器,用迭代器遍歷集合遵循的操作原則:先問后取。問一次取一次。Iterator it=set.iterator();while(it.hashnext()){

      E e=it.next();} 3)map表

      Map存儲(chǔ)數(shù)據(jù)使用key-value(鍵-值)對(duì)的形式存儲(chǔ)數(shù)據(jù)的。

      對(duì)于Map而言,要求key值是唯一的。value值可以重復(fù)

      獲取數(shù)據(jù)時(shí),使用key可以獲取其對(duì)應(yīng)的value 遍歷map有3種方法 1)遍歷key

      Set keySet = map.keySet();

      for(String key:keySet){

      System.out.println(”key:“ + key);

      //可以根據(jù)每一個(gè)key獲取其對(duì)應(yīng)的value值

      int value = map.get(key);2)遍歷value Collection values = map.values();

      Iterator it = values.iterator();

      while(it.hasNext()){

      int value = it.next();//不能采用 map.next()

      System.out.println(”value:“ + value);注意:通過迭代器在遍歷集合的過程中,不能通過集合(即不能采用 map.next())去改變集合元素?cái)?shù)量

      3)遍歷鍵值對(duì)

      Set> entries= map.entrySet();

      for(Entry entry : entries){

      //獲取一組鍵值對(duì)的鍵和值

      String key = entry.getKey();

      int value = entry.getValue();

      System.out.println(key + ”=" + value);

      Collection接口方法的定義

      這里我主要列舉 Iterator iterator()方法的使用

      Collection提供的方法 Iterator iterator()方法來獲取迭代器 Iterator是一個(gè)接口,定義了遍歷集合應(yīng)有的方法。

      使用迭代器遍歷集合遵循的操作原則:先問后取。問一次取一次。

      問:boolean hashNext()

      ?。篛bject next()

      迭代器可以將取出的數(shù)據(jù)刪除掉

      刪:remove()將當(dāng)前獲取的元素刪除掉。

      注意:1)刪除的是next()取出的元素。且只能刪除一次!

      2)調(diào)用1次next()后只能調(diào)用一次remove()!

      下載達(dá)內(nèi)學(xué)習(xí)心得:JDBC總結(jié):系列筆記之四word格式文檔
      下載達(dá)內(nèi)學(xué)習(xí)心得:JDBC總結(jié):系列筆記之四.doc
      將本文檔下載到自己電腦,方便修改和收藏,請(qǐng)勿使用迅雷等下載。
      點(diǎn)此處下載文檔

      文檔為doc格式


      聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),未作人工編輯處理,也不承擔(dān)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)有涉嫌版權(quán)的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進(jìn)行舉報(bào),并提供相關(guān)證據(jù),工作人員會(huì)在5個(gè)工作日內(nèi)聯(lián)系你,一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

      相關(guān)范文推薦

        達(dá)內(nèi)IT培訓(xùn)學(xué)習(xí)心得(共5篇)

        在達(dá)內(nèi)為期兩周的實(shí)習(xí)時(shí)間已悄然離去,剛來時(shí)的那種新鮮好奇早飛到了九霄云外,更多的是離開時(shí)的那種不舍和對(duì)自己及所學(xué)的反思。當(dāng)我第一天來這里時(shí),和其他同學(xué)一樣懷著興奮得......

        達(dá)內(nèi)Java學(xué)習(xí)心得-第一個(gè)月[合集]

        學(xué)習(xí)心得 七月之始,我們的達(dá)內(nèi)java班又開始正式上課了,從上課第一天到現(xiàn)在,已經(jīng)有一個(gè)月了,在這短暫的一個(gè)月里,我學(xué)到是java的基礎(chǔ)知識(shí),重點(diǎn)是JavaSE。感覺時(shí)間過的是非??斓模?.....

        達(dá)內(nèi)生產(chǎn)實(shí)習(xí)總結(jié)

        達(dá)內(nèi)生產(chǎn)實(shí)習(xí)總結(jié) 一直以來我們專業(yè)的生產(chǎn)實(shí)習(xí)就是在校內(nèi),而今年我們終于有機(jī)會(huì)在校外實(shí)習(xí)了。去IT培訓(xùn)學(xué)校實(shí)習(xí)兩周,對(duì)于我這種酷愛計(jì)算機(jī)的人是多么好的體驗(yàn)機(jī)會(huì)。作為數(shù)學(xué)......

        Java JDBC編程總結(jié)

        Java JDBC編程總結(jié) Hibernate、TopLink等OR Mapping操作數(shù)據(jù)庫的技術(shù)都是建立JDBC技術(shù)之上的,實(shí)際來說,他們的性能和JDBC是有很大差距的,但反過來說,如果JDBC用不好,還不如hibern......

        達(dá)內(nèi)培訓(xùn)總結(jié)[精選多篇]

        我2010年畢業(yè),第一年做的是銷售的工作,做了一年,沒有什么業(yè)績(jī),我逐漸認(rèn)識(shí)到自己的特定不適合做銷售,于是我決定來濟(jì)南達(dá)內(nèi)培訓(xùn)自己比較喜歡的編程,我做這一決定并不是心血來潮,而是......

        達(dá)內(nèi)學(xué)習(xí)心得:學(xué)JAVA必看,不看會(huì)后悔!

        達(dá)內(nèi)學(xué)員:學(xué)JAVA必看,不看會(huì)后悔! 獲獎(jiǎng)學(xué)員:葉琪 所獲獎(jiǎng)項(xiàng):三等獎(jiǎng) 內(nèi)容: 有獎(jiǎng)?wù)魑臎]說一定要發(fā)知識(shí)講解之類的! 那我就將自己的一些小技巧在這里分享給大家!大半夜的給你們碼字......

        達(dá)內(nèi)學(xué)習(xí)心得:Oracle_11g常用SQL語句(高級(jí)工程師必備)[精選五篇]

        達(dá)內(nèi)學(xué)習(xí)心得:Oracle_11g常用SQL語句(高級(jí)工程師必備) 參賽學(xué)員:吳賢志 獲獎(jiǎng)獎(jiǎng)項(xiàng):三等獎(jiǎng) -- 退出 SQLPLUS exit; -- 修改 system(sys) 賬號(hào)密碼 SQLPLUS /NOLOG CONN /AS SYSDBA......

        達(dá)內(nèi)項(xiàng)目經(jīng)理崗位職責(zé)

        達(dá)內(nèi)項(xiàng)目經(jīng)理崗位職責(zé) 1. 保證每天學(xué)員的出勤率,統(tǒng)計(jì)好遲到率 2. 準(zhǔn)備好每天8:45到9:00的串講 3. 確保學(xué)員在課堂上的學(xué)習(xí)氛圍 4. 幫助學(xué)員解決問題 5. 保證學(xué)員更好的好的完......