【JavaSE】語言基礎(chǔ)10

摘要

  • package關(guān)鍵字
  • 權(quán)限修飾符
  • 匿名內(nèi)部類

package關(guān)鍵字的概述及作用

  • A:為什么要有包

    • 將字節(jié)碼(.class)進(jìn)行分類存放
    • 包其實(shí)就是文件夾
  • B:包的概述

  • 舉例:
    學(xué)生:增加,刪除,修改,查詢
    老師:增加,刪除,修改,查詢
    ...

      方案1:按照功能分
          com.heima.add
              AddStudent
              AddTeacher
          com.heima.delete
              DeleteStudent
              DeleteTeacher
          com.heima.update
              UpdateStudent
              UpdateTeacher
          com.heima.find
              FindStudent
              FindTeacher
      
      方案2:按照模塊分
          com.heima.teacher
              AddTeacher
              DeleteTeacher
              UpdateTeacher
              FindTeacher
          com.heima.student
              AddStudent
              DeleteStudent
              UpdateStudent
              FindStudent
    

包的定義及注意事項(xiàng)

  • A:定義包的格式
    • package 包名;
    • 多級包用.分開即可
  • B:定義包的注意事項(xiàng)
    • A:package語句必須是程序的第一條可執(zhí)行的代碼
    • B:package語句在一個java文件中只能有一個
    • C:如果沒有package,默認(rèn)表示無包名
  • C:案例演示
    • 包的定義及注意事項(xiàng)

帶包的類編譯和運(yùn)行

  • A:如何編譯運(yùn)行帶包的類
    • a:javac編譯的時候帶上-d即可
      • javac -d . HelloWorld.java
    • b:通過java命令執(zhí)行。
      • java 包名.HelloWord

不同包下類之間的訪問

  • A:案例演示
    • 不同包下類之間的訪問

import關(guān)鍵字的概述和使用

  • A:案例演示
    • 為什么要有import
      • 其實(shí)就是讓有包的類對調(diào)用者可見,不用寫全類名了
  • B:導(dǎo)包格式
    • import 包名;
    • 注意:
      • 這種方式導(dǎo)入是到類的名稱。
      • 雖然可以最后寫*,但是不建議(即匹配該包中所有的類,當(dāng)匹配上時導(dǎo)入該類)。
  • C:package,import,class有沒有順序關(guān)系(面試題)有,從前到后

四種權(quán)限修飾符的測試

  • A:案例演示

    • 四種權(quán)限修飾符
  • B:結(jié)論

                      本類   同一個包下(子類和無關(guān)類)  不同包下(子類)    不同包下(無關(guān)類)
          private     Y       
          默認(rèn)          Y           Y
          protected   Y           Y                       Y
          public      Y           Y                       Y           Y
    

類及其組成所使用的常見修飾符

  • A:修飾符:

    • 權(quán)限修飾符:private,默認(rèn)修飾符,protected,public
    • 狀態(tài)修飾符:static,final
    • 抽象修飾符:abstract
  • B:類:

    • 權(quán)限修飾符:默認(rèn)修飾符,public

    • 狀態(tài)修飾符:final

    • 抽象修飾符:abstract

    • 用的最多的就是:public

  • C:成員變量:

    • 權(quán)限修飾符:private,默認(rèn)的,protected,public

    • 狀態(tài)修飾符:static,final

    • 用的最多的就是:private

  • D:構(gòu)造方法:

    • 權(quán)限修飾符:private,默認(rèn)的,protected,public
    • 靜態(tài)類會將構(gòu)造方法私有
    • 用的最多的就是:public
  • E:成員方法:

    • 權(quán)限修飾符:private,默認(rèn)的,protected,public

    • 狀態(tài)修飾符:static,final

    • 抽象修飾符:abstract

    • 用的最多的就是:public

  • F:除此以外的組合規(guī)則:

    • 成員變量:public static final
    • 成員方法:
      • public static
      • public abstract
      • public final

內(nèi)部類概述和訪問特點(diǎn)

  • A:內(nèi)部類概述
    • 在類中定義的類
  • B:內(nèi)部類訪問特點(diǎn)
    • a:內(nèi)部類可以直接訪問外部類的成員,包括私有。
    • b:外部類要訪問內(nèi)部類的成員,必須創(chuàng)建對象。
      • 外部類名.內(nèi)部類名 對象名 = 外部類對象.內(nèi)部類對象;
  • C:案例演示
    class Outer{
        class Inner{
            public void method() {
                System.out.println("內(nèi)部類");
            }
        }
    }
    class Test {
        public static void main(String[] args) {
            Outer.Inner oi=new Outer().new Inner();//外部類訪問內(nèi)部類成員,需要創(chuàng)建對象
            oi.method();
        }
    }
    

成員內(nèi)部類私有使用

  • private
class Outer{
    private class Inner{
        public void method() {
            System.out.println("內(nèi)部類");
        }
    }
    public void print() {  //內(nèi)部類私有時需要通過成員函數(shù)調(diào)用
        Inner i=new Inner(); //外部類訪問內(nèi)部類成員,需要創(chuàng)建對象
        i.method();
    }
}
class Test {
    public static void main(String[] args) {
        Outer o=new Outer();
        o.print();
    }
}

