構(gòu)造函數(shù) & 構(gòu)造代碼塊 & 權(quán)限修飾符 & jar包 & 模板模式 & finally 塊 & 包

構(gòu)造函數(shù):

  • 構(gòu)造函數(shù)的作用 : 給對應(yīng)的對象進(jìn)行初始化。

  • 構(gòu)造函數(shù)的定義的格式:
    修飾符 函數(shù)名(形式參數(shù)){
    函數(shù)體...
    }

  • 構(gòu)造函數(shù)要注意的細(xì)節(jié):
    1. 構(gòu)造函數(shù) 是沒有返回值類型的
    2. 構(gòu)造函數(shù)的函數(shù)名必須要與類名一致
    3. 構(gòu)造函數(shù)并不是由我們手動調(diào)用的,而是在創(chuàng)建對應(yīng)的對象時,jvm就會主動調(diào)用到對應(yīng)的構(gòu)造函數(shù)
    4. 如果一個類沒有顯式的寫上一個構(gòu)造方法時,那么java編譯器會為該類添加一個無參的構(gòu)造函數(shù)的
    5. 如果一個類已經(jīng)顯式的寫上一個構(gòu)造方法時,那么java編譯器則不會再為該類添加一個無參的構(gòu)造方法
    6. 構(gòu)造函數(shù)是 可以在一個類中以函數(shù)重載的形式存在多個的

  • 疑問:創(chuàng)建對象時,jvm就會調(diào)用到對應(yīng)的構(gòu)造方法,那么我們以前沒有學(xué)構(gòu)造方法,那么以前創(chuàng)建對象時,jvm是否 也會調(diào)用構(gòu)造方法呢?如果有?構(gòu)造方法從何而來呢?
    會調(diào)用, java編譯器在編譯的 時候給加上去的。

  • jdk提供了一個java開發(fā)工具(javap.exe)給我們進(jìn)行反編譯的。

    • javap 反編譯工具的使用格式:
      javap -c -l -private 類名
  • 疑問: java編譯器添加的無參構(gòu)造方法的權(quán)限修飾符是什么?
    與類的權(quán)限修飾是一致的。

  • 構(gòu)造函數(shù)與普通函數(shù)的區(qū)別:

    1. 返回值類型的區(qū)別:
      1. 構(gòu)造函數(shù)是沒有返回值類型的
      2. 普通函數(shù)是有返回值類型的, 即使函數(shù)沒有返回值, 返回值類型也要寫上void
    2. 函數(shù)名的區(qū)別:
      1. 構(gòu)造函數(shù)的函數(shù)名必須要與類名一致
      2. 普通函數(shù)的函數(shù)名只要符合標(biāo)識符的命名規(guī)則即可
    3. 調(diào)用方式的區(qū)別:
      1. 構(gòu)造函數(shù)是在創(chuàng)建對象的時候由jvm調(diào)用的
      2. 普通函數(shù)是由我們使用對象調(diào)用的, 一個對象可以對象多次普通的函數(shù)
    4. 作用上的區(qū)別:
      1. 構(gòu)造函數(shù) 的作用用于初始化一個對象
      2. 普通函數(shù)是用于描述一類事物的公共行為的
//嬰兒類
class Baby{
    
    int id; //身份證
    String  name;  //名字
    //構(gòu)造函數(shù)
    public  Baby(int i , String n){
        id  = i;
        name = n;
        System.out.println("baby的屬性初始化完畢!!");
    }

    //無參 的構(gòu)造函數(shù)
    public Baby(){
        System.out.println("無參的構(gòu)造函數(shù)被調(diào)用了..");
    }
    //哭
    public void cry(){
        System.out.println(name+"哇哇哭...");
    }   
}


class Demo2 
{
    public static void main(String[] args) 
    {   
        //創(chuàng)建一個baby對象
        Baby b1 =   new Baby(110,"狗娃"); //嬰兒誕生   白戶
        System.out.println("編號:"+ b1.id +" 姓名:"+ b1.name);
        b1.cry();
        b1.cry();

        /*
        //黑戶
        Baby b2 = new Baby();
        new Baby();

        b2.id = 112;
        b2.name = "狗剩";
        System.out.println("編號:"+ b2.id +" 姓名:"+ b2.name);
        */
    }
}

構(gòu)造代碼塊

  • 構(gòu)造代碼塊的作用 : 給對象進(jìn)行統(tǒng)一的初始化

  • 構(gòu)造函數(shù)的作用 : 給對應(yīng)的對象進(jìn)行初始化

  • 構(gòu)造代碼塊的格式 :
    {
    構(gòu)造代碼塊
    }
    注意 : 構(gòu)造代碼塊的大括號必須位于成員位置上。

  • 代碼塊的類別 :

    1. 構(gòu)造代碼塊
    2. 局部代碼塊 : 大括號位于方法之內(nèi)
      作用 : 縮短局部變量的生命周期, 節(jié)省一點(diǎn)點(diǎn)內(nèi)存
    3. 靜態(tài)代碼塊 : static
class Baby{
    
    int id; //身份證
    String  name;  //名字
    
    //構(gòu)造代碼塊...
    {
        //System.out.println("構(gòu)造代碼塊的代碼執(zhí)行了......");  
    }

    //帶參構(gòu)造函數(shù)
    public  Baby(int i , String n){
        id  = i;
        name = n;
    }
    
    //無參構(gòu)造方法
    public Baby(){
    }
    public void cry(){
        System.out.println(name+"哇哇哭...");
    }   
}


class Demo4 
{
    public static void main(String[] args) 
    {
        Baby b1 = new Baby(110,"狗娃");  //  狗娃 狗剩 鐵蛋
        System.out.println("編號:"+ b1.id + " 名字:"+b1.name);
        /*
        System.out.println("編號:"+ b1.id + " 名字:"+b1.name);
    
        new Baby(112,"狗剩");
        new Baby();
        */
    }
}
  • 構(gòu)造代碼塊要注意的事項:
    1. java編譯器編譯一個java源文件的時候,會把成員變量的聲明語句提前至一個類的最前端
    2. 成員變量的初始化工作其實(shí)都在在構(gòu)造函數(shù)中執(zhí)行的
    3. 一旦經(jīng)過java編譯器編譯后,那么構(gòu)造代碼塊的代碼塊就會被移動構(gòu)造函數(shù)中執(zhí)行,是在構(gòu)造函數(shù)之前執(zhí)行的,構(gòu)造函數(shù)的中代碼是最后執(zhí)行的
    4. 成員變量的顯示初始化與構(gòu)造代碼塊 的代碼是按照當(dāng)前代碼的順序執(zhí)行的

權(quán)限修飾符

  • 介紹 : 權(quán)限修飾符就是控制被修飾的成員的范圍可見性
  • 關(guān)鍵字:
    1. public(公共)
    2. protected(受保護(hù))
    3. default(缺省)
    4. private (大到小)
                   public            protected          default          private
同一個類        true                 true                  true               true
同一個包        true                 true                  true               false
子父類           true                 true                  false              false
不同包           true                 false                 false              false
  • 注意: 在不同包下面只有public 與 protected 可以訪問,而且protected必須是在繼承關(guān)系下才能夠訪問

打jar包

  • 如何打jar包? 需要使用到j(luò)dk的開發(fā)工具(jdk\bin\jar.exe)
  • jar的用法:
    使用格式 : jar cvf jar文件的名字 class文件或者是文件夾
  • 打jar包要注意的事項:
    1. 一個程序打完了jar之后 必須要在清單文件上指定入口類: 格式 Main-Class: 包名.類名
    2. jar包雙擊運(yùn)行僅對于圖形化界面的程序起作用,對控制臺的程序不起作用
  • jar文件的作用:
    1. 方便用戶快速運(yùn)行一個項目
    2. 提供工具類以jar包的形式給別人使用
      • 如果其他人使用jar包里面的類, 必須要先設(shè)置classpath(出現(xiàn)classpath-設(shè)置class文件的所在路徑)路徑: set classpath ./myUtil.jar;

jre = jvm+ 核心類庫

package qq;
import javax.swing.*;
class Demo
{
    public static void main(String[] args) 
    {
        System.out.println("QQ程序..");
        JFrame frame = new JFrame("QQ程序");
        frame.setSize(400,500);
        frame.setVisible(true); //設(shè)置窗口可見。
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

模板模式

  • 解決某類事情的步驟有些是固定的,有些是會發(fā)生變化的,那么這時候我們可以為這類事情提供一個模板代碼,從而提高效率

  • 模板模式的步驟:

    1. 先寫出解決該類事情其中 的一件的解決方案
    2. 分析代碼,把會發(fā)生變化的代碼抽取出來獨(dú)立成一個方法, 把該方法描述成一個抽象的方法
    3. 使用final修飾模板方法,防止別人 重寫你的模板方法
需求: 編寫一個計算程序運(yùn)行時間的模板
abstract class MyRuntime{
    public final void getTime(){
        long startTime = System.currentTimeMillis();    //記錄開始的時間
        code();
        long endTime = System.currentTimeMillis();  //記錄結(jié)束的時間.
        System.out.println("運(yùn)行時間 :"+ (endTime-startTime));
    }
    public abstract void code();
}

class Demo11 extends MyRuntime
{
    public static void main(String[] args) 
    {
        Demo11 d = new Demo11();
        d.getTime();
    }

    //code方法內(nèi)部就寫要計算運(yùn)行時間的代碼;
    public  void code(){
        int i = 0;
        while(i<100){
            System.out.println("i="+i);
            i++;
        }
    }
}

finally 塊

  • finally塊的使用前提是必須要存在try塊才能使用
  • finally塊的代碼在任何情況下都會執(zhí)行的,除了jvm退出( System.exit(0) )的情況
  • finally非常適合做資源釋放的工作,這樣子可以保證資源文件在任何情況下都會被釋放
  • try塊的三種組合方式:
    1. 比較適用于有異常要處理,但是沒有資源要釋放的
         try{
            可能發(fā)生異常的代碼
            }catch(捕獲的異常類型 變量名){
                處理異常的代碼
            }
  1. 比較適用于既有異常要處理又要釋放資源的代碼
        try{
            可能發(fā)生異常的代碼
            }catch(捕獲的異常類型 變量名){
                處理異常的代碼
            }finally{ 
                釋放資源的代碼;
            }
  1. 比較適用于內(nèi)部拋出的是運(yùn)行時異常,并且有資源要被釋放
           try{
            可能發(fā)生異常的代碼
            }finally{ 
                釋放資源的代碼;
            }
class Demo
{
    public static void main(String[] args) 
    {
        //System.out.println("Hello World!");
        div(4,0);
    }
    public static void div(int a, int b){
        try{
            if(b==0){
                System.exit(0);//退出jvm
            }
            int c = a/b;
            System.out.println("c="+ c);

        }catch(Exception e){
            System.out.println("出了除數(shù)為0的異常...");
            throw e;
        }finally{
            System.out.println("finall塊的代碼執(zhí)行了..");
        }
    }
}
  • fianlly釋放資源的代碼
import java.io.*;
class Demo 
{
    public static void main(String[] args) 
    {
        FileReader fileReader = null;
        try{
            //找到目標(biāo)文件
            File file = new File("f:\\a.txt");
            //建立程序與文件的數(shù)據(jù)通道
            fileReader = new FileReader(file);
            //讀取文件
            char[] buf = new char[1024];
            int length = 0; 
            length = fileReader.read(buf);
            System.out.println("讀取到的內(nèi)容:"+ new String(buf,0,length));
        }catch(IOException e){
            System.out.println("讀取資源文件失敗....");
        }finally{
            try{
                //關(guān)閉資源
                fileReader.close();
                System.out.println("釋放資源文件成功....");
            }catch(IOException e){
                System.out.println("釋放資源文件失敗....");
            }
        }
    }
}

  • java中的包就相當(dāng)于windows文件夾

  • 包的作用:

    1. 解決類名重復(fù)產(chǎn)生沖突的問題
    2. 便于軟件版本的發(fā)布
  • 定義包的格式:package 包名

  • 包名命名規(guī)范:包名全部小寫

  • 包語句要注意的事項:

    1. package語句必須位于java文件中中第一個語句
    2. 如果一個類加上了包語句,那么該類的完整類名就是: 包名.類名
    3. 一個java文件只能有一個包語句
  • 問題 : 每次編譯的時候都需要自己創(chuàng)建一個文件夾,把對應(yīng) 的class文件存儲到文件夾中。煩!!!
    解決方法: javac -d 指定類文件的存放路徑 java源文件
package aa;

class Demo1 
{
    
    public static void main(String[] args) 
    {
        System.out.println("這個是Demo1的main方法...");
    }
}

導(dǎo)入包的一些注意點(diǎn)

  • 問題: 當(dāng)有了包之后類與類之間的訪問每次都必須要寫上包名, 如何避免這種情況 ?
    解決方案 : sun提供導(dǎo)包語句讓我們解決該問題

  • 導(dǎo)包語句作用 : 簡化書寫 ( 誤區(qū): 把一個類導(dǎo)入到內(nèi)存中 )

  • 導(dǎo)包語句的格式 : import 包名.類名; ( 導(dǎo)入xxx包中某個類 )

  • 導(dǎo)包語句要注意的細(xì)節(jié):

    1. 一個java文件中可以出現(xiàn)多句導(dǎo)包語句
    2. "*"是導(dǎo)包語句的通配符。可以匹配任何的類名
    3. import aa.*; 是不會作用于aa包下面的子包的
  • 推薦使用:import 包名.類名; 因?yàn)槭褂?通配符會導(dǎo)致結(jié)構(gòu)不清晰

  • 什么時候使用import語句:

    1. 相互訪問的兩個類不是在同一個包下面,這時候就需要使用到導(dǎo)包語句
    2. java.lang 是默認(rèn)導(dǎo)入的, 不需要我們自己導(dǎo)入
package aa;
public class Demo {
    /*
    static{
        System.out.println("這個是Dmeo3的靜態(tài)代碼塊...");
    }
    */
    public void print(){
        System.out.println("這個是Dmeo3的print方法...");
    }
}
package bb;
import aa.Demo3;
import java.util.Arrays; 
class Demo
{
    public static void main(String[] args) 
    {
        int[] arr = {1,234,2};
        Arrays.sort(arr);
        Object o = new Object();

        Demo3 d = new Demo3();
        d.print();
        
        /*
        Demo5 d2 = new Demo5();
        d2.test();
        */
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,327評論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,996評論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,316評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,406評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,128評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,524評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,576評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,759評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,310評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,065評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,249評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,821評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,479評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,909評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,140評論 1 290
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,984評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,228評論 2 375

推薦閱讀更多精彩內(nèi)容