未知數(shù)據(jù)

          從頭看Java

             ::  :: 聯(lián)系 :: 聚合  :: 管理
            28 Posts :: 0 Stories :: 10 Comments :: 0 Trackbacks

          1. 類和對象

            

               類可以認為是自定義的數(shù)據(jù)類型,.類用于描述某一類對象的共同特征,對象是類的具體存在.

           

          java中的對象及其屬性數(shù)據(jù)是存放在堆(heap)內(nèi)存中的,而引用變量則是存放在棧內(nèi)存中的.

              Person p = new Person();

              系統(tǒng)會生成兩個實體,一個是引用變量p,一個是Person對象.棧內(nèi)存中的引用變量p指向堆內(nèi)存中的Person對象,變量p只是存儲了一個地址值,本身不包含任何實際數(shù)據(jù).堆內(nèi)存中的數(shù)據(jù)不允許直接訪問,只能通過該對象的引用去訪問該對象.

              Person p1 = p;

              將p變量賦給p1,也就是將p變量保存的地址值賦給p1.這樣p1也指向了堆內(nèi)存中的同一個對象,這樣不管是通過p還是p1訪問對象的屬性和方法,結(jié)果都是訪問同一個對象的屬性和方法,返回的結(jié)果都是一樣的.也就是說堆內(nèi)存中的對象可以有多個引用.

              p = null;

              當堆內(nèi)存中的某個對象沒有引用執(zhí)行它時,程序?qū)o法再訪問到這個對象,這個對象也就是無用的了,垃圾回收機制將回收這個對象,釋放該對象所占用的內(nèi)存空間.因此,如果需要垃圾回收機制回收某個對象,只要切斷該對象的所有引用即可,也就是將相關(guān)的引用賦為null.

          內(nèi)存示意圖:

          2. 面向?qū)ο蟮奶卣?/font>

              1. 封裝

               對象的狀態(tài)信息隱藏在對象內(nèi)部,不允許外部程序直接訪問對象內(nèi)部信息,而是通過該類所提供的方法來實現(xiàn)對內(nèi)部信息的操作和訪問.類似客觀世界中的屬性都是隱藏在對象內(nèi)部的,外部無法直接操作和修改.良好的封裝是通過對外暴露足夠的方法來操作和訪問類的內(nèi)部信息.

            訪問控制級別從private到public逐次變大

           

              2. 繼承

                 1. java不支持多重繼承,每個子類只有一個直接父類

                 2. Object類是一切類的父類

                 3. 子類繼承不能繼承父類的私有的成員變量和成員方法.

                     在抽象類中定義了私有的成員方法或變量,子類不能訪問到父類的私有成員,所以子類中重寫父類的私有方法,實際上是新建了一個方法;在接口定義中的成員是不能為私有的,否則編譯會報錯,因為接口是用來公開的,私有的變量和方法不能被繼承或?qū)崿F(xiàn).

                 4. 覆蓋和被覆蓋的方法必須同是實例方法或同時類方法

                 5. 子類中的變量可以覆蓋父類中同名的變量,但并不是覆蓋,而只是屏蔽,父類的變量并未改變

                 6. 調(diào)用子類構(gòu)造方法之前,系統(tǒng)會先調(diào)用父類的構(gòu)造方法,如果有多個父類,則從上到下依次調(diào)用

                 7. 內(nèi)存機制中,父類和子類是占用同一塊內(nèi)存空間的,只是子類在父類的基礎(chǔ)上增加自己的屬性和方法.

                 8. 在子類中可通過super訪問父類中的成員.

                 9. 系統(tǒng)創(chuàng)建某個類的對象時,系統(tǒng)總會隱式地創(chuàng)建該類父類的對象.在子類方法中,super指向該方法調(diào)用者的子類對象的父類對象.

          代碼清單: 繼承

          abstract class A {    
                int i=1;    
                public void printI() {    
                  System.out.println("i="+i);    
                }    
          }    
                 
              public class B  extends A{    
                int i=2;    
                public void printI() {
                    super.printI();
                }
                public static void main(String[] args) {    
                  B b=new B();    
                  b.printI();    //i=1;
                }    
              }  

           3. 多態(tài)

               1. 相同類型的變量,執(zhí)行同一個方法時呈現(xiàn)出不同的行為特征,就是多態(tài).多態(tài)發(fā)生在編譯時類型和運行時類型不一致時.

               2. 引用類型在編譯階段只能調(diào)用其編譯時類型所具有的方法,運行時則執(zhí)行它運行時類型所具有的方法

               3. 引用變量只能調(diào)用聲明該變量的所用的類包含的方法,通過引用變量只能訪問到編譯時類所定義的屬性.

               例如 BaseClass bsc = new SubClass()通過變量bsc只能調(diào)用BaseClass所定義的方法,而不能訪問sub(),所以bsc.sub()會編譯不通過.可以通過bsc訪問test(),但運行時調(diào)用的是SubClass類的方法.通過bsc訪問的屬性book是BaseClass的屬性.

           
          class BaseClass {
              
              public int book = 1;
              
              public void base() {
                  System.out.println("父類的普通方法");
              }
              
              public void test() {
                  System.out.println("父類被覆蓋的方法");
              }
              
          }
           
          public class SubClass extends BaseClass{
              
              public String book = "JAVA";
              
              public void test() {
                  System.out.println("子類覆蓋父類的方法");
              }
              
              public void sub() {
                  System.out.println("子類的普通方法");
              }
           
              public static void main(String[] args) {
           
                  System.out.println("=======BaseClass bc = new BaseClass();=======");
                  BaseClass bc = new BaseClass();
                  System.out.println(bc.book);
                  bc.test();
                  bc.base();
                  
                  System.out.println("=======SubClass sc = new SubClass();=======");
                  SubClass sc = new SubClass();
                  System.out.println(sc.book);
                  sc.test();
                  sc.base();
                  
                  System.out.println("=======BaseClass bsc = new SubClass();=======");
                  
                  BaseClass bsc = new SubClass();// 編譯時類型和運行時類型不一致時,發(fā)生多態(tài)
                  System.out.println(bsc.book);//打印:1,對象的屬性不具有多態(tài)性,只能訪問編譯時類型中的屬性
                  bsc.test();//子類覆蓋父類的方法,運行時調(diào)用的是運行時類型所定義的方法.
                  bsc.base();//父類的普通方法
                  //bsc.sub();// 只能訪問編譯時類型中所定義的方法
                  
              }
           
          }
          posted on 2009-01-14 23:01 wangjc 閱讀(220) 評論(0)  編輯  收藏 所屬分類: 從頭看Java
          主站蜘蛛池模板: 静乐县| 永寿县| 丰城市| 徐州市| 凤凰县| 长顺县| 工布江达县| 仙游县| 交城县| 柳林县| 盐亭县| 湖州市| 卢龙县| 大邑县| 厦门市| 思南县| 万载县| 霍城县| 上犹县| 什邡市| 军事| 黑龙江省| 喀喇| 桓仁| 龙泉市| 三门县| 梅州市| 台江县| 南宫市| 西青区| 乐清市| 南城县| 临邑县| 南澳县| 邹城市| 曲阜市| 淮北市| 奎屯市| 忻城县| 响水县| 六盘水市|