Java ——對象 類 方法重載 構造方法 封裝 內部類


本節重點思維導圖

 

 

 

 

 

快捷鍵

  • 生成代碼:alt+shift+s
  • 提取變量:alt+shift+L
  • 快速復制行:alt+ctrl+向上或向下的箭頭
  • 刪除行:ctrl+d

 

類:對同一種事物共同屬性行為的抽象

對象:根據創建出來的具體的實物

 

 

 

方法重載

在同一個類中提供多個同名不同參的方法

重載要求:方法名稱相同,但參數的   類型不同     or   參數的個數不同     or     參數的順序不同】

public class Demo {
    public void fun1() {
    }
    public void fun1(int a) {
    }
    public void fun1(String c) {
    }
    public void fun1(int c, int d) {
    }
    public void fun1(String c, int d) {
    }
    public void fun1(int d, String c) {
    }
}
對於重載,系統是根據     實參    確定最終調用的哪一個方法的

 

 

public class Teacher {
    int id;
    String name;
    String major;

    public Teacher() {
        System.out.println("默認構造方法");
    }

    public Teacher(int id) {
        System.out.println("Teacher(int id)");
    }

    public Teacher(int id, String name) {
        this.id = id;
        this.name = name;
        System.out.println("Teacher(int id,String name)");
    }

    public void shangKe() {
        System.out.println("shangKe");
    }

    public void piGaiZuoYe() {
        System.out.println("pi gai zuo ye");
    }
}

注意:this指的是new出來的空間。

 

 

 

封裝

訪問控制修飾符

  • private:私有的,只能在當前類中使用,其它任何類都不能使用
  • public:公共的,誰(任何地方的任何類)都可以使用
public class Person {
    private int age;
    private String gender;
    private float height;

    public void setAge(int age) {
        if (age < 0 || age > 125) {
            System.out.println("age input error");
            return;//從方法中返回
        }
        this.age = age;
    }

    public int getAge() {
        return this.age;
    }
}

 

 

 

內部類

 

將一個類的定義放在另一個類的定義內部,這就是內部類。

 

如同一個人是由大腦、肢體、器官等身體結果組成,而內部類相當於其中的某個器官之一,例如心臟:它也有自己的屬性和行為(血液、跳動)

 

顯然,此處不能單方面用屬性或者方法表示一個心臟,而需要一個類,而心臟又在人體當中,正如同是內部類在外部類當中。

1)不用內部類:

public class Person {
    private int blood;
    private Heart heart;
}

public class Heart {
    private int blood;
    public void test() {
        System.out.println(blood);
    }
}

2)使用內部類:

public class Person {
    private int blood;
    public class Heart {
        public void test() {
            System.out.println(blood);
        }
    }

    public class Brain {
        public void test() {
            System.out.println(blood);
        }
    }
}

內部類優點和缺點:

  • 優點:可訪問外部類私有屬性(心臟可訪問身體的血液,而不是外部抽血)。
  • 缺點:破壞原有類的程序結構(屬性、構造方法、普通方法、內部類)。

應用舉例:

//外部類
class Out {
    private int age = 12;
     
    //內部類
    class In {
        public void print() {
            System.out.println(age);
        }
    }
}
 
public class Demo {
    public static void main(String[] args) {
        Out.In in = new Out().new In();
        in.print();
        //或者采用下種方式訪問
        /*
        Out out = new Out();
        Out.In in = out.new In();
        in.print();
        */
    }
}

運行結果:12

從上面的例子不難看出,內部類其實嚴重破壞了良好的代碼結構,但為什么還要使用內部類呢?

因為內部類可以隨意使用外部類的成員變量(包括私有)而不用生成外部類的對象,這也是內部類的唯一優點。

如同心臟可以直接訪問身體的血液,而不是通過醫生來抽血。

程序編譯過后會產生兩個 .class 文件,分別是 Out.class 和 Out$In.class。

其中 $ 代表了上面程序中 Out.In 中的那個。

Out.In in = new Out().new In() 可以用來生成內部類的對象,這種方法存在兩個小知識點需要注意:

  • 1.開頭的 Out 是為了標明需要生成的內部類對象在哪個外部類當中。
  • 2.必須先有外部類的對象才能生成內部類的對象,因為內部類的作用就是為了訪問外部類中的成員變量。

java 中的內部類總結

Java 內部類詳解

 

 

 

 

 

額外補充:

1.java因強制要求類名(唯一的public類)和文件名統一,因此在引用其它類時無需顯式聲明。在編譯時,編譯器會根據類名去尋找同名文件。

 

2.package 的作用是防止名字相同的類產生沖突。Java 編譯器在編譯時,直接根據 package 指定的信息直接將生成的 class 文件生成到對應目錄下。如 package aaa.bbb.ccc 編譯器就將該 .java 文件下的各個類生成到 ./aaa/bbb/ccc/ 這個目錄。

