標籤:概念 UI 大小寫 public sys cto 多重迴圈 聲明 trim
1.物件導向的特徵:抽象、繼承、封裝、多態(形象記憶:抽積分多--想想10086)
1.1抽象
忽略一個主題中與當前目標無關的東西,專註的注意與當前目標有關的方面.(就是把現實世界中的某一類東西,提取出來,用程式碼表示,抽象出來的一般叫做類或者介面)。抽象包括兩個方面:資料抽象、過程抽象。
-
- 資料抽象 -->表示世界中一類事物的特徵,就是對象的屬性.比如鳥有翅膀,羽毛等(類的屬性)
- 過程抽象 -->表示世界中一類事物的行為,就是對象的行為.比如鳥會飛,會叫(類的方法)
1.2繼承
一個類可以從現有的類中派生,這個過程稱為類繼承;新類繼承了原始類的特性,新類稱為原始類的衍生類別(子類),原始類稱為新類的基類(父類)。子類可以從父類中繼承方法和變數,這裡注意,不會繼承父類的構造器!子類可以新增自己的方法與變數,同時擁有父類的方法與屬性;而且子類可以重寫父類的方法;
1.3封裝
就是把類中具體的方法和屬性封裝起來,用private私人化,通過類似於get/set的方法存取方法或者變數,最常見的就是javabean;
1.4多態
多態是指允許不同類的對象對同一訊息做出響應.多態性包括參數化多態性(重載)和包含多態性(重寫,繼承,介面實現);方法的重寫,重載與動態連結構成多態性。java引入多態的概念原因之一就是彌補類的單繼承帶來的功能不足;
-
- 動態連結 -->對於父類中定義的方法,如果子類中重寫了該方法,那麼父類類型的引用將調用子類中的這個方法,這就是動態連結
- 重載與重寫 --->比較直白的理解方式就是:重載是發生在同一個類中,同一個類的,同名的不同參數和傳回值類型的構造器/方法;重寫是發生在不同類中,有同一個方法,同一類傳回值,不同的方法實現;
2.範圍public,private,protected,以及不寫時的區別
3.String 是最基本的資料類型嗎?String中常用的方法有什嗎?String是否可以被繼承?Stirng與Stringbuilder,StringBuffer的區別?
- 不是,基礎資料類型只包含:整型(byte,short,int,long);浮點型(float,double);char型(char);boolean型(char);諧音:征服菜逼(成為大神的必然結果)
包含的位元組(一個位元組包含8位,一位就是一個二進位位)分別是:
byte-1;short-2;int-4;long-8;(很好記憶:笨死了,分別是1*2*2*2)
float-4;double-8;
char-2~4(這根編碼方式有關,因為語言太多的緣故);
boolean-一般理論上佔1位元組,但是在java虛擬機器中由雩都用int類型代替,所以實際上是佔了4位元組;
- String常用方法:String比較常用的包括兩方面:構造方法,方法;
- 構造方法:
- String(String value)
- String(char chars[], int startIndex, int numChars)
- String(StringBuilder builder)
- String(StringBuffer buffer)
- 常用方法
- length()//返回該字串的長度
- equalsIgnoreCase(String anotherString)//與equals方法相似,但忽略大小寫
- charAt(int index)//返回字串中指定位置的字元;注意字串中第一個字元索引是0,最後一個是length()-1
- substring(int beginIndex, int endIndex)//該方法從beginIndex位置起,從當前字串中取出到endIndex-1位置的字元作為一個新的字串返回
- concat(String str)//將參數中的字串str串連到當前字串的後面,效果等價於“+”
- indexOf(int ch/String str)//用於尋找當前字串中字元或子串,返回字元或子串在當前字串中從左邊起首次出現的位置,若沒有出現則返回-1
- toLowerCase()//返回將當前字串中所有字元轉換成小寫後的新串,對應的有大寫方法:toUpperCase()
- replace(char oldChar, char newChar)//用字元newChar替換當前字串中所有的oldChar字元,並返回一個新的字串
- trim()//截去字串兩端的空格,但對於中間的空格不處理
- contains(String str)//判斷參數s是否被包含在字串中,並返回一個布爾類型的值
- split(String str)//將str作為分隔字元進行字串分解,分解後的字字串在字串數組中返回
- 將string轉化為各種基本類型的方法:各種基本類型封裝類的[parseXXX]方法
- 將各種基本類型轉化為stirng方法:String類中的各種[valueOf]方法
- String是final方法,不能被繼承,但是,不屬於Stirng本身的方法(比如從父類繼承的)是可以被重寫的,比如toString();這個平時比較有用
- 在執行速度方面:StringBuilder>StringBuffer>String
- String為字串常亮,StringBuilder和StringBuffer是字串變數,後兩者是變數支援對同一個對象進行修改,StringBuilder支援單線程(也就是線程不安全),StringBuffer支援多線程(安全執行緒);
4.基本類型與其對應的封裝類有什麼區別和聯絡:(瞭解思路:是什麼,為什麼,有什麼注意點)
- 基本類型,是資料的基本屬性,而對應的封裝類,則是一個類,在使用的時候直接使用其對象;基礎資料型別 (Elementary Data Type)只能按值傳遞,而封裝類按引用傳遞;
- 封裝類的出現,是為了更方便的使用一些基本類型不具備的方法,讓我們能夠用物件導向的方式進行編程
- JDK5.0開始可以自動封包了 ,也就是基本資料可以自動封裝成封裝類,基礎資料型別 (Elementary Data Type)的好處就是速度快(不涉及到對象的構造和回收),封裝類的目的主要是更好的處理資料之間的轉換,方法很多,用起來也方便;
5.&和&&的區別?
&是位元運算符,表示按位與運算,&&是邏輯運算子,表示邏輯與,&&具有短路特性
6.heap 和stack 有什麼區別?[屬於JVM內容]
java中的堆(heap)和棧(stack),是一種記憶體的儲存機制,分別是堆記憶體和棧記憶體,在程式中定義的基本類型變數和對象的引用變數,都是儲存在stack記憶體中的,當執行超過變數的範圍之後,會自動釋放這個變數對應的記憶體空間,另做他用;heap記憶體主要儲存new出來的對象和數組,它們佔用的記憶體不會被自動釋放,只有沒有引用變數指向它的時候,才變為垃圾,在隨後的一定時間短被gc(記憶體回收行程)回收;
通俗點說:就是steap中存放的是java中的指標,可以指向heap中的實際儲存的資料;
7.Math.round(11.5) 等於多少? Math.round(-11.5)等於多少?
該方法返回與參數最接近的整數,Math.round(11.5)==12 Math.round(-11.5)==-11
8.數組有沒有length()這個方法? String 有沒有length()這個方法?
這是個陷阱,數組是一種資料結構,而不是一個類,而String是一個類,所以有方法length(),數組這種資料結構有的只是length屬性;
9.在JAVA 中,如何跳出當前的多重嵌套迴圈?
可以使用break;這裡注意普通的break只能跳出一層迴圈,而使用標號就可以跳出多重迴圈;使用return直接連下面所有的程式都不執行了,這點要注意!
10.構造器是否能被override,能夠被overload,能夠被繼承?override與overload的區別?
- 構造器Constructor 不能被繼承,因此不能重寫Overrid,但可以被重載Overload
- 前面“多態”裡講了的;同一個類與不同的類的區別;
11.兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對?[hashcode的儲存機制]
不對,有相同的hash code
結論(沒太明白,先記著):
- 如果x.equals(y)返回“true”,那麼x和y的hashCode()必須相等
- 如果x.equals(y)返回“false”,那麼x和y的hashCode()有可能相等,也有可能不等
12.以下二條語句傳回值為true 的有:
A:“beijing”==“beijing”;
B:“beijing”.equalsIgnoreCase(new String(“beijing”));
結論:A和B,A中兩個Beijing是沒有new出來的,所以指向的堆地址相同,但是後面B的new的指向不同的堆地址;==對比的是物理地址;equals對比的是值得大小;
13.我們在web 應用開發過程中經常遇到輸出某種編碼的字元,如iso8859-1等,如何輸出一個某種編碼的字串?
1 public String translate(String str){ 2 String tempStr = ""; 3 try{ 4 tempStr = new String(str.getBytes("ISO-8859-1"), "GBK"); 5 tempStr = tempStr.trim(); 6 }catch (Exception e){ 7 System.err.println(e.getMessage()); 8 } 9 return tempStr;10 }
14.abstract class 和interface 有什麼區別?介面中是否可以定義靜態方法?
先瞭解抽象方法:它只有聲明,而沒有具體的實現,也就是方法體。例如:public void fun();
抽象類別(abstract class):
包含抽象方法的類稱為抽象類別,但並不意味著抽象類別中只能有抽象方法,它和普通類一樣,同樣可以擁有成員變數和普通的成員方法。注意,抽象類別和普通類的主要有三點區別:
- 抽象方法必須為public或者protected(因為如果為private,則不能被子類繼承,子類便無法實現該方法),預設情況下預設為public;
- 抽象類別不能用來建立對象;
- 如果一個類繼承於一個抽象類別,則子類必須實現父類的抽象方法。如果子類沒有實現父類的抽象方法,則必須將子類也定義為為abstract類;
抽象類別和普通的類並沒有區別;
介面(interface):
介面中可以有變數和方法,其中的變數會被隱式地指定為public static final變數,方法會被隱式地指定為public abstract方法且只能是public abstract方法;且所有的方法不能有具體的實現;如果一個非抽象類別遵循了某個介面,就必須實現該介面中的所有方法。但是對於遵循某個介面的抽象類別,可以不實現該介面中的抽象方法();
兩者區別:
- 抽象類別可以有自己的實現方法,但是介面只能有public abstract方法;
- 介面中不能含有靜態代碼塊以及靜態方法,而抽象類別可以有靜態代碼塊和靜態方法;
- 一個類只能繼承一個抽象類別,而一個類卻可以實現多個介面;
- 設計層次上:
- 抽象類別是對一種事物的抽象,即對類抽象,而介面是對行為的抽象。抽象類別是對整個類整體進行抽象,包括屬性、行為,但是介面卻是對類局部(行為)進行抽象;
- 對於抽象類別,如果需要添加新的方法,可以直接在抽象類別中添加具體的實現,子類可以不進行變更;而對於介面則不行,如果介面進行了變更,則所有實現這個介面的類都必須進行相應的改動;
介面中不能定義靜態方法:一個類要實現介面中的方法,其實就是對介面方法的重寫。而要實現靜態方法,就必須重寫介面中的靜態方法;如果可以定義抽象靜態方法static,設 static abstract method(); 是抽象類別A的方法,那麼因為是靜態方法那可以用A.method(); 而這個方法又是抽象的沒有方法體,掉用了怎麼執行呢?
15.java問什麼不允許在靜態方法中訪問非靜態方法或變數?
靜態方法是屬於類的,而普通方法是屬於對象的。屬於類的靜態方法可以在對象不存在的時候就能訪問到,而普通方法必須先new一個對象才能用這個對象訪問。當我們訪問調用靜態方法的時候(使用類名.靜態方法名)這個時候就沒有對象建立,所以普通方法是訪問不到的。為了避免這種錯誤,所以java就不允許在靜態方法中訪問非靜態方法。
16.Static inner class(靜態嵌套類)與Inner Class(內部類)有什麼區別?
使用方式:
1 static class Outer {2 class Inner {}3 static class StaticInner {}4 }5 6 Outer outer = new Outer();7 Outer.Inner inner = outer.new Inner();8 Outer.StaticInner inner0 = new Outer.StaticInner();
靜態內部類的作用:只是為了降低包的深度,方便類的使用,靜態內部類適用於包含類當中,但又不依賴與外在的類,不用使用外在類的非靜態屬性和方法,只是為了方便管理類結構而定義。在建立靜態內部類的時候,不需要外部類對象的引用;
非靜態內部類的不同之處:可以自由使用外部類的所有變數和方法;
17.靜態變數和執行個體變數的區別?
靜態變數也稱為類變數,歸全類共有,它不依賴於某個對象,可通過類名直接存取;而執行個體變數必須依存於某一執行個體,只能通過對象才能訪問到它
18.寫clone()方法時,通常都有一行代碼,是什嗎?
clone的用途與含義:52345113
clone的實際使用:http://www.cnblogs.com/o-andy-o/archive/2012/04/06/2434904.html
19.GC 是什麼? 為什麼要有GC?GC會有記憶體流失嗎?
GC:記憶體回收行程,用於記憶體的管理,準確的說是用來管理heap記憶體的,Java 中的對象不再有“範圍”的概念,只有對象的引用才有“範圍”,如果沒有索引指向相應對象的記憶體地區,GC會在固定時間進行記憶體回收,但是stack記憶體的卻是根據代碼中變數是否超過了變數的範圍而被java回收。擴充:前面的stack記憶體和heap記憶體的區別;在擴充:研究JVM機制;
GC會發生記憶體流失,當存在沒有用卻又有索引指向他的時候就無法回收相應記憶體;
20.String s=new String(“xyz”);建立了幾個String Object?
兩個對象,一個是"xyx",一個是指向"xyx"的引用對象s;
20.介面是否可繼承介面? 抽象類別是否可實現(implements)介面? 抽象類別是否可繼承實體類(concrete class)?
介面可以繼承介面。抽象類別可以實現(implements)介面,抽象類別可繼承實體類,但前提是實體類必須有明確的建構函式
21.說出一些常用的類,包,介面,請各舉5 個;
22.Anonymous Inner Class (匿名內部類) 是否可以extends(繼承)其它類?是否可以implements(實現)interface(介面)?
可以繼承其他類或實現其他介面
23.在java 中一個類被聲明為final 類型,表示了什麼意思?
表示該類不能被繼承,是頂級類
java基礎知識整理