抽象類:
1.抽象類可以實現接口,且抽象類可以繼承自抽象類;
2.抽象類指abstract修飾的類,可以包含也可不包含抽象方法;
3.抽象類和接口都不能實例化。
接口:
1.接口聲明和外部類是一致的,都只能是public或default,注:default默認為public;
2.接口可以繼承接口;
3.接口不能被實例化;
4.接口必須為public abstract,因為接口是高度抽象的類,它的存在就是被其他類實現,沒有方法體;
5.接口中聲明的變量必須為 public static final;
6.jdk1.8新特性,接口中的方法可以用static,default修飾,且二者修飾的方法要求有方法體。
接口和抽象類的區別:
1.一個子類只能繼承一個抽象類(虛類),但能實現多個接口;
2.一個抽象類可以有構造方法,接口沒有構造方法;
3.一個抽象類中的方法不一定是抽象方法,即其中的方法可以有實現(有方法體),接口中的方法都是抽象方法,不能有方法體,只有聲明;
4.一個抽象類可以是public、private、protected、default, 接口只有public;
5.一個抽象類中的方法可以是public、private、protected、default, 接口中的方法只能是public和default.
類型轉換:
1.類型轉換發生精度丟失發生在大范圍轉換到小范圍;
2.如double 到 int int a = (int) 8846.0;
3.byte 1字節 char 2字節
short 2字節 int 4字節
float 4字節 long 8字節
Collection與Collections:
重寫和重載:
1.重寫是父類與子類之間多態性的一種體現,實現同方法名,同參數,同返回類型,不同的實現,重寫類權限要大與父類;
2.重寫兩同:方法名、形參列表相同,兩小:返回值類型、拋出異常更小,這里的“小”指的是繼承關系的子父類,不是像高贊所謂的float和int的大小之分,一大:訪問修飾符;
3.重載是一個類中多態性的體現,方法名相同,參數個數不同,返回類型也可以不同,與修飾符無關;
4. 如果子類構造器沒有顯示地調用超類的構造器,則將自動地調用超類默認(沒有參數)的構造器。如果超類沒有不帶參數的構造器,並且在子類的構造器中有沒有顯示地調用超類的其他構造器,則Java編譯器將報告錯誤。使用super調用構造器的語句必須是子類構造器的第一條語句。
volatile:
1.保證了不同線程對這個變量進行操作時的可見性,即一個線程修改了某個變量的值,這新值對其他線程來說是立即可見的;
2.由於有些時候對 volatile的操作,不會被保存,所以不會造成阻塞,它不可用於多線程環境下的計數器。
加載jdbc驅動:
1.Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
2.DriverManager.registerDriver(new com.mysql.jdbc.Driver());
3.System.setProperty("jdbc.drivers","com.mysql.jdbc.Driver");
socket編程:
進程區域:
一條進程的棧區、堆區、數據區和代碼區在內存中的映射
1>棧區:主要用來存放局部變量, 傳遞參數, 存放函數的返回地址。.esp 始終指向棧頂, 棧中的數據越多, esp的值越小;
2>堆區:用於存放動態分配的對象, 當你使用 malloc和new 等進行分配時,所得到的空間就在堆中。動態分配得到的內存區域附帶有分配信息, 所以你 能夠 free和delete它們;
3>數據區:全局,靜態和常量是分配在數據區中的,數據區包括bss(未初始化數據區)和初始化數據區。;
注意:
1)堆向高內存地址生長;
2)棧向低內存地址生長;
3)堆和棧相向而生,堆和棧之間有個臨界點,稱為stkbrk。
特殊賦值符號:
1.<<=左移位賦值;
2.>>=帶符號右移位;
3.>>>=無符號右移位。
線程:
1.start()用來啟動線程,使其進入可運行狀態,等待獲取cpu使用權;
2.CyclicBarrier讓一組線程等待其他線程;CountDownLatch讓一組線程等待某個事件發生;
3. Callable能夠拋出checked exception。
Java編譯:
1.javac 將源程序編譯為字節碼;
2.java將字節碼解釋為機器碼.exe。
代碼執行順序:
父類靜態變量->父類靜態塊->子類靜態變量->子類靜態塊->父類非靜態成員變量->父類構造代碼塊->父類構造函數->子類非靜態變量->子類構造代碼塊->子類構造函數。
函數或命名相關:
1.super.getClass().getName(),返回:包名+類名;
2.ArrayList list=new ArrayList(); 這種是默認創建大小為10的數組,每次擴容大小為1.5倍;
ArrayList list=new ArrayList(20); 這種是指定數組大小的創建,沒有擴充;
3.Math.floor()取目標數軸左邊的最近整數。
Session:
1.session用來表示用戶會話,session對象在服務端維護,一般tomcat設定session生命周期為30分鍾,超時將失效,也可以主動設置無效;
2.cookie存放在客戶端,可以分為內存cookie和磁盤cookie。內存cookie在瀏覽器關閉后消失,磁盤cookie超時后消失。當瀏覽器發送請求時,將自動發送對應cookie信息,前提是請求url滿足cookie路徑;
3.可以將sessionId存放在cookie中,也可以通過重寫url將sessionId拼接在url。因此可以查看瀏覽器cookie或地址欄url看到sessionId;
4.請求到服務端時,將根據請求中的sessionId查找session,如果可以獲取到則返回,否則返回null或者返回新構建的session,老的session依舊存在。
引用傳遞和值傳遞:
1.引用數據類型是引用傳遞(call by reference),基本數據類型是值傳遞(call by value);
2.值傳遞不可以改變原變量的內容和地址---》原因是java方法的形參傳遞都是傳遞原變量的副本,在方法中改變的是副本的值,而不適合原變量的;
3.引用傳遞不可以改變原變量的地址,但可以改變原變量的內容---》原因是當副本的引用改變時,原變量 的引用並沒有發生變化,當副本改變內容時,由於副本引用指向的是原變量的地址空間,所以,原變量的內容發生變化。
DBMS四個特性:
1.原子性:實現完整性管理子系統;
2.一致性:實現並發控制子系統;
3.持久性:實現恢復管理子系統;
4.隔離性:實現安全控制管理子系統。
敘述正誤:
1.vector是線程安全的ArrayList,在內存中占用連續的空間。初始時有一個初始大小,當數據條數大於這個初始大小后會重寫分配一個更大的連續空間。如果Vector定義為保存Object則可以存放任意類型;
2..try{}catch{}會增加額外的開銷;
3..接口中聲明的'變量'必須為public final static,所以為常量;
4.子類可以訪問父類受保護的成員,但不能訪問私有成員;
5.static 和 final共同修飾的類為靜態不可重寫類,而abstract 和 final不能共同修飾類,抽象類必須重寫;
6.final修飾的變量為基本數據類型時,賦值后無法改變,當final修飾引用類型變量時,在賦值后其指向地址無法改變,但對象內容還是可以改變;
7.final修飾的成員變量在賦值時有三種方式:聲明時賦值,在構造器中賦值,在初始代碼塊中賦值;
8.靜態變量只能在類主體中定義,不能在方法中定義;
9.Java的靜態方法屬於類的成員,實例方法屬於對象的成員。
牛油總結:
1.抽象方法只能定義在抽象類中,抽象方法和抽象類必須由abstract修飾,abstract關鍵字只能描述類和方法,不能描述變量。抽象方法只定義方法聲明,不定義方法實現。抽象類不可以被實例化(創建對象),只有通過子類繼承抽象類並覆蓋抽象類中的所有抽象方法后,該子類才可以被實例化,否則該子類還是一個抽象類。抽象類中有構造函數用於給子類對象進行初始化,同時抽象類中可以含有非抽象方法。abstract關鍵字不可以與final,private,static關鍵字共存,因為被final修飾的方法不可以被重寫,意味着子類不可以重寫該方法,如果abstract和final共同修飾父類中的方法,子類要實現抽象方法(abstract的作用),而final又不讓該方法重寫,這相互矛盾。如果private和abstract共同修飾父類中的方法,private修飾則該方法不可以被子類訪問,但是abstract修飾需要子類去實現,兩者產生矛盾。如果static和abstract共同修飾父類中的方法,static表示是靜態的方法,隨着類的加載而加載,則該方法不需要在子類中去實現,這與abstract關鍵字矛盾;
2.static用於修飾成員變量和成員函數,想要實現對象中的共性數據的對象共享,可以將這個數據進行靜態修飾,被靜態修飾的成員可以直接被類名調用,靜態隨着類的加載而加載,而且優先於對象存在。靜態方法只能訪問靜態成員(靜態方法和靜態變量),不可以訪問非靜態成員,這是因為靜態方法加載時,優先於對象存在,所以沒有辦法訪問對象中的成員。靜態方法中不能使用this和super關鍵字,因為this代表本類對象,super代表父類對象,而靜態時,有可能沒有對象存在,所以this和super無法使用;
3.final關鍵字可以修飾類,方法,變量(成員變量內,局部變量,靜態變量),被final修飾的類是一個最終類,不可以被繼承,被final修飾的方法是一個最終方法,不可以被覆蓋,但是可以被繼承。被final修飾的變量只能是一個常量,只能賦值一次。內部類被定義在類中的局部位置上時,只能訪問局部被final修飾的局部變量。
異常捕獲和拋出:
1.在異常處理中,若try中的代碼可能產生多種異常則可以對應多個catch語句,若catch中的參數類型有父類子類關系,此時應該將父類放在后面,子類放在前面;
2.throws用於在方法上聲明該方法不需要處理的異常類型,用在方法上后面跟異常類名 可以是多個異常類;
3.throw用於拋出具體異常類的對象,用在方法內 后面跟異常對象只能是一個異常類型實體;
4.拋InterruptedException的代表方法有:
-
java.lang.Object 類的 wait 方法
-
java.lang.Thread 類的 sleep 方法
-
java.lang.Thread 類的 join 方法。
ArrayList和LinkedList:
1.ArrayList基於數組實現的,查找快,增刪慢;
2.LinkedList基於鏈表實現的,查找慢,增刪快。
訪問控制修飾符:
forward和redirect的區別:
1.從地址欄顯示來說:
forward是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然后把這些內容再發給瀏覽器.瀏覽器根本不知道服務器發送的內容從哪里來的,所以它的地址欄還是原來的地址.
redirect是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器重新去請求那個地址.所以地址欄顯示的是新的URL;
2.從數據共享來說:
forward:轉發頁面和轉發到的頁面可以共享request里面的數據.
redirect:不能共享數據;
3.從運用地方來說:
forward:一般用於用戶登陸的時候,根據角色轉發到相應的模塊.
redirect:一般用於用戶注銷登陸時返回主頁面和跳轉到其它的網站等;
4.從效率來說:
forward:高.
redirect:低;
5.Forward和Redirect代表了兩種請求轉發方式:直接轉發和間接轉發。對應到代碼里,分別是RequestDispatcher類的forward()方法和HttpServletRequest類的sendRedirect()方法;
對於間接方式,服務器端在響應第一次請求的時候,讓瀏覽器再向另外一個URL發出請求,從而達到轉發的目的。它本質上是兩次HTTP請求,對應兩個request對象;
對於直接方式,客戶端瀏覽器只發出一次請求,Servlet把請求轉發給Servlet、HTML、JSP或其它信息資源,由第2個信息資源響應該請求,兩個信息資源共享同一個request對象。
類加載:
1. 什么是類加載器?
把類加載的過程放到Java虛擬機外部去實現,讓應用程序決定如何去獲取所需要的類。實現這個動作的代碼模塊稱為“類加載器”。
2. 有哪些類加載器,分別加載哪些類
類加載器按照層次,從頂層到底層,分為以下三種:
(1)啟動類加載器 : 它用來加載 Java 的核心庫,比如String、System這些類
(2)擴展類加載器 : 它用來加載 Java 的擴展庫。
(3) 應用程序類加載器 : 負責加載用戶類路徑上所指定的類庫,一般來說,Java 應用的類都是由它來完成加載的。
3. 雙親委派模型
我們應用程序都是由以上三種類加載器互相配合進行加載的,還可以加入自己定義的類加載器。稱為 類加載器的雙親委派模型 ,這里類加載器之間的父子關系一般不會以繼承的關系來實現,而是都使用 組合關系 來復用父加載器的。
4. 雙親委托模型的工作原理
是當一個類加載器收到了類加載的請求,它首先不會自己去嘗試加載這個類,而是把這個請求委派給父類加載器去完成,每一個層次的類加載都是如此,因此所有的加載請求最終都應該傳送到頂層的啟動類加載器中,只有當父加載器反饋自己無法加載這個加載請求的時候,子加載器才會嘗試自己去加載。
5. 使用雙親委派模型好處?(原因)
第一:可以避免重復加載,當父親已經加載了該類的時候,子類不需要再次加載。
第二:考慮到安全因素,如果不使用這種委托模式,那我們就可以隨時使用自定義的String來動態替代java核心api中定義類型,這樣會存在非常大的安全隱患,而雙親委托的方式,就可以避免這種情況,因為String已經在啟動時被加載,所以用戶自定義類是無法加載一個自定義的類裝載器。
6.JVM在判定兩個class是否相同時,不僅要判斷兩個類名是否相同,而且要判斷是否由同一個類加載器實例加載的。
JVM:
1.Java 運行時數據區可以分成 方法區、 堆、 棧、 程序計數器、 本地方法棧
2.堆:Java 對象, 線程之間共享的
3.棧:方法運行,每一個方法對應一個棧幀,每一個線程對應一個棧,每個棧幀包括 操作數、局部變量表、指向運行時常量池的引用,方法返回地址、附加位區 所以是線程不共享
4.方法區(靜態區):被虛擬機加載的類信息、靜態(static)變量,常量(final),即時編譯器編譯后的代碼等數據。運行常量池是方法區的一部分,class文件除了有類的版本、字段、接口、方法等描述信息之外,還有一項信息常量池保存編譯期生成的字面量和符號引用。 線程之間共享的
5.程序計數器:指出某一個時候執行某一個指令、執行完畢之后要返回的位置,當執行的Java方法的時候,這里保存的當前執行的地址,如果執行的是本地方法的時候,那么程序計數器為空。線程不共享。
request:
1.request.getAttribute()方法返回request范圍內存在的對象,而request.getParameter()方法是獲取http提交過來的數據;
2.getAttribute是返回對象,getParameter返回字符串。
Java並發:
集合:
Servlet周期:
1.init()--> 初始化;
2.service() --> 處理請求;
Java易錯知識點:
1.靜態內部類才可以聲明靜態方法;
2.靜態方法不可以使用非靜態變量;
3.抽象方法不可以有函數體。
int類型轉化問題:
1.intValue()是把Integer對象類型變成int的基礎數據類型;
2.parseInt()是把String 變成int的基礎數據類型;
3.Valueof()是把String 轉化成Integer對象類型;(現在JDK版本支持自動裝箱拆箱了。)
JavaScript中typeof運算符結果可能為:
1.typeof Symbol() //"symbol"
2.typeof Number() //"number"
3.typeof String() //"string"
4.typeof Function() //"function"
5.typeof Object() //"object"
6.typeof Boolean() //"boolean"
7.typeof null //"object"
8.typeof undefined //"undefined"
死鎖原因及產生必要條件:
原因:
(1) 因為系統資源不足;
(2) 進程運行推進的順序不合適;
(3) 資源分配不當等。
必要條件:
(1) 互斥條件:一個資源每次只能被一個進程使用;
(2) 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放;
(3) 不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪;
(4) 循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關系。
Socket編程:
1.客戶端通過new Socket(IP地址,端口號)方法創建通信的Socket對象;
2.服務器端通過new ServerSocket(端口號)創建TCP連接對象 accept接納客戶端請求。
sleep和wait的區別:
1.這兩個方法來自不同的類分別是Thread和Object;
2.最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得敏感詞線程可以使用同步控制塊或者方法;
3.wait,notify和notifyAll只能在同步控制方法或者同步控制塊里面使用;
4.而sleep可以在 任何地方使用 synchronized(x){ x.notify() //或者wait() };
5.sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常。
HttpServlet容器響應Web客戶請求流程:
1)Web客戶向Servlet容器發出Http請求;
2)Servlet容器解析Web客戶的Http請求;
3)Servlet容器創建一個HttpRequest對象,在這個對象中封裝Http請求信息;
4)Servlet容器創建一個HttpResponse對象;
5)Servlet容器調用HttpServlet的service方法,這個方法中會根據request的Method來判斷具體是執行doGet還是doPost,把HttpRequest和HttpResponse對象作為service方法的參數傳給HttpServlet對象;
6)HttpServlet調用HttpRequest的有關方法,獲取HTTP請求信息;
7)HttpServlet調用HttpResponse的有關方法,生成響應數據;
doGet() 或 doPost() 是創建HttpServlet時需要覆蓋的方法。
運算優先級:
口訣:淡雲一筆安洛三福 單目>算數運算符>移位>比較>按位>邏輯>三目>賦值
單目運算符:+,-,++,--,~(注~n=-n-1)
算數運算符:+,-,*,/,%
移位運算符:<<,>>
關系運算符:>,<,>=,<=,==,!=
位運算符:&,|,~,^,
邏輯運算符:&&,||
三目運算符:表達式1?表達式2:表達式3
賦值運算符:=等。
Java與C++的差別:
匿名內部類:
匿名內部類的創建格式為: new 父類構造器(參數列表)|實現接口(){
//匿名內部類的類體實現
}
-
使用匿名內部類時,必須繼承一個類或實現一個接口;
-
匿名內部類由於沒有名字,因此不能定義構造函數;
-
匿名內部類中不能含有靜態成員變量和靜態方法。