1.面向對象四大特徵
繼承:子類可以有父類的方法,屬性(非private)也可以重寫父類的方法。缺點就是提高代碼之間的耦合性。
super關鍵字:通過super實現對父類成員的訪問。用來引用當前對象的父類。通過super顯示的調用父類的有參構造,無參構造可以隱式調用
多態:多態存在的3個條件:1、繼承關係2、重寫父類的方法3、父類引用指向子類對象
父類引用指向子類對象,子類重寫了父類的方法,調用父類的方法,實際是調用子類重寫父類的方法後的方法。Father f = new Children();f.toString()實際是調用子類重寫後的方法。
多態機制:重載(編譯時多態)覆蓋(運行時多態)
多態的分類:方法重載實現的是編譯時的多態性,而方法重寫實現的是運行時的多態性。
抽象包括:數據抽象,行爲抽象。
2.equals和== 區別
equals比較兩個對象的內容是否相同
== 比較兩個對象是否是同一對象。
==比較的是2個對象的地址,而equals比較的是2個對象的內容,顯然,當equals爲true時,==不一定爲true。
3.反射:
1.如果我知道一個類的名稱/或者它的一個實例對象, 我就能把這個類的所有方法和變量的信息找出來(方法名,變量名,方法,修飾符,類型,方法參數等等所有信息)。
2.如果我還明確知道這個類裏某個變量的名稱,我還能得到這個變量當前的值。
3.當然,如果我明確知道這個類裏的某個方法名+參數個數類型,我還能通過傳遞參數來運行那個類裏的那個方法。
第一種:通過Object類的getClass方法
1 |
|
第二種:通過對象實例方法獲取對象
1 |
|
第三種:通過Class.forName方式
1 |
|
4.說說Cookie和Session的區別?
1、Cookie和Session都是會話技術,Cookie是運行在客戶端,Session是運行在服務器端。
2、Cookie有大小限制以及瀏覽器在存cookie的個數也有限制,Session是沒有大小限制和服務器的內存大小有關。
3、Cookie有安全隱患,通過攔截或本地文件找得到你的cookie後可以進行攻擊。
4、Session是保存在服務器端上會存在一段時間纔會消失,如果session過多會增加服務器的壓力。
5.hashCode和equals方法的區別與聯繫
1.equal()相等的兩個對象他們的hashCode()肯定相等,也就是用equal()對比是絕對可靠的。
2.hashCode()相等的兩個對象他們的equal()不一定相等,也就是hashCode()不是絕對可靠的。
所有對於需要大量並且快速的對比的話如果都用equal()去做顯然效率太低,所以解決方式是,每當需要對比的時候,首先用hashCode()去對比,如果hashCode()不一樣,則表示這兩個對象肯定不相等(也就是不必再用equal()去再對比了),如果hashCode()相同,此時再對比他們的equal(),如果equal()也相同,則表示這兩個對象是真的相同了,這樣既能大大提高了效率也保證了對比的絕對正確性!
6.反射++++++++++++++
https://blog.csdn.net/sinat_38259539/article/details/71799078#commentBox
**************************************
1.什麼是構造函數
用來在對象實例化的時候初始化對象的成員變量。
當提供了構造函數時,編譯器便不再創建默認的構造函數了。
Java中構造方法重載和方法重載很相似。可以爲一個類創建多個構造方法。每一個構造方法必須有它自己唯一的參數列表。
2.static關鍵字4種使用場景:成員變量,成員方法,內部類,代碼塊
3.char型變量可以存儲中文,hello長度5,字節數5;你好 長度2,字節數4;
基本數據類型、局部變量都是存放在棧內存中的,用完就消失。
new創建的實例化對象及數組,是存放在堆內存中的,用完之後靠垃圾回收機制不定期自動消除。
5.數組是對象,數組具有屬性和方法,可以用instanceof判斷數據的類型
數組初始化,一維數組:兩種:int arr[]或int[] arr
二維數組:三種int arr[]或int[][] arr或int[] arr[]
數組length,字符串length();
6.java語言把所有異常當做對象來處理並定義一個基類java.lang.throwable作爲所有異常的基類
異常處理是爲了提高程序的 健壯性和安全性
7.JVM中虛擬棧中存的是對象的地址,創建的對象實質在堆中
8.接口和抽象類的異同是什麼?
抽象類和接口的相同點:
1.都不能被實例化
2.接口的實現類或抽象類的子類都只有實現了接口或抽象類中的方法後才能被實例化
Java提供和支持創建抽象類和接口。它們的實現有共同點,不同點在於:
接口中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法。
類可以實現很多個接口,但是隻能繼承一個抽象類
類可以不實現抽象類和接口聲明的所有方法,當然,在這種情況下,類也必須得聲明成是抽象的。
抽象類可以在不提供接口方法實現的情況下實現接口。
Java接口中聲明的變量默認都是final的。抽象類可以包含非final的變量。
Java接口中的成員函數默認是public的。抽象類的成員函數可以是private,protected或者是public。
9.Array可以包含基本類型和對象類型,ArrayList只能包含對象類型
10.有序數組最大的好處在於查找的時間複雜度是O(log n),而無序數組是O(n)。有序數組的缺點是插入操作的時間複雜度是O(n),因爲值大的元素需要往後移動來給新元素騰位置。相反,無序數組的插入時間複雜度是常量O(1)。
11.轉義字符
\n |
換行(LF) ,將當前位置移到下一行開頭 |
010 |
\r |
回車(CR) ,將當前位置移到本行開頭 |
013 |
\t |
水平製表(HT) (跳到下一個TAB位置) |
009 |
\v |
垂直製表(VT) |
011 |
\\ |
代表一個反斜線字符''\' |
092 |
\' |
代表一個單引號(撇號)字符 |
039 |
\" |
代表一個雙引號字符 |
034 |
\0 |
空字符(NULL) |
000 |
12.JSP/SEVERLET工作原理,生命週期
Servlet 沒有 main 方法,不能夠獨立的運行,它的運行需要容器的支持,Tomcat 是最常用的 JSP/Servlet 容器。
servlet在服務器中的運行:1.加載 ->2.初始化 - > 3.調用 - 4.銷燬
生命週期:servlet的生命週期在【2.初始化】後開始其生命週期,在【4.銷燬】後結束其生命週期
(1) 加載和實例化
如果Servlet容器還沒實例化一個Servlet對象,此時容器裝載和實例化一個 Servlet。創建出該 Servlet 類的一個實例。如果已經存在一個Servlet對象,此時不再創建新實例。
(2) 初始化
在產生 Servlet 實例後,容器負責調用該 Servlet 實例的 init() 方法,在處理用戶請求之前,來做一些額外的初始化工作。
(3) 處理請求
當 Servlet 容器接收到一個 Servlet 請求時,便運行與之對應的 Servlet 實例的 service() 方法,service() 方法根據用戶的請求調用相對應的doGet或doPost 方法來處理用戶請求。然後再進入對應的方法中調用邏輯層的方法,實現對客戶的響應。
(4) 銷燬
當 Servlet 容器決定將一個 Servlet 從服務器中移除時 ( 如 Servlet 文件被更新 ),便調用該 Servlet 實例的 destroy() 方法,在銷燬該 Servlet 實例之前,來做一些其他的工作。
其中,(1)(2)(4) 在 Servlet 的整個生命週期中只會被執行一次。
13.轉發重定向區別
重定向response.sendRedirect("success.jsp");
轉發:request.getRequestDispatcher("success.jsp").forward(request,response);
1.轉發在服務器端完成的;重定向是在客戶端完成的
★2.轉發的速度快;重定向速度慢
3.轉發的是同一次請求;重定向是兩次不同請求
★4.轉發不會執行轉發後的代碼;重定向會執行重定向之後的代碼
★5.轉發地址欄沒有變化;重定向地址欄有變化
6.轉發必須是在同一臺服務器下完成;重定向可以在不同的服務器下完成
**************************
1.java語言優點
平臺無關性,一次編譯,到處運;
提供了許多內置類庫,如對多線程的支持,對網絡通信的支持,GC;
程序更加簡潔,去除了C++中難以理解的指針,多重繼承,運算符重載等;
健壯,安全,可以垃圾回收,異常處理;
提供了對WEB應用的開發。
2.反射3中方法獲取類名
Class.forName("類的路徑")
類名.Class
實例.getClass()。
3.創建對象四種方法
new;
反射機制;
clone();
反序列化。
4.克隆
Obj a=new Obj();
Obj b=a;
//a,b指向同一個引用,對b修改,會影響a
Obj a=new Obj();
Obj b=(Obj)a.clone();
//a,b指向不同的引用,對b修改,不會影響a
淺複製:僅複製對象的變量,不復制所引用的對象
深複製:複製對象的變量,並複製所引用的對象
步驟:
繼承Cloneable接口,實質上是個標識接口,無任何接口方法
重寫clone();
在clone方法中調用super.clone();
淺複製/深複製;Obj b=(Obj)a.clone();
Java 反射機制是在運行狀態中,對於任意一個類,都能夠獲得這個類的所有屬性和方法,對於任意一個對象都能夠調用它的任意一個屬性和方法。
5.面向對象相比於面向過程
代碼結構清晰,健壯,代碼複用
通過繼承,組合實現代碼重用;組合:在新類中創建已有類的對象。組合是顯示的,繼承是隱式的。
6.內部類
4種:靜態,匿名,局部,成員內部類。
7.關鍵字
this.name=name
this指向當前實例對象,區分對象的成員變量與方法的形參
static一個很重要的用途是實現單例模式,
static方法中不能使用this,super關鍵字,不能調用非static方法
instanceof判斷左邊的對象是否是右邊的類的實例 if(s instanceof Object)
strictfp作用:精確浮點,當一個類被strictfp修飾,其所有方法都會被strictfp修飾
volatile與synchronized https://blog.csdn.net/seu_calvin/article/details/52370068詳情
(1)從而我們可以看出volatile雖然具有可見性但是並不能保證原子性。
(2)性能方面,synchronized關鍵字是防止多個線程同時執行一段代碼,就會影響程序執行效率,而volatile關鍵字在某些情況下性能要優於synchronized。
但是要注意volatile關鍵字是無法替代synchronized關鍵字的,因爲volatile關鍵字無法保證操作的原子性。
原子性表現在:要麼不執行,要麼執行到底。
8.值傳遞引用傳遞
八中基本數據類型按值傳遞,其他所有類型按引用傳遞
9.short s=1;s=s+1 報錯
short s=1;s+=1 不報錯,編譯器會對+=進行特殊處理
10.String由char組成,英文佔一個字符,中文佔兩個字符
“hello”長度5,字節5;“你好”長度2,字節4
11.finally不會執行的情況
當程序進入try語句之前就出現異常;在try中執行system.exit(0)強制退出方法。
throw與throws的比較
1、throws出現在方法函數頭;而throw出現在函數體。
2、throws表示出現異常的一種可能性,並不一定會發生這些異常;throw則是拋出了異常,執行throw則一定拋出了某種異常對象。
3、兩者都是消極處理異常的方式(這裏的消極並不是說這種方式不好),只是拋出或者可能拋出異常,但是不會由函數去處理異常,真正的處理異常由函數的上層調用處理。
編程習慣:
1.在寫程序時,對可能會出現異常的部分通常要用try{...}catch{...}去捕捉它並對它進行處理;
2.用try{...}catch{...}捕捉了異常之後一定要對在catch{...}中對其進行處理,那怕是最簡單的一句輸出語句,或棧輸入e.printStackTrace();
3.如果是捕捉IO輸入輸出流中的異常,一定要在try{...}catch{...}後加finally{...}把輸入輸出流關閉;
4.如果在函數體內用throw拋出了某種異常,最好要在函數名中加throws拋異常聲明,然後交給調用它的上層函數進行處理。
兩種異常類Error和Exception,父類爲Throwable
----------------------