靜態(tài)成員內(nèi)部類

  • static
  • B:成員內(nèi)部類被靜態(tài)修飾后的訪問方式是:
    • 外部類名.內(nèi)部類名 對象名 = 外部類名.內(nèi)部類對象;
    class Outer{
        static class Inner{
            public void method() {
                System.out.println("method");
            }
            public static void print() {
                System.out.println("print");
            }
        }
    }
    class Test {
        public static void main(String[] args) {
            Outer.Inner oi=new Outer.Inner();//靜態(tài)內(nèi)部類的調(diào)用方法
            oi.method();
            Outer.Inner.print();  //靜態(tài)內(nèi)部類中的靜態(tài)函數(shù)的調(diào)用方法
        }
    }
    

成員內(nèi)部類的面試題

  • A:面試題
要求:使用已知的變量,在控制臺輸出30,20,10。

class Outer {
    public int num = 10;
    class Inner {
        public int num = 20;
        public void show() {
            int num = 30;
            System.out.println(?);
            System.out.println(??);
            System.out.println(???);
        }
    }
}
class InnerClassTest {
    public static void main(String[] args) {
        Outer.Inner oi = new Outer().new Inner();
        oi.show();
    }   
}
/*
?   num
??  this.num
??? Outer.this.num 
*/

局部內(nèi)部類訪問局部變量的問題

  • A:案例演示
    • 局部內(nèi)部類訪問局部變量必須用final修飾 (注:jdk1.8中不需要顯式使用final修飾,但是此變量是effectively final的,同樣不可修改)

    • 局部內(nèi)部類在訪問他所在方法中的局部變量必須用final修飾,為什么?
      因?yàn)楫?dāng)調(diào)用這個方法時,局部變量如果沒有用final修飾,他的生命周期和方法的生命周期是一樣的,當(dāng)方法彈棧,這個局部變量也會消失,那么如果局部內(nèi)部類對象還沒有馬上消失想用這個局部變量,就沒有了,如果用final修飾會在類加載的時候進(jìn)入常量池,即使方法彈棧,常量池的常量還在,也可以繼續(xù)使用

      但是jdk1.8取消了這個事情,雖然取消,如果在書寫代碼時候,沒有手動添加,系統(tǒng)底層也會默給你final

class Outer {
    public void method() {
        int num=10;    //
        class Inner {  //局部內(nèi)部類,只能在該方法內(nèi)訪問
            public void print() {
                System.out.println(num);
            }
        }
        Inner i=new Inner();
        i.print();
    }
}
class Test {
    public static void main(String[] args) {
        Outer o=new Outer();
        o.method();
    }   
}

匿名內(nèi)部類的格式和理解

  • A:匿名內(nèi)部類
    • 就是內(nèi)部類的簡化寫法。
  • B:前提:存在一個類或者接口
    • 這里的類可以是具體類也可以是抽象類。
  • C:格式:
  •   new 類名或者接口名(){
          重寫方法;
      }
    
  • D:本質(zhì)是什么呢?
    • 是一個繼承了該類或者實(shí)現(xiàn)了該接口的子類匿名對象。
  • E:案例演示
    • 按照要求來一個匿名內(nèi)部類
interface Inter{
    public void print();
}
class Outer {
//  class Inner implements Inter{
//      public void print() {
//          System.out.println("print");
//      }
//  }
//  public void metohd() {
//      Inner i=new Inner();
//      i.print();
//  }
//  以上類和方法可以組合為以下匿名內(nèi)部類
    public void method() {
        new Inter() {               //實(shí)現(xiàn)Inter接口
            public void print() {   //重寫抽象方法
                System.out.println("print");
            }
        }.print();
    }
}
class Test {
    public static void main(String[] args) {
        Outer o=new Outer();
        o.method();
    }   
}

匿名內(nèi)部類重寫多個方法調(diào)用

  • 需要調(diào)用多個方法時每次都要重寫所有方法,過于復(fù)雜,因此只推薦重寫一個方法時使用匿名內(nèi)部類。匿名內(nèi)部類沒有子類類名,不能向下轉(zhuǎn)型。

匿名內(nèi)部類在開發(fā)中的應(yīng)用

  • A:代碼如下

    //這里寫抽象類,接口都行
    abstract class Person {
        public abstract void show();
    }
    
    class PersonDemo {
        public void method(Person p) {
            p.show();
        }
    }
    //創(chuàng)建一個子類繼承抽象類
    class Student extends Person{
        public void show() {
            System.out.println("show");
        }
    }
    class PersonTest {
        public static void main(String[] args) {
            //如何調(diào)用PersonDemo中的method方法呢?
            PersonDemo pd = new PersonDemo ();
            //通過調(diào)用子類來實(shí)例化
            pd.method(new Student());
        }
    }
    /*
    第二種方法:直接在調(diào)用方法時使用匿名內(nèi)部類
    pd.method(new Person() {
        public void show() {
            System.out.println("show");
        }
    });
    

匿名內(nèi)部類的面試題

  • A:面試題

    //按照要求,補(bǔ)齊代碼
    interface Inter { void show(); }
    class Outer { //補(bǔ)齊代碼 }
    class OuterDemo {
        public static void main(String[] args) {
              Outer.method().show();
          }
    }
    //要求在控制臺輸出”HelloWorld”
    
    interface Inter { void show(); }
    class Outer { 
        //補(bǔ)齊代碼 
        public static Inter method() {
            return new Inter() {
                public void show() {
                    System.out.println("hello world");
                }
            };
        }
    }
    class Test {
        public static void main(String[] args) {
              Outer.method().show();  //鏈?zhǔn)骄幊?,調(diào)用方法后還能調(diào)用方法,說明返回的是對象
          }
    }
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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