標(biāo)識(shí)符 & this關(guān)鍵字 & static & super & instanceof & final & abstract & 抽象類 & 配置文件類

標(biāo)識(shí)符

  • 什么是標(biāo)識(shí)符
    就是程序員在定義java程序時(shí),自定義的一些名字,例如helloworld 程序里關(guān)鍵字class 后跟的Demo,就是我們定義的類名。類名就屬于標(biāo)識(shí)符的一種。標(biāo)識(shí)符除了應(yīng)用在類名上,還可以用在變量、函數(shù)名、包名上

  • 標(biāo)識(shí)符必須遵循以下規(guī)則

    1. 標(biāo)識(shí)符由26個(gè)英文字符大小寫(azAZ)、數(shù)字(0~9)、下劃線(_)和美元符號(hào)($)組成。
    2. 不能以數(shù)字開(kāi)頭,不能是關(guān)鍵字
    3. 嚴(yán)格區(qū)分大小寫
    4. 標(biāo)識(shí)符的可以為任意長(zhǎng)度

this關(guān)鍵字

  • this關(guān)鍵字代表了所屬函數(shù)的調(diào)用者對(duì)象
  • this關(guān)鍵字作用
    1. 如果存在同名成員變量與局部變量時(shí), 在方法內(nèi)部默認(rèn)是訪問(wèn)局部變量的數(shù)據(jù), 可以通過(guò)this關(guān)鍵字指定訪問(wèn)成員變量的數(shù)據(jù)
    2. 在一個(gè)構(gòu)造函數(shù)中可以調(diào)用另外一個(gè)構(gòu)造函數(shù)初始化對(duì)象
  • this關(guān)鍵字調(diào)用其他的構(gòu)造函數(shù)要注意的事項(xiàng)
    1. this關(guān)鍵字調(diào)用其他的構(gòu)造函數(shù)時(shí), this關(guān)鍵字必須要位于構(gòu)造函數(shù)中的第一個(gè)語(yǔ)句
    2. this關(guān)鍵字在構(gòu)造函數(shù)中不能出現(xiàn)相互調(diào)用的情況, 因?yàn)槭且粋€(gè)死循環(huán)
  • this關(guān)鍵字要注意事項(xiàng)
    1. 存在同名的成員變量與局部變量時(shí), 在方法的內(nèi)部訪問(wèn)的是局部變量(java 采取的是“就近原則”的機(jī)制訪問(wèn)的)
    2. 如果在一個(gè)方法中訪問(wèn)了一個(gè)變量, 該變量只存在成員變量的情況下, 那么java編譯器會(huì)在該變量的前面添加this關(guān)鍵字
  • this關(guān)鍵字調(diào)用其他的構(gòu)造函數(shù)要注意的事項(xiàng):
    1. this關(guān)鍵字調(diào)用其他的構(gòu)造函數(shù)時(shí), this關(guān)鍵字必須要位于構(gòu)造函數(shù)中的第一個(gè)語(yǔ)句
    2. this關(guān)鍵字在構(gòu)造函數(shù)中不能出現(xiàn)相互調(diào)用 的情況, 因?yàn)槭且粋€(gè)死循環(huán)
class Student{

    int id;  //身份證
    String name;  //名字

    //目前情況:存在同名 的成員 變量與局部變量,在方法內(nèi)部默認(rèn)是使用局部變量的。
    public Student(int id,String name){  //一個(gè)函數(shù)的形式參數(shù)也是屬于局部變量。
        this(name); //調(diào)用了本類的一個(gè)參數(shù)的構(gòu)造方法
        //this(); //調(diào)用了本類無(wú)參的構(gòu)造方法。
        this.id = id; // this.id = id 局部變量的id給成員變量的id賦值
        System.out.println("兩個(gè)參數(shù)的構(gòu)造方法被調(diào)用了...");
    }
    
    public Student(){
        System.out.println("無(wú)參的構(gòu)造方法被調(diào)用了...");
    }

    public Student(String name){
        this.name = name;
        System.out.println("一個(gè)參數(shù)的構(gòu)造方法被調(diào)用了...");
    }
}

class Demo
{
    public static void main(String[] args) 
    {
        Student s = new Student(110, "鐵蛋");
        System.out.println("編號(hào):"+ s.id +" 名字:" + s.name);
/*
        Student s2 = new Student("金胖子");
        System.out.println("名字:" + s2.name);
    */
    }
}

