java第十五天-總結1

1.==與equals
當比較包裝類裏面的數值是否相等時,用equals()方法;當測試兩個包裝類的引用是否指向同一個對象時,用==。
2.堆,棧,靜態區域
Java自動管理棧和堆,程序員不能直接地設置棧或堆。
棧:
->1.存在棧中的數據可以共享;
->2.存取速度比堆要快;
->3.存在棧中的數據大小與生存期必須是確定的;
->4.基本類型、對象句柄存在棧中。
堆:
->1.Java的垃圾收集器會自動收走這些不再使用的數據;
->2.可以動態地分配內存大小,存取速度較慢;
->3.生存期也不必事先告訴編譯器;
->4.包裝類數據(引用類)存在堆中。
內存分配策略:
->1.按照編譯原理的觀點,程序運行時的內存分配有三種策略,分別是靜態的,棧式的,和堆式的.
->2.靜態存儲分配是指在編譯時就能確定每個數據目標在運行時刻的存儲空間需求,因而在編譯時就可以給他們分配固定
的內存空間.這種分配策略要求程序代碼中不允許有可變數據結構(比如可變數組)的存在,也不允許有嵌套或者遞歸的結構出現,因爲它們都會導致編譯程序無法計算準確的存儲空間需求.
->3.棧式存儲分配也可稱爲動態存儲分配,是由一個類似於堆棧的運行棧來實現的.和靜態存儲分配相反,在棧式存儲方案
中,程序對數據區的需求在編譯時是完全未知的,只有到運行的時候才能夠知道,但是規定在運行中進入一個程序模塊時,必須知道該程序模塊所需的數據區大小才能夠爲其分配內存.和我們在數據結構所熟知的棧一樣,棧式存儲分配按照先進後出的原則進行分配
->4.靜態存儲分配要求在編譯時能知道所有變量的存儲要求,棧式存儲分配要求在過程的入口處必須知道所有的存儲要求, 而堆式存儲分配則專門負責在編譯時或運行時模塊入口處都無法確定存儲要求的數據結構的內存分配,比如可變長度
串和對象實例.堆由大片的可利用塊或空閒塊組成,堆中的內存可以按照任意順序分配和釋放.
堆和棧的比較:
->1.通俗比較:堆主要用來存放對象的,棧主要是用來執行程序的。
->2.所有的方法調用都是通過棧來進行的,所有的局部變量,形式參數都是從棧中分配內存空間的.-c/c++.
實際上也不是什麼分配,只是從棧頂向上用就行,就好像工廠中的傳送帶(conveyor belt)一樣,Stack Pointer會自動指引你到放東西的位置,你所要做的只是把東西放下來就行.退出函數的時候,修改棧指針就可以把棧中的內容銷燬.這樣的模式速度最快,當然要用來運行程序了.需要注意的是,在分配的時候,比如爲一個即將要調用的程序模塊分配數據區時,應事先知道這個數據區的大小,也就說是雖然分配是在程序運行時進行的,但是分配的大小多少是確定的,不變的,而這個”大小多少”是在編譯時確定的,不是在運行時.
->3.堆是應用程序在運行的時候請求操作系統分配給自己內存,由於從操作系統管理的內存分配,所以在分配和銷燬時都
要佔用時間,因此用堆的效率非常低.但是堆的優點在於,編譯器不必知道要從堆裏分配多少存儲空間,也不必知道存儲的數據要在堆裏停留多長的時間,因此,用堆保存數據時會得到更大的靈活性。事實上,面向對象的多態性,堆內存分配是必不可少的,因爲多態變量所需的存儲空間只有在運行時創建了對象之後才能確定.在C++中,要求創建一個對象時,只需用new命令編制相關的代碼即可。執行這些代碼時,會在堆裏自動進行數據的保存.當然,爲達到這種靈活性,必然會付出一定的代價:在堆裏分配存儲空間時會花掉更長的時間!這也正是導致我們剛纔所說的效率低的原因.
JVM中的堆和棧:
->1.JVM是基於堆棧的虛擬機.JVM爲每個新創建的線程都分配一個堆棧.也就是說,對於一個Java程序來說,它的運行就 是通過對堆棧的操作來完成的。堆棧以幀爲單位保存線程的狀態。JVM對堆棧只進行兩種操作:以幀爲單位的壓棧和出 棧操作。
->2.我們知道,某個線程正在執行的方法稱爲此線程的當前方法.我們可能不知道,當前方法使用的幀稱爲當前幀。當線程
激活一個Java方法,JVM就會在線程的Java堆棧裏新壓入一個幀。這個幀自然成爲了當前幀.在此方法執行期間,這個幀將用來保存參數,局部變量,中間計算過程和其他數據.這個幀在這裏和編譯原理中的活動紀錄的概念是差不多的.
從Java的這種分配機制來看,堆棧又可以這樣理解:堆棧(Stack)是操作系統在建立某個進程時或者線程(
在支持多線程的操作系統中是線程)爲這個線程建立的存儲區域,該區域具有先進後出的特性。
->3.每一個Java應用都唯一對應一個JVM實例,每一個實例唯一對應一個堆。應用程序在運行中所創建的所有類實例或數組都放在這個堆中,並由應用所有的線程共享.跟C,C++不同,Java中分配堆內存是自動初始化的。Java中所有對象的存 儲空間都是在堆中分配的,但是這個對象的引用卻是在堆棧中分配,也就是說在建立一個對象時從兩個地方都分配內存。 在堆中分配的內存實際建立這個對象,而在堆棧中分配的內存只是一個指向這個堆對象的指針(引用)而已。
static、final修飾符、內部類和Java內存分配:
static修飾符:
->1.static修飾符能夠與屬性、方法和內部類一起使用,表示靜態的。類中的靜態變量和靜態方法能夠與類名一起使 用,不需要創建一個類的對象來訪問該類的靜態成員,所以,static修飾的變量又稱作“類變量”
->2.一個類中,一個static變量只會有一個內存空間,雖然有多個類實例,但這些類實例中的這個static變量會共享 同一個內存空間
->3.一個類的靜態方法只能訪問靜態屬性;
一個類的靜態方法不能直接調用非靜態方法;
如訪問控制權限允許,static屬性和方法可以使用類名加“.”的方式調用,也可以使用實例加“.”的方式調用
靜態方法中不存在當前對象,因而不能使用this,也不能使用super
靜態方法不能被非靜態方法覆蓋
構造方法不允許聲明爲static的
注,非靜態變量只限於實例,並只能通過實例引用被訪問。
->4.靜態初始器——靜態塊.
靜態初始器是一個存在與類中方法外面的靜態塊,僅僅在類裝載的時候執行一次,通常用來初始化靜態的類屬性
final修飾符:
->1.在Java聲明類、屬性和方法時,可以使用關鍵字final來修飾,final所標記的成分具有終態的特徵,表示最終 的意思;
->2.final標記的類不能被繼承;
final標記的方法不能被子類重寫;
final標記的變量(成員變量或局部變量)即成爲常量,只能賦值一次;
final標記的成員變量必須在聲明的同時賦值,如果在聲明的時候沒有賦值,那麼只有一次賦值的機會,而且只能在構造方法中顯式賦值,然後才能使用;
final標記的局部變量可以只聲明不賦值,然後再進行一次性的賦值;
final一般用於標記那些通用性的功能、實現方式或取值不能隨意被改變的成分,以避免被誤用;
->3. 如果將引用類型(即,任何類的類型)的變量標記爲final,那麼,該變量不能指向任何其它對象,但可以改變 對象的內容,因爲只有引用本身是final的;
內部類:
->1.在一個類(或方法、語句塊)的內部定義另一個類,後者稱爲內部類,有時也稱爲嵌套類
->2. 內部類的特點
·內部類可以體現邏輯上的從屬關係,同時對於其它類可以控制內部類對外不可見等
·外部類的成員變量作用域是整個外部類,包括內部類,但外部類不能訪問內部類的private成員
·邏輯上相關的類可以在一起,可以有效地實現信息隱藏
·內部類可以直接訪問外部類的成員,可以用此實現多繼承
·編譯後,內部類也被編譯爲單獨的類,名稱爲outclass$inclass的形式
->3.內部類可以分爲四種
·類級:成員式,有static修飾
·對象級:成員式,普通,無static修飾
·本地內部類:局部式
·匿名級:局部式
->4.成員式內部類的基本規則
·可以有各種修飾符,可以用4種權限、static、final、abstract定義
·若有static限定,就爲類級,否則爲對象級。類級可以通過外部類直接訪問,對象級需要先生成外部的對象後才能訪問
·內外部類不能同名
·非靜態內部類中不能聲明任何static成員
·內部類可以互相調用
->5.成員式內部類的訪問
內部類訪問外層類對象的成員時,語法爲:
外層類名.this.屬性
使用內部類時,由外部類對象加“.new”操作符調用內部類的構造方法,創建內部類的對象。
在另一個外部類中使用非靜態內部類中定義的方法時,要先創建外部類的對象,再創建與外部類相關的內部類的對象,再調用內部類的方法。
static內部類相當於其外部類的static成分,它的對象與外部類對象間不存在依賴關係,因此可以直接創建。
由於內部類可以直接訪問其外部類的成分,因此,當內部類與其外部類中存在同名屬性或方法時,也將導致命名衝突。所以,在多層調用時要指明。
->6.本地類是定義在代碼塊中的類,只在定義它們的代碼塊中可見。
本地類有以下幾個重要特性:
·僅在定義了它們的代碼塊中可見
·可以使用定義它們的代碼塊中的任何本地final變量(注:本地類(也可以是局部內部類/匿名內部類等等)使用外部類的變量,原意是希望這個變量在本地類中的對象和在外部類中的這個變量對象是一致的,但如果這個變量不是final定義,它有可能在外部被修改,從而導致內外部類的變量對象狀態不一致,因此,這類變量必須在外部類中加final前綴定義)
·本地類不可以是static的,裏邊也不能定義static成員
·本地類不可以用public、private、protected修飾,只能使用缺省的
·本地類可以是abstract的
->7.匿名內部類是本地內部類的一種特殊形式,即,沒有類名的內部類,而且具體的類實現會寫在這個內部類裏。
匿名類的規則
·匿名類沒有構造方法
·匿名類不能定義靜態的成員
·匿名類不能用4種權限、static、final、abstract修飾
·只可以創建一個匿名類實例
Java的內存分配:
Java程序運行時的內存結構分成:方法區、棧內存、堆內存、本地方法棧幾種.
方法區存放裝載的類數據信息,包括:
·基本信息:每個類的全限定名、每個類的直接超類的全限定名、該類是類還是接口、該類型的訪問修飾符、直接超接口的全限定名 的有序列表。
·每個已裝載類的詳細信息:運行時常量池、字段信息、方法信息、靜態變量、到類classloader的引用、到類class的引用。
棧內存
Java棧內存由局部變量區、操作數棧、幀數據區組成,以幀的形式存放本地方法的調用狀態(包括方法調用的參數、局部變量、中間結果……)。
堆內存
堆內存用來存放由new創建的對象和數組。在堆中分配的內存,由Java虛擬機的自動垃圾回收器來管理。
本地方法棧內存
Java通過Java本地接口JNI(Java Native Interface)來調用其它語言編寫的程序,在Java裏面用native修飾符來描述一個方法是本地方法。
String的內存分配
String是一個特殊的包裝類數據,由於String類的值不可變性,當String變量需要經常變換其值時,應該考慮使用StringBuffer或StringBuilder類,以提高程序效率.
3.String、StringBuffer與StringBuilder之間區別
String:字符串常量
String s = “abcd”;//創建一個對象
s = s+1;//回收儲存”abcd”對象,創建了一個存儲”abcd1”對象-初次指向對象很快
System.out.print(s);// result : abcd1;字符串是來自另外的String對象的話,速度就沒那麼快了,這裏就不快。
每當用String操作字符串時,實際上是在不斷的創建新的對象,而原來的對象就會變爲垃圾被GC回收掉,可想而知這樣執行效率會有多低。
String str = “This is only a” + “ simple” + “test”;
其實就是:
 String str = “This is only a simple test”;
String str2 = “This is only a”;
  String str3 = “ simple”;
  String str4 = “ test”;
  String str1 = str2 +str3 + str4;
 這時候JVM會規規矩矩的按照原來的方式去做。
StringBuilder:字符串變量,線程非安全的。
StringBuffer:字符串變量,線程安全的。
對於三者使用的總結: 1.如果要操作少量的數據用 = String
           2.單線程操作字符串緩衝區 下操作大量數據 = StringBuilder
3.多線程操作字符串緩衝區 下操作大量數據 = StringBuffer
4.JAVA基礎概念
4.1.方法重載:在同一個類中,方法名相同,參數列表不同。與返回值類型無關。
方法重寫: 子父類出現了一模一樣的方法(注意:返回值類型可以是子父類;子類對象調用方法的時候,先找子類,再找父類)
4.2.面向對象特徵: 封裝,繼承,多態
4.3.static關鍵字的特點:
隨着類的加載而加載;
優先於對象存在(實例化之前已經有);
被類的所有對象共享;
可以通過類名或者對象調用;
在靜態方法中是沒有this關鍵字的;
靜態方法只能訪問靜態的成員變量和靜態的成員方法;
4.4.靜態變量和成員變量的區別
靜態變量也叫類變量 成員變量也叫對象變量
A:所屬不同
靜態變量屬於類,所以也稱爲爲類變量
成員變量屬於對象,所以也稱爲實例變量(對象變量)
B:內存中位置不同
靜態變量存儲於方法區的靜態區
成員變量存儲於堆內存
C:內存出現時間不同
靜態變量隨着類的加載而加載,隨着類的消失而消失
成員變量隨着對象的創建而存在,隨着對象的消失而消失
D:調用不同
靜態變量可以通過類名調用,也可以通過對象調用
成員變量只能通過對 象名調用
4.5.main方法的格式詳細解釋
格式解釋:public static void main(String[] args) {}
public 被jvm調用,訪問權限足夠大
static 被jvm調用,不用創建對象,直接類名訪問
void被jvm調用,不需要給jvm返回值
main 一個通用的名稱,雖然不是關鍵字,但是被jvm識別
String[] args 以前用於接收鍵盤錄入的
4.6.代碼塊概述:
在Java中,使用{}括起來的代碼被稱爲代碼塊;
分類:局部代碼塊,構造代碼塊,靜態代碼塊;
class Student {
static {
System.out.println(“Student 靜態代碼塊”);
}

            {
                System.out.println("Student 構造代碼塊");
            }

            public Student() {
                System.out.println("Student 構造方法");
            }
        }
        局部代碼塊:
            在方法中出現;限定變量生命週期,及早釋放,提高內存利用率;
        構造代碼塊 (初始化塊):
            在類中方法外出現;多個構造方法方法中相同的代碼存放到一起,每次調用構造都執行,並且在構造方法前執行
        靜態代碼塊:
            在類中方法外出現,並加上static修飾;用於給類進行初始化,在加載的時候就執行,並且只執行一次。一般用於加載驅動
4.7.繼承的好處和弊端、特點:
    A:繼承的好處 
        a:提高了代碼的複用性
        b:提高了代碼的維護性
        c:讓類與類之間產生了關係,是多態的前提
    B:繼承的弊端
        類的耦合性增強了。
        開發的原則:高內聚,低耦合。
        耦合:類與類的關係
        內聚:就是自己完成某件事情的能力
    C:繼承的特點
        Java只支持單繼承,不支持多繼承。(一個兒子只能有一個爹);
        Java支持多層繼承(繼承體系);
    D:繼承的注意事項
        a:子類只能繼承父類所有非私有的成員(成員方法和成員變量);
        b:子類不能繼承父類的構造方法,但是可以通過super(馬上講)關鍵字去訪問父類構造方法。
        c:不要爲了部分功能而去繼承.如果有兩個類A,B。只有他們符合A是B的一種,或者B是A的一種,就可以考慮使用繼承.