import 是為了簡化使用 package 之后的實例化的代碼。假設 ./aaa/bbb/ccc/ 下的 A 類,假如沒有 import,實例化A類為:new aaa.bbb.ccc.A(),使用 import aaa.bbb.ccc.A 后,就可以直接使用 new A() 了,也就是編譯器匹配並擴展了 aaa.bbb.ccc. 這串字符串。

 

3.

為什么JAVA文件中只能含有一個Public類?

java 程序是從一個 public 類的 main 函數開始執行的,(其實是main線程),就像 C 程序 是從 main() 函數開始執行一樣。 只能有一個 public 類是為了給類裝載器提供方便。 一個 public 類只能定義在以它的類名為文件名的文件中。

每個編譯單元(文件)都只有一個 public 類。因為每個編譯單元都只能有一個公共接口,用 public 類來表現。該接口可以按照要求包含眾多的支持包訪問權限的類。如果有一個以上的 public 類,編譯器就會報錯。 並且 public類的名稱必須與文件名相同(嚴格區分大小寫)。 當然一個編譯單元內也可以沒有 public 類

 

4.

成員變量和類變量的區別

由static修飾的變量稱為靜態變量,其實質上就是一個全局變量。如果某個內容是被所有對象所共享,那么該內容就應該用靜態修飾;沒有被靜態修飾的內容,其實是屬於對象的特殊描述。

不同的對象的實例變量將被分配不同的內存空間, 如果類中的成員變量有類變量,那么所有對象的這個類變量都分配給相同的一處內存,改變其中一個對象的這個類變量會影響其他對象的這個類變量,也就是說對象共享類變量。

成員變量和類變量的區別:

   1、兩個變量的生命周期不同

      成員變量隨着對象的創建而存在,隨着對象的回收而釋放。

      靜態變量隨着類的加載而存在,隨着類的消失而消失。

   2、調用方式不同

      成員變量只能被對象調用。

      靜態變量可以被對象調用,還可以被類名調用。

   3、別名不同

      成員變量也稱為實例變量。

      靜態變量也稱為類變量。

   4、數據存儲位置不同

      成員變量存儲在堆內存的對象中,所以也叫對象的特有數據。

      靜態變量數據存儲在方法區(共享數據區)的靜態區,所以也叫對象的共享數據。

 

static 關鍵字,是一個修飾符,用於修飾成員(成員變量和成員函數)。

   特點:

   1、想要實現對象中的共性數據的對象共享。可以將這個數據進行靜態修飾。

   2、被靜態修飾的成員,可以直接被類名所調用。也就是說,靜態的成員多了一種調用方式。類名.靜態方式。

    3、靜態隨着類的加載而加載。而且優先於對象存在。

 

弊端:

   1、有些數據是對象特有的數據,是不可以被靜態修飾的。因為那樣的話,特有數據會變成對象的共享數據。這樣對事物的描述就出了問題。所以,在定義靜態時,必須要明確,這個數據是否是被對象所共享的。

   2、靜態方法只能訪問靜態成員,不可以訪問非靜態成員。

      因為靜態方法加載時,優先於對象存在,所以沒有辦法訪問對象中的成員。

   3、靜態方法中不能使用this,super關鍵字。

      因為this代表對象,而靜態在時,有可能沒有對象,所以this無法使用。

 

什么時候定義靜態成員呢?或者說:定義成員時,到底需不需要被靜態修飾呢?

成員分兩種:

   1、成員變量。(數據共享時靜態化)

      該成員變量的數據是否是所有對象都一樣:

      如果是,那么該變量需要被靜態修飾,因為是共享的數據。 

      如果不是,那么就說這是對象的特有數據,要存儲到對象中。 

   2、成員函數。(方法中沒有調用特有數據時就定義成靜態)

      如果判斷成員函數是否需要被靜態修飾呢?

      只要參考,該函數內是否訪問了對象中的特有數據:

      如果有訪問特有數據,那方法不能被靜態修飾。

      如果沒有訪問過特有數據,那么這個方法需要被靜態修飾。

 

成員變量和靜態變量的區別:

   1、成員變量所屬於對象。所以也稱為實例變量。

      靜態變量所屬於類。所以也稱為類變量。

   2、成員變量存在於堆內存中。

      靜態變量存在於方法區中。

   3、成員變量隨着對象創建而存在。隨着對象被回收而消失。

      靜態變量隨着類的加載而存在。隨着類的消失而消失。

   4、成員變量只能被對象所調用 。

      靜態變量可以被對象調用,也可以被類名調用。

   所以,成員變量可以稱為對象的特有數據,靜態變量稱為對象的共享數據。

 

 

 

 5.

 

 

 

6.創建對象時,new關鍵字的作用:

 

 

7.

 

 

 

 

 

 8.java中this 和 super的用法總結

  • this 指向對象本身的指針,形參與成員名字重名,用 this 來區分。
  • super 超(父)類對象的一個指針。

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: