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

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

  • 構(gòu)造函數(shù)的作用 : 給對(duì)應(yīng)的對(duì)象進(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ù)并不是由我們手動(dòng)調(diào)用的象颖,而是在創(chuàng)建對(duì)應(yīng)的對(duì)象時(shí)姑蓝,jvm就會(huì)主動(dòng)調(diào)用到對(duì)應(yīng)的構(gòu)造函數(shù)
    4. 如果一個(gè)類沒有顯式的寫上一個(gè)構(gòu)造方法時(shí),那么java編譯器會(huì)為該類添加一個(gè)無參的構(gòu)造函數(shù)的
    5. 如果一個(gè)類已經(jīng)顯式的寫上一個(gè)構(gòu)造方法時(shí),那么java編譯器則不會(huì)再為該類添加一個(gè)無參的構(gòu)造方法
    6. 構(gòu)造函數(shù)是 可以在一個(gè)類中以函數(shù)重載的形式存在多個(gè)的

  • 疑問:創(chuàng)建對(duì)象時(shí)闸迷,jvm就會(huì)調(diào)用到對(duì)應(yīng)的構(gòu)造方法教沾,那么我們以前沒有學(xué)構(gòu)造方法沾瓦,那么以前創(chuàng)建對(duì)象時(shí),jvm是否 也會(huì)調(diào)用構(gòu)造方法呢准谚?如果有挫剑?構(gòu)造方法從何而來呢?
    會(huì)調(diào)用柱衔, java編譯器在編譯的 時(shí)候給加上去的樊破。

  • jdk提供了一個(gè)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)識(shí)符的命名規(guī)則即可
    3. 調(diào)用方式的區(qū)別:
      1. 構(gòu)造函數(shù)是在創(chuàng)建對(duì)象的時(shí)候由jvm調(diào)用的
      2. 普通函數(shù)是由我們使用對(duì)象調(diào)用的, 一個(gè)對(duì)象可以對(duì)象多次普通的函數(shù)
    4. 作用上的區(qū)別:
      1. 構(gòu)造函數(shù) 的作用用于初始化一個(gè)對(duì)象
      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)建一個(gè)baby對(duì)象
        Baby b1 =   new Baby(110,"狗娃"); //嬰兒誕生   白戶
        System.out.println("編號(hào):"+ b1.id +" 姓名:"+ b1.name);
        b1.cry();
        b1.cry();

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

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

構(gòu)造代碼塊

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

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

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

  • 代碼塊的類別 :

    1. 構(gòu)造代碼塊
    2. 局部代碼塊 : 大括號(hào)位于方法之內(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("編號(hào):"+ b1.id + " 名字:"+b1.name);
        /*
        System.out.println("編號(hào):"+ b1.id + " 名字:"+b1.name);
    
        new Baby(112,"狗剩");
        new Baby();
        */
    }
}
  • 構(gòu)造代碼塊要注意的事項(xiàng):
    1. java編譯器編譯一個(gè)java源文件的時(shí)候,會(huì)把成員變量的聲明語句提前至一個(gè)類的最前端
    2. 成員變量的初始化工作其實(shí)都在在構(gòu)造函數(shù)中執(zhí)行的
    3. 一旦經(jīng)過java編譯器編譯后澳盐,那么構(gòu)造代碼塊的代碼塊就會(huì)被移動(dòng)構(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
同一個(gè)類        true                 true                  true               true
同一個(gè)包        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包要注意的事項(xiàng):
    1. 一個(gè)程序打完了jar之后 必須要在清單文件上指定入口類: 格式 Main-Class: 包名.類名
    2. jar包雙擊運(yùn)行僅對(duì)于圖形化界面的程序起作用腕窥,對(duì)控制臺(tái)的程序不起作用
  • jar文件的作用:
    1. 方便用戶快速運(yùn)行一個(gè)項(xiàng)目
    2. 提供工具類以jar包的形式給別人使用
      • 如果其他人使用jar包里面的類, 必須要先設(shè)置classpath(出現(xiàn)classpath-設(shè)置class文件的所在路徑)路徑: set classpath ./myUtil.jar;

jre = jvm+ 核心類庫(kù)

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);
    }
}

模板模式

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

  • 模板模式的步驟:

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

