3.JAVA-方法重載,類的封裝訪問權限,構造/析構方法


1.方法重載

和C++的函數重載一樣,主要是實現多個相同的函數名,但是參數表不同.

參數表不同主要有以下幾種

  • 1) 參數個數不同
  • 2) 參數類型不同
  • 3) 參數順序不同

 

2.類和對象

類class

用來描述一個對象的結構,但是類不能直接使用,必須生成對象后才能使用

對象

通過類來生成的一個對象, 根據類生成的對象都具備相同的行為(class成員函數),但是屬性(class成員變量)不一定相同.

 

3.對象引用分析

示例如下:

class People
{
         String name;
         public void print(){
                  System.out.println("name:"+name);
         }
}

public class Test{
                  public static void main(String args[]){
                  People PeopleA = new People(); //在棧空間定義一個peopleA地址,然后通過new在堆空間創建一段內存,使PeopleA引用它

                  PeopleA.name ="小張";

                  People PeopleB = PeopleA;   //在棧空間定義一個peopleB地址,然后使peopleB引用peopleA所指向的堆空間.

                  PeopleB.print();
                  }
}

打印如下:

 

可以看到通過引用,可以讓兩個對象指向同一塊堆空間

 

4.類的封裝

成員變量訪問權限有以下4種:

 

  • 在JAVA中,成員變量權限默認是為default (和C++不同,C++默認為private).
  • 上圖的同一包,表示在同一個目錄中的類成員訪問權限 

包的定義以及使用參考: 13.JAVA-包package、import使用

接下來我們來看看default區別

定義common.demo.Test類:

package common.demo ;  //指定生成的class文件位於common/demo/目錄下
public class Test
{ 
         static int i=10;                           //默認為default權限
         public  static void main(String args[]){
                  System.out.println("Hello World");
         }
}

 

定義common.demo.CallTest類,此類和common.demo.Test類位於同一包:

package common.demo ;  //指定生成的class文件位於common/demo/目錄下
import common.demo.*;     //導入common.demo包里的所有類

public class CallTest
{ 
         public static void main(String args[]){
                  System.out.println("i:"+Test.i);       //打印靜態屬性i
         }
}

 

運行打印:

 

然后我們屏蔽" package common.demo ;"后,則CallTest類不在common.demo包里了,所以訪問Test.i將會報錯,編譯后如下圖所示:

 

 

 

5.構造方法

  • 構造方法的作用,用來類對象實例化的時候,初始化其屬性(成員變量)所准備的
  • 如果類中沒有定義構造方法,編譯器會默認提供一個無參數的構造方法。
  • 構造方法可以帶參數,但是不能有任何返回類型的聲明
  • 構造方法不能定義static類型,因為構造方法是在運行期間才會去生成對象
  • 構造方法支持多個方法重載

示例:

class People
{
         public  People(String name){                 //構造方法
                  this.name = name;           //類中有個隱藏的this屬性,它永遠指向當前對象
         }
         public void print(){
                  System.out.println("name:"+name);
         }
}

public class Test{
                  public static void main(String args[]){
                  People PeopleA = new People("小張"); //調用 構造方法People(String name) 來初始化屬性
                  PeopleA.print();
                  }
}

 

6.析構方法

  • 在java中,也有析構方法,不過和C++中類前面加~號的不一樣。
  • 在java中,如果需要自己寫析構方法,則在類中定義一個void finalize()方法.
  • finalize必須是protected權限的,因為java中的類,默認都是繼承於Object,所以重寫析構方法時,需要和Object的一致

PS:一般用不到它,因為java有自動內存回收機制

 

計數當前共有多少個對象示例,代碼如下:

class Counter
{
         private static int cnt = 0;
         public Counter()
         {
                  cnt++;
         }
         public static void printCnt()
         {
                  System.out.println("Cnt:"+cnt);
         }

         protected void finalize()
         {
                  cnt--;
         }
}

public class Test{
                  public static void main(String args[]){

                  Counter cnt1 = new Counter();
                  Counter.printCnt();

                  Counter cnt2 = new Counter();
                  Counter.printCnt();

        
                  cnt2 = null;                           //將cnt2置為null

                  try
                 {
                    System.gc();                           //告訴回收站,有垃圾,需要清理內存
                    Thread.currentThread().sleep(1000);    //休眠1000毫秒,因為需要給finalize()方法提供執行時間
                   Counter.printCnt();                       //釋放掉cnt2后,則輸出1(因為還有cnt1存在)
                }
                  catch(InterruptedException e)   //sleep休眠可能產生InterruptedException異常.所以需要用try捕捉
                {
                   e.printStackTrace();              //打印回溯信息
                }
         }
}

 運行打印:

 

下章學習:4.JAVA-數組、String詳解

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM