天天看點

Java基礎包與内部類

包的概述

其實就是檔案夾

作用:對類進行分類管理

包的劃分:

舉例:

   學生的增加,删除,修改,查詢

   老師的增加,删除,修改,查詢

   以及以後可能出現的其他的類的增加,删除,修改,查詢

基本的劃分:按照子產品和功能分。

/*

包:

A:其實就是檔案夾

B:作用

a:把相同的類名放到不同的包中

b:對類進行分類管理

學生:增加,删除,修改,查詢

老師:增加,删除,修改,查詢

...

方案1:按照功能分

com.it18zhang..add

AddStudent

AddTeacher

com.it18zhang..delete

DeleteStudent

DeleteTeacher

com.it18zhang..update

UpdateStudent

UpdateTeacher

com.it18zhang..find

FindStudent

FindTeacher

方案2:按照子產品分

com.it18zhang..teacher

com.it18zhang..student

包的定義

package 包名;

多級包用.分開即可

注意事項:

A:package語句必須是程式的第一條可執行的代碼

B:package語句在一個java檔案中隻能有一個

C:如果沒有package,預設表示無包名

帶包的編譯和運作:

A:手動式

a:編寫一個帶包的java檔案。

b:通過javac指令編譯該java檔案。

c:手動建立包名。

d:把b步驟的class檔案放到c步驟的最底層包

e:回到和包根目錄在同一目錄的地方,然後運作

帶包運作。

B:自動式

b:javac編譯的時候帶上-d即可-d 要加空格

javac -d . HelloWorld.java

c:回到和包根目錄在同一目錄的地方,然後運作

*/

包的定義及注意事項

定義包的格式

   package 包名;

      多級包用.分開即可

注意事項:

   package語句必須是程式的第一條可執行的代碼

   package語句在一個java檔案中隻能有一個

   如果沒有package,預設表示無包名

帶包的類的編譯和運作

手動式

  a:javac編譯目前類檔案。

  b:手動建立包對應的檔案夾。

  c:把a步驟的class檔案放到b步驟的最終檔案夾下。

  d:通過java指令執行。注意了:需要帶包名稱的執行

    java com.it18zhang.HelloWorld

自動式

a:javac編譯的時候帶上-d即可

   javac -d . HelloWorld.java

b:通過java指令執行。和手動式一樣

不同包下類之間的通路

定義兩個類:Demo,Test。

 Demo

   求和方法(sum)

 Test

   測試方法(main)

Test類,測試

導包:

格式:import 包名;

這種方式導入是到類的名稱。

注意:我們用誰就導誰。

面試題:

package,import,class有沒有順序關系?

有。

package > import > class

Package:隻能有一個

import:可以有多個

class:可以有多個,以後建議是一個

第一個問題:找不到Demo

第二個問題:程式包com.zhang不存在

第三個問題: Demo在com.zhang中不是公共的; 無法從外部程式包中對其進行通路

Demo類,求和

導包

不同包下的類之間的通路,我們發現,每次使用不同包下的類的時候,都需要加包的全路徑。比較麻煩。這個時候,java就提供了導包的功能。

導包格式

import 包名;

注意:

雖然可以最後寫*,但是不建議。

package,import,class有沒有順序關系(面試題)

權限問題

Java基礎包與内部類

類及其組成可以用的修飾符

類:

  預設,public,final,abstract

  我們自己定義:public居多

成員變量:

  四種權限修飾符均可,final,static

  我們自己定義:private居多

構造方法:

   四種權限修飾符均可,其他不可

   我們自己定義:public 居多

成員方法:

   四種權限修飾符均可,fianl,static,abstract

   我們自己定義:public居多

修飾符:

權限修飾符:private,預設的,protected,public

狀态修飾符:static,final

抽象修飾符:abstract

權限修飾符:預設修飾符,public

狀态修飾符:final

用的最多的就是:public