finally 塊

  • finally塊的使用前提是必須要存在try塊才能使用
  • finally塊的代碼在任何情況下都會(huì)執(zhí)行的硕勿,除了jvm退出( System.exit(0) )的情況
  • finally非常適合做資源釋放的工作哨毁,這樣子可以保證資源文件在任何情況下都會(huì)被釋放
  • try塊的三種組合方式:
    1. 比較適用于有異常要處理,但是沒有資源要釋放的
         try{
            可能發(fā)生異常的代碼
            }catch(捕獲的異常類型 變量名){
                處理異常的代碼
            }
  1. 比較適用于既有異常要處理又要釋放資源的代碼
        try{
            可能發(fā)生異常的代碼
            }catch(捕獲的異常類型 變量名){
                處理異常的代碼
            }finally{ 
                釋放資源的代碼;
            }
  1. 比較適用于內(nèi)部拋出的是運(yùn)行時(shí)異常源武,并且有資源要被釋放
           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ī)范:包名全部小寫

  • 包語句要注意的事項(xiàng):

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

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

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

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

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

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

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

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

  • 什么時(shí)候使用import語句:

    1. 相互訪問的兩個(gè)類不是在同一個(gè)包下面,這時(shí)候就需要使用到導(dǎo)包語句
    2. java.lang 是默認(rèn)導(dǎo)入的, 不需要我們自己導(dǎo)入
package aa;
public class Demo {
    /*
    static{
        System.out.println("這個(gè)是Dmeo3的靜態(tài)代碼塊...");
    }
    */
    public void print(){
        System.out.println("這個(gè)是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)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末岖瑰,一起剝皮案震驚了整個(gè)濱河市叛买,隨后出現(xiàn)的幾起案子砂代,更是在濱河造成了極大的恐慌蹋订,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刻伊,死亡現(xiàn)場(chǎng)離奇詭異露戒,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)捶箱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門智什,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人丁屎,你說我怎么就攤上這事荠锭。” “怎么了晨川?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵证九,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我共虑,道長(zhǎng)愧怜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任妈拌,我火速辦了婚禮拥坛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘尘分。我一直安慰自己猜惋,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布培愁。 她就那樣靜靜地躺著惨奕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪竭钝。 梳的紋絲不亂的頭發(fā)上梨撞,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音香罐,去河邊找鬼卧波。 笑死,一個(gè)胖子當(dāng)著我的面吹牛庇茫,可吹牛的內(nèi)容都是我干的港粱。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼查坪!你這毒婦竟也來了寸宏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤偿曙,失蹤者是張志新(化名)和其女友劉穎氮凝,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體望忆,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡罩阵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了启摄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稿壁。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖歉备,靈堂內(nèi)的尸體忽然破棺而出傅是,到底是詐尸還是另有隱情,我是刑警寧澤蕾羊,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布喧笔,位于F島的核電站,受9級(jí)特大地震影響肚豺,放射性物質(zhì)發(fā)生泄漏溃斋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一吸申、第九天 我趴在偏房一處隱蔽的房頂上張望梗劫。 院中可真熱鬧,春花似錦截碴、人聲如沸梳侨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽走哺。三九已至,卻和暖如春哲虾,著一層夾襖步出監(jiān)牢的瞬間丙躏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工束凑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留晒旅,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓汪诉,卻偏偏與公主長(zhǎng)得像废恋,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法鱼鼓,類相關(guān)的語法拟烫,內(nèi)部類的語法,繼承相關(guān)的語法迄本,異常的語法硕淑,線程的語...
    子非魚_t_閱讀 31,598評(píng)論 18 399
  • 前言 人生苦多,快來 Kotlin 岸梨,快速學(xué)習(xí)Kotlin喜颁! 什么是Kotlin稠氮? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,163評(píng)論 9 118
  • 10.1 Python中的異常 NameError:嘗試訪問一個(gè)未申明的變量Zer0DivisionError:除...
    AdH閱讀 437評(píng)論 0 1
  • 01生活中我們常常遇到這樣的問題曹阔,在家中墻壁上的五孔插座插電,或者以前買的插座上使用電器時(shí)隔披,無法插入赃份。就像這樣: ...
    vellygao閱讀 697評(píng)論 0 1
  • 邊給女兒縫衣服邊一心兩用的看著微信,一則鏈接吸引了我――把幼兒園辦進(jìn)養(yǎng)老院奢米,意想不到的事情發(fā)生了抓韩。 會(huì)發(fā)生什么呢?...
    卉巖閱讀 614評(píng)論 0 0