4.8.this和super的區別和應用.
    1.this和super都代表什麼.
        this:代表當前對象的引用,誰來調用我,我就代表誰
        super:代表當前對象父類的引用
    2.this和super的使用區別
        a:調用成員變量 
            this.成員變量 調用本類的成員變量,也可以調用父類的成員變量.
        b:調用構造方法
            this(…) 調用本類的構造方法;
            super(…) 調用父類的構造方法;
        C.調用成員方法
            this.成員方法 調用本類的成員方法,也可以調用父類的方法
            super.成員方法 調用父類的成員方法
4.9.類及其組成所使用的常見修飾符
    A:修飾符: 
        權限修飾符:private,默認的,protected,public
        狀態修飾符:static,final
        抽象修飾符:abstract
    B:類:
        權限修飾符:默認修飾符,public
        狀態修飾符:final
        抽象修飾符:abstract
        用的最多的就是:public
    C:成員變量:
        權限修飾符:private,默認的,protected,public
        狀態修飾符:static,final
        用的最多的就是:private
    D:構造方法:
        權限修飾符:private,默認的,protected,public
        用的最多的就是:public
    E:成員方法:
        權限修飾符:private,默認的,protected,public
        狀態修飾符:static,final
        抽象修飾符:abstract
    用的最多的就是:public
    F:除此以外的組合規則:
        成員變量:public static final
        成員方法: 
            public static
            public abstract
            public final