static(靜態(tài))

  • static(靜態(tài)\修飾符) : 靜態(tài)的成員變量只會(huì)在數(shù)據(jù)共享區(qū)中維護(hù)一份,而非靜態(tài)成員變量的數(shù)據(jù)會(huì)在每個(gè)對(duì)象中都維護(hù)一份的

    1. static修飾成員變量 : 如果有數(shù)據(jù)需要被共享給所有對(duì)象使用時(shí), 那么就可以使用static修飾
    • 靜態(tài)成員變量的訪問(wèn)方式:
      - 方式1 : 可以使用對(duì)象進(jìn)行訪問(wèn)
      格式 : 對(duì)象.變量名
      - 方式二 : 可以使用類名進(jìn)行訪問(wèn)
      格式 : 類名.變量名
    • 注意 :
      1. 非靜態(tài)的成員變量只能使用對(duì)象進(jìn)行訪問(wèn),不能使用類名進(jìn)行訪問(wèn)。
      2. 千萬(wàn)不要為了方便訪問(wèn)數(shù)據(jù)而使用static修飾成員變量,只有成員變量的數(shù)據(jù)是真正需要被共享的時(shí)候才使用static修飾。
    • static修飾成員變量的應(yīng)用場(chǎng)景 : 如果一個(gè)數(shù)據(jù)需要被所有對(duì)象共享使用的時(shí)候,這時(shí)候即可好實(shí)用static修飾
    1. static修飾成員函數(shù) : (靜態(tài)函數(shù))
    • 訪問(wèn)方式:
      方式一:可以使用對(duì)象進(jìn)行訪問(wèn)。
      對(duì)象.靜態(tài)的函數(shù)名()
      方式二:可以使用類名進(jìn)行訪問(wèn)。
      類名.靜態(tài)函數(shù)名字。

        推薦使用是類名直接訪問(wèn)靜態(tài)的成員。
      
    • 靜態(tài)的成員變量與非靜態(tài)的成員變量的區(qū)別:

      1. 作用上的區(qū)別:
        1. 靜態(tài)的成員變量的作用共享一個(gè) 數(shù)據(jù)給所有的對(duì)象使用。
        2. 非 靜態(tài)的成員變量的作用是描述一類事物的公共屬性。
      2. 數(shù)量與存儲(chǔ)位置上的區(qū)別:
        1. 靜態(tài)成員變量是存儲(chǔ)方法 區(qū)內(nèi)存中,而且只會(huì)存在一份數(shù)據(jù)。
        2. 非靜態(tài)的成員變量是存儲(chǔ)在堆內(nèi)存中,有n個(gè)對(duì)象就有n份數(shù)據(jù)。
      3. 生命周期的區(qū)別:
        1. 靜態(tài)的成員變量數(shù)據(jù)是隨著類的加載而存在, 隨著類文件的消失而消失
        2.非靜態(tài)的成員數(shù)據(jù)是隨著對(duì)象的創(chuàng)建而存在, 隨著對(duì)象被垃圾回收器回收而消失。
    • 靜態(tài)函數(shù)要注意的事項(xiàng):

      1. 靜態(tài)函數(shù)是可以調(diào)用類名或者對(duì)象進(jìn)行調(diào)用的,而非靜態(tài)函數(shù)只能使用對(duì)象進(jìn)行調(diào)用。
      2. 靜態(tài)的函數(shù)可以直接訪問(wèn)靜態(tài)的成員,但是不能直接訪問(wèn)非靜態(tài)的成員。
        原因 : 靜態(tài)函數(shù)是可以使用類名直接調(diào)用的, 這時(shí)候可能還沒(méi)有存在對(duì)象, 而非靜態(tài)的成員數(shù)據(jù)是隨著對(duì)象的存在而存在的
      3. 非靜態(tài)的函數(shù)是可以直接訪問(wèn)靜態(tài)與非靜態(tài)的成員
        原因 : 非靜態(tài)函數(shù)只能由對(duì)象調(diào)用, 當(dāng)對(duì)象存在的時(shí)候, 靜態(tài)數(shù)據(jù)老早就已經(jīng)存在了, 而非靜態(tài)數(shù)據(jù)也隨著對(duì)象的創(chuàng)建而存在了
      4. 靜態(tài)函數(shù)不能出現(xiàn)this或者super關(guān)鍵字。
        原因 : 因?yàn)殪o態(tài)的函數(shù)是可以使用類名調(diào)用的, 一旦使用類名調(diào)用這時(shí)候不存在對(duì)象, 而this關(guān)鍵字是代表了一個(gè)函數(shù) 的調(diào)用者對(duì)象, 這時(shí)候產(chǎn)生了沖突
    • 靜態(tài)的數(shù)據(jù)的生命周期:靜態(tài)的成員變量數(shù)據(jù)是優(yōu)先于對(duì)象存在的

  • static什么時(shí)候修飾一個(gè)函數(shù)?
    如果一個(gè)函數(shù)沒(méi)有直接訪問(wèn)到非靜態(tài)的成員時(shí),那么就可以使用static修飾了(一般用于工具類型的方法)

  • 靜態(tài)函數(shù)不能訪問(wèn)非靜態(tài)的成員?
    靜態(tài)函數(shù)只要存在有對(duì)象, 那么也可以訪問(wèn)非靜態(tài)的數(shù)據(jù), 只是不能直接訪問(wèn)而已