用的最多的就是:private

除此以外的組合規則:

成員變量:public static final

成員方法:public static

          public abstract

  public final

内部類概述

把類定義在其他類的内部,這個類就被稱為内部類。

 舉例:在類A中定義了一個類B,類B就是内部類。

内部類的通路特點:

  内部類可以直接通路外部類的成員,包括私有。

  外部類要通路内部類的成員,必須建立對象。

 /*

内部類概述:

舉例:在類A中定義了一個類B,類B就是内部類。

内部的通路特點:

A:内部類可以直接通路外部類的成員,包括私有。

B:外部類要通路内部類的成員,必須建立對象。

内部類位置

按照内部類在類中定義的位置不同,可以分為如下兩種格式:

  成員位置(成員内部類)

  局部位置(局部内部類)

成員位置:在成員位置定義的類,被稱為成員内部類。

局部位置:在局部位置定義的類,被稱為局部内部類。

外界如何建立對象

  外部類名.内部類名 對象名 = 外部類對象.内部類對象;

成員内部類:

如何直接通路内部類的成員。

外部類名.内部類名 對象名 = 外部類對象.内部類對象;

成員内部類

剛才我們講解過了,成員内部類的使用,但是一般來說,在實際開發中是不會這樣使用的。因為一般内部類就是不讓外界直接通路的。

舉例講解這個問題:Body和Heart,電腦和CPU。

成員内部的常見修飾符

  private 為了保證資料的安全性

  static 為了讓資料通路更友善

      被靜态修飾的成員内部類隻能通路外部類的靜态成員

    内部類被靜态修飾後的方法

       靜态方法

       非靜态方法

成員内部類的修飾符:

private 為了保證資料的安全性

static 為了友善通路資料

注意:靜态内部類通路的外部類資料必須用靜态修飾。

案例:我有一個人(人有身體,身體内有心髒。)

class Body {

private class Heart {

public void operator() {

System.out.println("心髒搭橋");

}

public void method() {

if(如果你是外科醫生) {

Heart h = new Heart();

h.operator();

按照我們剛才的講解,來使用一下

Body.Heart bh = new Body().new Heart();

bh.operator();

//加了private後,就不能被通路了,那麼,怎麼玩呢?

Body b =  new Body();

b.method();

局部内部類

可以直接通路外部類的成員

可以建立内部類對象,通過對象調用内部類方法,來使用局部内部類功能

局部内部類通路局部變量的注意事項:

必須被final修飾?

為什麼呢?

因為局部變量會随着方法的調用完畢而消失,這個時候,局部對象并沒有立馬從堆記憶體中消失,還要使用那個變量。為了讓資料還能繼續被使用,就用fianl修飾,這樣,在堆記憶體裡面存儲的其實是一個常量值。通過反編譯工具可以看一下

A:可以直接通路外部類的成員

B:在局部位置,可以建立内部類對象,通過對象調用内部類方法,來使用局部内部類功能

局部内部類通路局部變量的注意事項?

A:局部内部類通路局部變量必須用final修飾

B:為什麼呢?

局部變量是随着方法的調用而調用,随着調用完畢而消失。

而堆記憶體的内容并不會立即消失。是以,我們加final修飾。

加入final修飾後,這個變量就成了常量。既然是常量。你消失了。

我在記憶體中存儲的是資料20,是以,我還是有資料在使用。

匿名内部類

就是内部類的簡化寫法。

前提:存在一個類或者接口

  這裡的類可以是具體類也可以是抽象類。

格式:

  new 類名或者接口名() {重寫方法;}

本質:

  是一個繼承了類或者實作了接口的子類匿名對象

這裡的類可以是具體類也可以是抽象類。

new 類名或者接口名(){

重寫方法;

本質是什麼呢?

是一個繼承了該類或者實作了該接口的子類匿名對象。

匿名内部類的應用

匿名内部類在開發中的使用