4.10.接口的特點
        接口是對外暴露的規則。
        接口是程序的功能擴展。
        接口的出現降低耦合性。
        接口可以用來多實現。
    抽象類特點:
        方法和類名前要加abstract
        方法只有聲明沒有實現時,該方法就是抽象方法,需要被abstract修飾,抽象方法必須定義在抽象類中,該類也必須被abstract修飾
        抽象類不可以被實例化,爲什麼?因爲調用抽象方法沒意義。
        抽象類必須有其子類覆蓋了所有的抽象方法後,該子類纔可以實例化。否則,這個子類還是抽象類。
        抽象類中有構造函數嗎?有,用於給子類對象進行初始化。
        抽象類可以不定義抽象方法嗎?可以,但是很少見,目的是不讓該類創建對象。AWT中的適配器兌現就是這種類。
        抽象關鍵字不可以與哪些關鍵字共存?
            Private 不行。抽象方法要被覆蓋,私有了子類沒辦法覆蓋。
            Static 不行。
            Final 不行。Abstract可以被繼承final 不可以被繼承
        抽象類一定是父類嗎?是的。一定要有子類覆蓋其方法後纔可以對子類實例化。
    接口與抽象類的異同點:
        相同點:
            都是不斷向上抽取而來的,描述都不夠具體。(因爲都是抽象類)
        不同點:
            1.抽象類需要被繼承,而且只能單繼承。
             接口需要被實現,而且可以多實現。
            2.抽象類中可以定義抽象方法和非抽象方法,子類繼承後,可以直接使用非抽象方法。
             接口中只能定義抽象方法,必須由子類去實現。
            3.抽象類的繼承,是is a的關係。在定義該體系的基本共性內容。
             接口的實現是like a的關係。在定義體系額外的功能。
4.11.內部類。
        內部類訪問特點:
            內部類可以直接訪問外部類中的成員。
            外部類要訪問內部類,必須建立內部類的對象。
            爲什麼內部類能直接訪問外部類的成員呢?因爲內部類持有了父類的引用  外部類名.this
            class Outer{
                int num=3;
                class Inner{
                    int num=4;
                    void show(){
                        int num=5;
                        System.out.println(this.num);//4
                        System.out.println(num);//5
                        System.out.println(Outer.this.num);//3
                    }
                }
            }   
        靜態內部類:相當於外部類->Outer.Inner.方法();
        局部內部類:內部類可以放在局部位置上。可以放到for循環裏面。例如方法裏的循環成爲一個類。
        匿名內部類:內部類必須繼承或者實現一個外部類或者接口。格式:new 父類or接口(){子類內容}.
4.12.異常體系
        異常:是在運行時期發生的不正常情況---後續
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章