隨筆-159  評論-114  文章-7  trackbacks-0
          面向?qū)ο蟾呒?BR>
          static,可以修飾屬性、方法、代碼塊。

          每個對象稱為類的實例,對象之間的存儲區(qū)互不干涉。

          static int data;是類變量(共享),為類開辟一個空間。共享存儲區(qū)域。

          訪問類變量,通過類名訪問。一個對象引用也可以使用靜態(tài)成員,與它的編譯時類型的類訪問,一致。

          MyClass m = new MyClass();
          m.data 《= 》MyClass.data;

          靜態(tài)方法-〉沒有當前對象概念-〉也就不允許訪問的類中的非靜態(tài)成員(實例變量)

          主方法之所以是靜態(tài)的,它是程序入口,JVM最初沒有對象,必須通過使用類名調(diào)用方法,主方法必須為靜態(tài)的。

          靜態(tài)方法不能被覆蓋。

          靜態(tài)代碼塊只執(zhí)行一次。

          static 用于單例模式Singleton模式

          class DBConnection{
             
          private static DBConnection db = null;
             
          private DBConnection{}

             
          public static DBConnection getInstance(){
                   
          if(db == null) db = new DBConnection();
                   
          return db;
             }

          }


          final 修飾  類、屬性、方法

          修飾類,無子類,保證用戶使用的一致性。典型范例String類。

          修飾屬性或者變量一旦賦值,不得更改。

          對于對象變量來說,是不能再指向其他對象,而現(xiàn)有的對象內(nèi)部屬性可以改變。

          會配合static一起使用,只分配一個存儲空間,只需要維護一個空間。

          public static final,是一個常量。大寫。

          class SuperClass{
                final int AGE;

                public SuperClass(){
                   AGE=10;
                }
          }

          初始值0不算,需要顯示賦一次值。

          初始設(shè)定在兩個地方,1定義時直接賦值,2構(gòu)造器

          靜態(tài)常量也在兩個地方設(shè)定,1初始設(shè)定,2靜態(tài)代碼塊




          final方法不能覆蓋,由于多態(tài),一個編譯時類型對應多個運行時類型,final保證某方法的穩(wěn)定性。


          private
                         左邊的修飾符有其中一個,系統(tǒng)都默認添加了final修飾符。
          static


          所以之前的靜態(tài)方法不能覆蓋。

          =====================
          方法繼承是決定于在子類中是否可見。能見到就是繼承。

          final不決定繼承。

          實際上如果實例化一個子類對象,它的父類對象的所有屬性(包括private成員都創(chuàng)建了,就是訪問不了,所以不能成為繼承的一部分,也就是不能繼承咯)



          =====================


          abstract 修飾 類 方法

          修飾類 -> 這個類必須被繼承使用->不能生成對象

          用處,把子類最大的共性提取出來放入其中,面向?qū)ο笠话阍瓌t。

          雖然不能生成對象(不能作為運行時類型),但可以聲明為類型(可作為編譯時類型)。

          抽象方法,沒有實現(xiàn),留給子類覆蓋。

          final永遠不可能和abstract在一起,那么private和static也不能和abstract聯(lián)合修飾。

          final表示必須不能被繼承,不能覆蓋;abstract表示必須繼承,方法沒有實現(xiàn),必須覆蓋使用。所以矛盾。

          abstract class SuperClass{
                abstract void print(); //print(){},這是空實現(xiàn),也是實現(xiàn),所以不能帶大括號。
          }

          如果類中有抽象方法的話,那么類只能是抽象類。(一個半成品)

          如果子類沒有實現(xiàn)父類的抽象方法,就會編譯出錯,因為子類繼承了抽象方法,需要聲明為抽象類。

          SuperClass sc = new SubClass();

          sc.print();動態(tài)類型判定,運行時類型不會改變,肯定是一個實現(xiàn)抽象方法的類對象。




          接口:是同類,同一個層次的數(shù)據(jù)結(jié)構(gòu)。

          interface IA{
             void print();  
             int A = 1;
          }

          修飾符省略
          一個Java文件,只能定義一個公開接口

          一個接口等同于一個抽象類

          一個特殊的抽象類:
             所有方法都是公開抽象的:public abstract
             所有屬性都是公開靜態(tài)常量:public static final

          interface IA{
             void print();  
             int A = 1;
          }

          等價于

          abstract class IA{
             public static final int A=1;
             public abstract void print();
          }

          這時可要注意,類實現(xiàn)接口時,覆蓋方法的訪問控制符一定要寫上public,接口是省略為public,類不寫可是default,根據(jù)Overriding規(guī)則,覆蓋方法的訪問控制等于或者大于父類方法的訪問控制。

          class IAImpl extends java.util.ArrayList implements IA{}

          1一個類除了繼承類,還可以實現(xiàn)接口(多個)。

          2盡管一個類只能繼承一個類,一個類可以實現(xiàn)多個接口

          3接口與接口之間可以繼承并可以多繼承,實現(xiàn)多重繼承,但復雜度不增加。

          interface IC extends IA,IB{}

          IC有著IA,IB所有方法的定義

          IA,IB可以作為編譯時類型。

          ========================

          接口,被用來定義可以***的東西。

                            存儲設(shè)備                              輸入設(shè)備
          ----|----------------|-----                     ----------|-----------
          硬盤                  U盤                                 鼠標
          ----|----
          移動硬盤

          使用接口來剝離出一部分抽象。

          移動硬盤、U盤、鼠標除了間接父類是統(tǒng)一的設(shè)備父類外。

          他們都是USB設(shè)備,這部分抽象就需要用接口定義。

          那么機器上的連接器是一個方法,connect(USB接口),不管你什么具體設(shè)備,你都必須實現(xiàn)USB規(guī)范,才能往上插。

          那么用接口來定義一個規(guī)范。


          例子2,JDBC,使用Java來訪問數(shù)據(jù)庫。

          首先,如果由Sun公司自己提供各種數(shù)據(jù)庫的驅(qū)動,那么各個DB廠商需要把數(shù)據(jù)庫核心代碼提供給Sun,這是不可能的,核心商業(yè)機密。

          而由各個DB廠商自己寫的話,會出現(xiàn)方法名的不同,導致如果數(shù)據(jù)庫遷移,代碼需要改動。(例如Oracle提供的方法為ConnectOracle()而ms提供的方法為ConnectSQL)。那么無法真正實現(xiàn)Write Once,Run Anywhere,Sun不同意。

          怎么辦?使用接口。

          由Sun和DB聯(lián)合制定一些一系列接口。

          interface Driver()
          {
                void connect();
                ...
          }

          OracleDriver implements Driver
          SQLDriver implements Driver

          實現(xiàn)不同的connect()邏輯。

          用戶Driver d = getDriver();
          d.connect();

          接口是實現(xiàn)Java一次編譯,到處運行的重要技術(shù)。

          保證了Sun制定規(guī)范,數(shù)據(jù)庫廠商實現(xiàn),用戶使用。保證架構(gòu)穩(wěn)定性(將三方分開)

          對于用戶來說,接口最大化屏蔽差異。

          1.實現(xiàn)不同層次,不同體系的對象的抽象。
          2.保證架構(gòu)穩(wěn)定性。對用戶透明。


          ==============================

          Object 類,所有類的父類(直接,間接父類)

          finalize(),當一個對象被垃圾回收的時候,會調(diào)用一下。不適合放入釋放資源的方法。

          toString(),對象的字符串表現(xiàn)形式。

          System.out.println(obj);->obj.toString()

          自定義類,覆蓋該方法,返回一些有意義的信息。

          ==  判斷字面值是否相等,

          String a = new String("hello");
          String b = new String("hello");
          b==a false

          String final類,并且它的值也是immutable的。

          String a = "A"
          a = a + "B"
          這兩步操作一共產(chǎn)生了3個對象。

          JVM內(nèi)部有一個字符串池,一個獨立存儲區(qū)域,保存已創(chuàng)建的字符串,如果再有相同的,會將引用指向字符串池中的已有對象,不再創(chuàng)建新的,如果沒有再創(chuàng)建。

          String a = "abc";
          String b = "abc";

          所以上面的例子是采用new String("abc")方式創(chuàng)建String對象,不會再去池中找,直接在堆中創(chuàng)建新對象。

          String a = new String("hello");
          String b = "hello";

          a為堆地址,b為串池地址,a==b,false。

          這種方式,是一種用時間換空間的做法,比如如果程序中有100個"hello",難道程序要去維護100個對象嘛。

          Object.equals   判斷對象值是否相等。

          /*
           * Student.java
           *
           * Created on 2005年12月3日, 上午10:43
           *
           * To change this template, choose Tools | Options and locate the template under
           * the Source Creation and Management node. Right-click the template and choose
           * Open. You can then make changes to the template in the Source Editor.
           
          */


          package javaapplication1;

          /**
           *
           * 
          @author Administrator
           
          */

          public class Student {
              
              String name;
              
          int age;
              
              
          /** Creates a new instance of Student */
              
          public Student() {
              }

              
              
          public Student(String n,int a){
                  
          this.name = n;
                  
          this.age = a;
              }

              
              
          public boolean equals(Object o)
              
          {
                  Student s 
          = (Student)o;
                  
          if(s.name.equals(this.name)&&s.age == this.age)
                      
          return true;
                  
          return false;
              }

              
          }

          自定義類如果要進行對象值的比較,覆蓋Object的equals方法,自行判斷,如果不覆蓋,直接調(diào)用Object.equals是判斷地址。

          equals方法覆蓋標準流程:

              public boolean equals(Object o)
              
          {
                  
          if(this == o)
                      
          return true;
                  
          if(o == null)
                      
          return false;
                  
          if(!(o instanceof Student))
                      
          return false;
                  Student s 
          = (Student)o;
                  
          if(s.name.equals(this.name)&&s.age == this.age)
                      
          return true;
                  
          return false;
              }

          double d = 10000.0d;
          Double D_d 
          = new Double(d);
          String D_S 
          = D_d.toString();//D + ""
          String d_s = String.valueOf(d);//d + ""
          double s_d = Double.parseDouble(d_s);
          Double S_D 
          = Double.valueOf(d_s);
          double d_D = D_d.doubleValue();












           



          posted on 2005-12-02 00:03 北國狼人的BloG 閱讀(396) 評論(0)  編輯  收藏 所屬分類: 達內(nèi)學習總結(jié)
          主站蜘蛛池模板: 竹山县| 获嘉县| 永州市| 长葛市| 海晏县| 大名县| 乐安县| 咸丰县| 商南县| 阳江市| 建水县| 长丰县| 诸暨市| 神木县| 怀集县| 探索| 尼玛县| 九江市| 兴城市| 山丹县| 肥城市| 祁连县| 曲阳县| 江西省| 正定县| 霍林郭勒市| 富川| 丰台区| 鄄城县| 南乐县| 临潭县| 香港| 远安县| 马关县| 酉阳| 时尚| 子长县| 湖北省| 沙坪坝区| 新绛县| 融水|