再快不能快基礎,再爛不能爛語言! java
現實世界存在的任務事物均可以稱之爲對象,面向對象是對現實世界建模的一種方式,將一種抽象的思想給具體實例化,對象中包含的內容特徵是它的屬性,對象的一些操做行爲是它的方法。例如簡歷就是一個對象,裏面的內容是它的屬性,看、拿、放均可以稱爲這個對象的方法。mysql
封裝:把描述一個對象的屬性和行爲封裝成一個類,把具體的業務邏輯功能實現封裝成一個方法,其次封裝的意義還有效的保護屬性經過訪問修飾符私有化屬性(成員變量),公有化方法。面試
繼承:實現代碼的複用,全部的子類所共有的行爲和屬性抽取爲一個父類,全部的子類繼承該類可具有父類的屬性和行爲,繼承具備單一性和傳遞性。sql
多態:程序中定義的引用類型變量所指向的具體類型和調用的具體方法在程序編譯階段沒法肯定,而是在運行期才能肯定該引用類型變量指向具體哪一個對象而調用在哪一個類中聲明的方法。數據庫
多態的表現形式有強制類型轉換,向上造型等,多態可分爲行爲多態和對象多態。編程
行爲多態:同一個run( ){ }方法,不一樣的對象調用時會有不一樣的實現,貓調用時是跑,魚調用時是遊,鳥調用時是飛。數組
對象多態:同一個對象,能夠被造型爲不一樣的類型,好比同一我的對象,能夠被造型爲兒子,父親,員工等。瀏覽器
1. 開閉原則(Open-Closed Principle, OCP):安全
軟件實體應對擴展開放,對修改關閉。在不修改現有代碼的基礎上去擴展新功能。bash
2. 單一職責原則(Single Responsibility Principle):
定義一個類,應該只有一個職責。若是一個類有一個以上的職責,多個職責耦合在一塊兒,會致使設計的侷限性以及代碼的複用性。
3. 里氏替換原則(Liskov Substitution Principle):
子類型必須可以替換掉它們的父類型。子類能夠擴展父類的功能,但不能改變父類原有的功能。當子類的方法重載父類的方法時,方法的前置條件(即方法的形參)要比父類方法的輸入參數更寬鬆。當子類的方法實現父類的抽象方法時,方法的後置條件(即方法的返回值)要比父類更嚴格。
4. 迪米特法則(Law Of Demeter):
迪米特法則又稱爲最少知道原則,即一個對象應該對其餘對象保持最少的瞭解,只與直接的朋友通訊。若是兩個類沒必要彼此直接通訊,那麼這兩個類就不該當發生直接的相互做用。儘可能減小類與類之間的耦合。軟件編程的總原則:低耦合高內聚。迪米特法則的初衷就是下降類之間的耦合,因爲每一個類都減小了沒必要要的依賴,所以的確能夠下降耦合關係。
5. 依賴倒置原則(Dependence Inversion Principle)
高層模塊不該該依賴低層模塊,兩者都應該依賴其抽象;抽象不該該依賴細節;細節應該依賴抽象。依賴倒置原則就是要咱們面向接口編程,理解了面向接口編程,也就理解了依賴倒置。
6. 接口隔離原則(Interface Segregation Principle)
客戶端不該該依賴它不須要的接口;一個類對一個類的依賴應該創建在最小的接口上。
7. 合成/聚合原則(Composite/Aggregate Reuse Principle,CARP)
儘可能使用合成/聚合,儘可能不要使用繼承。原則:一個類中有另外一個的對象。
內聚:每一個模塊儘量獨立完成本身功能,不依賴與模塊外部的代碼。
耦合:模塊與模塊之間接口的複雜程度,模塊之間聯繫越複雜耦合度越高,牽一髮而動全身。
低耦合是指減小對其餘類的依賴,高內聚是指調用的方法儘可能寫在本類中,對一個項目來講,就是減小第三方依賴。
複製代碼
final:能夠用來修飾類、方法和變量(成員變量或局部變量)
finally:finally做爲異常處理的一部分,它只能用在try/catch語句中,而且附帶一個語句塊,表示這段語句最終必定會被執行。
如下這幾種狀況是不會被執行的:
finalize:finalize()是在java.lang.Object理定義的,也就是每個對象都有這麼一個方法。這個對象在gc啓動時,該對象被回收的時候被調用。其實gc能夠回收大部分對象(凡是new出來的對象,gc都能搞定),因此通常不須要去實現finalize的。
public static void main(String[] args) {
Integer i = 10;
Integer j = 10;
System.out.println(i == j); //true
Integer a = 128;
Integer b = 128;
System.out.println(a == b); //false
int k = 10;
System.out.println(k == i); //true
int kk = 128;
System.out.println(kk == a); //true
Integer m = new Integer(10);
Integer n = new Integer(10);
System.out.println(m == n); //false
}
複製代碼
重載(Overloading):重載發生在本類,方法名相同,參數列表不一樣,與返回值無關,只和方法名、參數列表、參數的類型有關。
重寫(Overriding):重寫發生在父類和子類之間,通常表示父類和子類之間的關係。
抽象類:抽象類用abstract來修飾,抽象類是用來捕捉子類的通用性,它不能被實例化,只能用做子類的超類,抽象類是被用來建立繼承層級裏子類的模版。
接口:接口是抽象方法的集合,若是一個類實現了某個接口,那麼它就繼承了這個接口的抽象方法,就像契約模式,若是實現了這個接口,那麼久必須保證使用這些方法,而且實現這些方法,接口是一種形式,接口自身不能作任何事情,接口裏面的方法默認都是abstract的。
使用場景:
參數 | 抽象類 | 接口 |
---|---|---|
默認的方法實現 | 能夠有默認的方法實現 | 徹底抽象,根本不存在方法實現 |
實現方式 | 子類用extends關鍵字來繼承抽象類,若是子類不是抽象類的話, 它須要實現父類抽象類中全部抽象方法,父類中非抽象方法可重寫也可不重寫 |
子類用implements去實現接口,須要實現接口中全部方法 |
構造器 | 抽象類能夠有構造器(構造器不能用abstract修飾) | 接口不能有構造器 |
與正常Java類區別 | 正常Java類可被實例化,抽象類不能被實例化 | 接口和正常java類是不一樣的類型 |
訪問修飾符 | 抽象方法能夠用public、protected、default修飾 | 接口默認是public、不能用別的修飾符去修飾 |
main方法 | 抽象類能夠有main方法,能夠運行 | 接口中不能有main方法 |
多繼承 | 抽象類可繼承一個類和實現多個接口 | 接口能繼承一個或多個接口 |
反射:反射的核心是JVM在運行時才動態加載或調用方法/訪問屬性,它不須要事先(寫代碼或者編譯期)知道運行對象是誰。注意:因爲反射會額外消耗必定的系統資源,所以若是不須要動態地建立一個對象,那麼久不須要反射。
反射框架提供的功能:
反射的用途:反射最重要的用途就是開發各類通用框架。
反射的基本實現:得到Class對象、判斷是否爲某個類的實例、建立實例、獲取方法、獲取構造器信息、獲取類的成員變量、調用方法、利用反射建立數組。
java中有四種元註解:
@Retention:定義該註解的生命週期(何時使用該註解)
RetentionPolicy.RUNTIME:始終不會丟棄,運行期也保留註解,所以可使用反射機制讀取該註解的信息。自定義註解時一般使用這種方式。
@Inherited:定義該註釋和子類的關係(是否容許子類繼承該註解),若是一個使用了@Inherited修飾的annotation類型被用於一個class,則這個annotation將被用於該class的子類。
@Documented:一個簡單的Annotations標記註解,表示是否將註解信息添加在java文檔中(註解是否將包含在JavaDoc中)
@Target:表示該註解用在什麼地方(註解用於什麼地方)
ElementType.TYPE用於描述類、接口(包括註解類型)或enum聲明。
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Target({ElementType.FIELD,ElementType.METHOD})
@interface MyAnno{
public String name() default "zhangsan";
public String email() default "hello@example.com";
}
//建立用戶類
class User{
@MyAnno(name = "zhang")
private String name;
@MyAnno(name = "zhang@example.com")
private String email;
@MyAnno(name = "sayHelloWorld")
public String sayHello(){
return "";
}
複製代碼
Get:通常用於獲取、查詢資源信息
POST:通常用於更新資源信息
Get請求 | POST請求 |
---|---|
請求參數會顯示在地址欄中 | 請求參數不會顯示在地址欄中 |
請求體是空 | 請求體是請求參數 |
請求參數顯示在請求首行中(GET/name=aaa) | 請求參數不顯示在請求首行中(POST/ ) |
請求參數顯示地址欄中【不安全】 | 地址欄不顯示請求參數【相對安全】 |
請求參數放首行,http對請求首行顯示1kb | 請求參數放請求體,請求體沒有大小限制 |
請求參數不能經過request.setCharacterEncoding("gbk")來設置編碼 | request.setCharacterEncoding("gbk")只能設置請求體的編碼集 |
public class JDBCTest {
/**
* 使用JDBC鏈接並操做mysql數據庫
*/
public static void main(String[] args) {
// 數據庫驅動類名的字符串
String driver = "com.mysql.jdbc.Driver";
// 數據庫鏈接串
String url = "jdbc:mysql://127.0.0.1:3306/jdbctest";
// 用戶名
String username = "root";
// 密碼
String password = "1234";
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
// 一、加載數據庫驅動( 成功加載後,會將Driver類的實例註冊到DriverManager類中)
Class.forName(driver);
// 二、獲取數據庫鏈接
conn = DriverManager.getConnection(url, username, password);
// 三、獲取數據庫操做對象
stmt = conn.createStatement();
// 四、定義操做的SQL語句
String sql = "select * from user where id = 100";
// 五、執行數據庫操做
rs = stmt.executeQuery(sql);
// 六、獲取並操做結果集
while (rs.next()) {
System.out.println(rs.getInt("id"));
System.out.println(rs.getString("name"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 七、關閉對象,回收數據庫資源
if (rs != null) { //關閉結果集對象
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt != null) { // 關閉數據庫操做對象
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) { // 關閉數據庫鏈接對象
try {
if (!conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
複製代碼
Model(模型),是程序的主體部分,主要包含業務數據和業務邏輯。在模型層,還會涉及到用戶發佈的服務,在服務中會根據不一樣的業務需求,更新業務模型中的數據。
View(視圖),是程序呈現給用戶的部分,是用戶和程序交互的接口,用戶會根據具體的業務需求,在View視圖層輸入本身特定的業務數據,並經過界面的事件交互
將對應的輸入參數提交給後臺控制器進行處理。
Controller(控制器),Controller是用來處理用戶輸入數據,以及更新業務模型的部分。控制器中接收了用戶與界面交互時傳遞過來的數據,並根據數據業務邏輯來
執行服務的調用和更新業務模型的數據和狀態。
MVC架構的控制流程
1.全部的終端用戶請求被髮送到控制器。
2.控制器依賴請求去選擇加載哪一個模塊,並把模型附加到對應的視圖。
3.附加了模型數據的最終視圖作爲相應發送給終端用戶。
複製代碼
比較基本數據類型時,只能採用==,比較的是數值
當比較引用數據類型時,==比較的是引用地址,而equals其實也是,equals是Object定義的方法,而其默認的顯示也是比較地址。咱們經常使用的String類型,由於重寫了equals方法,其內部比較的是內容。
【推薦篇】- 書籍內容整理筆記 | 連接地址 |
---|---|
【推薦】【Java編程思想】【筆記】 | juejin.im/post/5dbb7a… |
【推薦】【Java核心技術 卷Ⅰ】【筆記】 | juejin.im/post/5dbb7b… |
如有錯誤或者理解不當的地方,歡迎留言指正,但願咱們能夠一塊兒進步,一塊兒加油!😜😜