super關(guān)鍵字

  • super關(guān)鍵字代表了父類空間的引用

  • super關(guān)鍵字的作用 :

    1. 子父類存在著同名的成員時(shí),在子類中默認(rèn)是訪問(wèn)子類的成員,可以通過(guò)super關(guān)鍵字指定訪問(wèn)父類的成員
    2. 創(chuàng)建子類對(duì)象時(shí),默認(rèn)會(huì)先調(diào)用父類無(wú)參的構(gòu)造方法,可以通過(guò)super關(guān)鍵字指定調(diào)用父類的構(gòu)造方法
  • super關(guān)鍵字調(diào)用父類構(gòu)造方法要注意的事項(xiàng):

    1. 如果在子類的構(gòu)造方法上沒(méi)有指定調(diào)用父類的構(gòu)造方法,那么java編譯器會(huì)在子類的構(gòu)造方法上面加上super()語(yǔ)句
    2. super關(guān)鍵字調(diào)用父類的構(gòu)造函數(shù)時(shí),該語(yǔ)句必須要是子類構(gòu)造函數(shù)中的第一個(gè)語(yǔ)句
    3. super與this關(guān)鍵字不能同時(shí)出現(xiàn)在同一個(gè)構(gòu)造函數(shù)中調(diào)用其他的構(gòu)造函數(shù)。因?yàn)閮蓚€(gè)語(yǔ)句都需要第一個(gè)語(yǔ)句
  • super關(guān)鍵字與this關(guān)鍵字的區(qū)別:

    1. 代表的事物不一致
      1. super關(guān)鍵字代表的是父類空間的引用
      2. this關(guān)鍵字代表的是所屬函數(shù)的調(diào)用者對(duì)象
    2. 使用前提不一致
      1. super關(guān)鍵字必須要有繼承關(guān)系才能使用
      2. this關(guān)鍵字不需要存在繼承關(guān)系也可使用
    3. 調(diào)用構(gòu)造函數(shù)的區(qū)別 :
      1. super關(guān)鍵字是調(diào)用父類的構(gòu)造函數(shù)
      2. this關(guān)鍵字是調(diào)用本類的構(gòu)造函數(shù)

instanceof 關(guān)鍵字

  • instanceof關(guān)鍵字的作用:判斷一個(gè)對(duì)象是否屬于指定的類別。
  • instanceof關(guān)鍵字的使用前提:判斷的對(duì)象與指定的類別必須要存在繼承或者實(shí)現(xiàn)的關(guān)系(學(xué)習(xí)接口的時(shí)候就會(huì)理解)
  • instanceof關(guān)鍵字的使用格式:
    對(duì)象 instanceof 類別
  • instanceof關(guān)鍵字的作用:一般做強(qiáng)制類型轉(zhuǎn)換之前都會(huì)使用該關(guān)鍵字先判斷一下,然后在進(jìn)行轉(zhuǎn)換

final(最終、修飾符)

  • final關(guān)鍵字的用法:
    1. final關(guān)鍵字修飾一個(gè)基本類型的變量時(shí),該變量不能重新賦值,第一次的值為最終的
    2. fianl關(guān)鍵字修飾一個(gè)引用類型變量時(shí),該變量不能重新指向新的對(duì)象
    3. final關(guān)鍵字修飾一個(gè)函數(shù)的時(shí)候,該函數(shù)不能被重寫
    4. final關(guān)鍵字修飾一個(gè)類的時(shí)候,該類不能被繼承
  • 常量 的修飾符一般為: public static final
//圓形
class Circle{

    double r; //半徑
    public static final double pi = 3.14; //固定不變的
    public Circle(double r){
        this.r = r;
    }

    //計(jì)算面積
    public final void getArea(){
        System.out.println("圓形的面積是:"+r*r*pi);
    }
}

class Demo2 extends Circle
{
    public Demo2(double r){
        super(r);
    }

    public static void main(String[] args) 
    {
        /*
        final Circle c = new Circle(4.0);
        test(c);
        */  
        Demo2 c = new Demo2(4.0);
        c.getArea();
    }

    public static void test(Circle c){
        c = new Circle(5.0);  //c變量又重新指向了新的對(duì)象。
        c.getArea();
    }
}

抽象類 : abstract

  • 抽象類的應(yīng)用場(chǎng)景:

    • 我們?cè)诿枋鲆活愂挛锏臅r(shí)候,發(fā)現(xiàn)該種事物確實(shí)存在著某種行為, 但是這種行為目前是不具體的,那么我們可以抽取這種行為 的聲明,但是不去實(shí)現(xiàn)該種行為,這時(shí)候這種行為我們稱作為抽象的行為,我們就需要使用抽象類
    • 目前存在的問(wèn)題:
        1. 動(dòng)物類的run方法描述的不正確
        1. 沒(méi)有強(qiáng)制要子類一定要重寫run方法
  • 抽象類的好處: 強(qiáng)制要求子類一定要實(shí)現(xiàn)指定的方法。

  • 抽象類要注意的細(xì)節(jié) :

    1. 如果一個(gè)函數(shù)沒(méi)有方法體, 那么該函數(shù)必須要使用abstract修飾把函數(shù)修飾成抽象的函數(shù)
    2. 如果一個(gè)類出現(xiàn)了抽象的函數(shù),那么該類也必須使用abstract修飾
    3. 如果一個(gè)非抽象類繼承了抽象類, 那么必須要把抽象類的所有抽象方法全部實(shí)現(xiàn)
    4. 抽象類可以存在非抽象方法, 也可以存在抽象的方法
    5. 抽象類可以不存在抽象方法的
    6. 抽象類是不能創(chuàng)建對(duì)象的
      疑問(wèn):為什么抽象類不能創(chuàng)建對(duì)象呢?
      因?yàn)槌橄箢愂谴嬖诔橄蠓椒ǖ?,如果能讓抽象類?chuàng)建對(duì)象的話,那么使用抽象的對(duì)象調(diào)用抽象方法是沒(méi)有任何意義的
    7. 抽象類是存在構(gòu)造函數(shù)的,其構(gòu)造函數(shù)是提供給子類創(chuàng)建對(duì)象的時(shí)候初始化父類的屬性的
  • abstract不能與以下關(guān)鍵字共同修飾一個(gè)方法:

    1. abstract不能與private共同修飾一個(gè)方法
    2. abstract 不能與static共同修飾一個(gè)方法
    3. abstract 不能與final共同修飾一個(gè)方法
//動(dòng)物類--->抽象類
abstract class Animal{
    
    String name;
    String  color;
    public Animal(String  name,String color){
        this.name = name;
        this.color = color;
    }
    
    //非抽象的方法
    public void eat(){
        System.out.println(name+"吃糧食");
    }

    //移動(dòng)...(該函數(shù)沒(méi)有方法體, 所以必須使用abstract修飾該函數(shù))
    public abstract void run();
}

//狗 是屬于動(dòng)物中一種 
class Dog extends Animal{
    public Dog(String name,String color){
        super(name,color);
    }
    public void run(){
        System.out.println(name+"四條腿跑得很快...");
    }
}

//魚 是屬于動(dòng)物中一種
class Fish extends Animal{
    public Fish(String name,String color){
        super(name,color);
    }
    public void run(){
        System.out.println(name+"搖搖尾巴游啊游!");
    }
}

class Demo{

    public static void main(String[] args) 
    {
        /*
        Dog d = new Dog("牧羊犬","棕色");
        d.run();

        //創(chuàng)建一個(gè)魚對(duì)象
        Fish f  = new Fish("錦鯉","金黃色");
        f.run();
        */
        Animal a = new Animal();
    }
}
  • 常量的命名規(guī)范:全部字母大寫,單詞與單詞之間使用下劃線分隔

配置文件類

  • Properties(配置文件類): 主要用于生產(chǎn)配置文件與讀取配置文件的信息。
  • Properties要注意的細(xì)節(jié):
    1. 如果配置文件的信息一旦使用了中文,那么在使用store方法生成配置文件的時(shí)候只能使用字符流解決,如果使用字節(jié)流生成配置文件的話,默認(rèn)使用的是iso8859-1碼表進(jìn)行編碼存儲(chǔ),這時(shí)候會(huì)出現(xiàn)亂碼。
    2. 如果Properties中的內(nèi)容發(fā)生了變化,一定要重新使用Properties生成配置文件,否則配置文件信息不會(huì)發(fā)生變化。
public class Demo{
    public static void main(String[] args) throws IOException {
        creatProperties();
//      readProperties();
    }
    
    //讀取配置文件愛(ài)你的信息 
    public static void readProperties() throws IOException{
        //創(chuàng)建Properties對(duì)象
        Properties properties = new Properties();
        //加載配置文件信息到Properties中
        properties.load(new FileReader("F:\\persons.properties"));
        //遍歷
        Set<Entry<Object, Object>> entrys = properties.entrySet();
        for(Entry<Object, Object> entry  :entrys){
            System.out.println("鍵:"+ entry.getKey() +" 值:"+ entry.getValue());
        }
        //修改狗娃的密碼
        //把修改后的Properties再生成一個(gè)配置文件
        properties.setProperty("狗娃", "007");
        properties.store(new FileWriter("F:\\persons.properties"), "hehe");
    }
        
    //保存配置文件文件的信息
    public static void creatProperties() throws IOException{
        //創(chuàng)建Properties
        Properties properties = new Properties();
        properties.setProperty("狗娃", "123");
        properties.setProperty("狗剩","234");
        properties.setProperty("鐵蛋","345");
        // 遍歷Properties
        /*Set<Entry<Object, Object>> entrys = properties.entrySet();
        for(Entry<Object, Object> entry  :entrys){
            System.out.println("鍵:"+ entry.getKey() +" 值:"+ entry.getValue());
        }*/
        
        //使用Properties生產(chǎn)配置文件。
        //properties.store(new FileOutputStream("F:\\persons.properties"), "haha"); //第一個(gè)參數(shù)是一個(gè)輸出流對(duì)象,第二參數(shù)是使用一個(gè)字符串描述這個(gè)配置文件的信息。
        properties.store(new FileWriter("F:\\persons.properties"), "hehe");
    }
}
 需求: 使用properties實(shí)現(xiàn)本軟件只能運(yùn)行三次,超過(guò)了三次之后就提示購(gòu)買正版,退jvm.

public class Demo1 {
    
    public static void main(String[] args) throws IOException {
        File file = new File("F:\\count.properties");
        if(!file.exists()){
            //如果配置文件不存在,則創(chuàng)建該配置文件
            file.createNewFile();
        }
        
        //創(chuàng)建Properties對(duì)象。
        Properties properties = new Properties();
        //把配置文件的信息加載到properties中
        properties.load(new FileInputStream(file));
        FileOutputStream fileOutputStream = new FileOutputStream(file);

        int count = 0; //定義該變量是用于保存軟件的運(yùn)行次數(shù)的。
        //讀取配置文件的運(yùn)行次數(shù)
        String value = properties.getProperty("count");
        if(value!=null){
            count = Integer.parseInt(value);
        }
        
        //判斷使用的次數(shù)是否已經(jīng)達(dá)到了三次,
        if(count==3){
            System.out.println("你已經(jīng)超出了試用次數(shù),請(qǐng)購(gòu)買正版軟件!!");
            System.exit(0);
        }

        count++;
        System.out.println("你已經(jīng)使用了本軟件第"+count+"次");
        properties.setProperty("count",count+"");
        //使用Properties生成一個(gè)配置文件
        properties.store(fileOutputStream,"runtime");
        
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容