JAVA SE(八)—— JAVA 面向對象2(函數、堆和棧、訪問修飾符)

一、JAVA 函數

1、基本概念
(1)函數的概念
Java函數就是將具有特定功能的代碼封裝起來,然後在需要的時候調用即可(在主函數中調用)。

(2)定義函數的語法

訪問修飾符 返回值數據類型 函數名([參數列表]{	//中括號可有可無
	特定功能的代碼塊;
	[return];
}
  • 訪問修飾符
public  protected  private  default
  • 返回值數據類型
    函數的參數返回類型可以是8個基本數據類型,一個包裝類String,一個引用類(數組),也可以是空返回值void。
  • 參數列表:根據需求添加參數
    語法:數據類型 參數名 多個參數之間用逗號隔開
public static int add(int a,int b){
	return sum = a + b;
}
  • return 值:返回值數據類型和return的關係
    • 怎麼確定返回值數據類型:
      沒有返回值的時候,返回值數據類型設置爲void,如果是void,不能有返回值,可以有return,只是return後面不能跟有變量或值;
      如果不是void,那麼必須跟有return,還要跟值,而且返回值數據類型和return後面返回的變量數據類型必須一致。
    • return的作用:
      當有返回值的時候,則是將函數裏面的值傳到函數外面;
      當沒有返回值的時候,作爲函數的結束標誌,在return的前面將不能再寫代碼,否則報錯。
public void add(){
	int a = 10;
	int b = 100;
	int c = a + b;
}

注意:方法定義了並不會全部運行,

2、方法特點
提高複用性,具有封裝性,最好功能單一,函數功能越單一,功能越大,複用性越高。

3、方法的重載
在同一個類中,有着相同的函數名,不同的參數列表(參數的個數或者參數數據類型或者參數順序不一樣),和返回值無關。

4、構造函數
(1)每一個類都有一個構造函數,當我們沒有自己寫構造函數的時候,那麼虛擬機會自動添加一個無參的構造函數。 如果自己寫了構造函數,虛擬機將不會給無參的構造函數。
構造函數的函數名與類名相同,不用定義返回值類型,也不用寫return語句。多個構造函數是以重載的方式存在的。

(2)語法

訪問修飾符  類名([參數列表]){  }
比如:
public Person(){
//無參函數
}

如果在類中寫了有參構造函數,則必須要寫上無參構造。
構造函數示例

public class Person{
	private int id;
	private String name;
	private String age;
	
	public Person(){	//無參構造函數
	
	}
	public Person(int id){	//有參構造函數
		this.id = id;
	}
	public Person(String name,String age){	//有參構造函數
		this.name = name;
		this.age = age;
	}
}

(3)作用:用於初始化成員變量的值,即用於給對象進行初始化。

5、構造代碼塊
(1)構造代碼塊:還有大括號括起來的主體,沒有函數聲明和定義。

{
	System.out.println("構造代碼塊");
} 

(2)構造代碼塊在對象一建立的時候就會運行,會優先於構造函數之前執行,構造代碼塊的作用也是初始化變量值,但是是給所有對象進行統一初始化。

(3)Demo

public class Demo {
	public static Demo d1 = new Demo();
	public static Demo d2 = new Demo();
		{
			System.out.println("構造代碼塊");
		}
		static{
			System.out.println("靜態代碼塊");
		}
		//構造函數
		public Demo() {
			System.out.println("構造函數");
		}
		//main函數
	public static void main(String[] args) {
		Demo d3 = new Demo();
	}
}
結果:
構造代碼塊
構造函數
構造代碼塊
構造函數
靜態代碼塊
構造代碼塊
構造函數

6、局部變量和全局變量
(1)局部變量:只有一部分可以使用改變量;
全局變量:定義在類裏面的變量叫做全局變量,又叫成員變量。

public class Demo{
	public static void main(String[] args){
		int sum =0;
		for(int i = 0; i < 100; i++){
			sum = sum +i;
		}
		System.out.println(sum);
	}
}

在示例中,變量sum就是全局變量,變量i就是局部變量,sum可以在本類任何位置使用,但是i只能在for循環內使用,如果在for循環外只用變量i,系統將會提示這是一個沒有定義的變量。

(2)區別

  • 作用範圍不一樣。
  • 內存所在位置不一樣,局部變量在棧內存中,全局變量在堆內存中。

7、調成員方法
成員屬性在堆內存中,成員方法在方法區,調用時在棧內存中開闢空間,用完立即消失。

8、類與對象
類:具有共同屬性和行爲的一類事物,用class修飾。
對象:創建對象的語法:

類名 對象名 = new 類名(); 

只要創建了一個對象,這個對象就具有類裏面的所有屬性。

Person p = new Person();

前面的Person用於聲明類,後面的Person用於調用函數。

二、堆和棧

1、JAVA在程序運行時,在內存中劃分5片空間進行數據的存儲。分別是:寄存器、本地方法區、方法區、棧內存、堆內存。
(1)棧:函數中定義的基本類型變量,對象的引用變量都在函數的棧內存中分配。 棧內存特點,數數據一執行完畢,變量會立即釋放,節約內存空間。 棧內存中的數據,沒有默認初始化值,需要手動設置。

(2)堆:堆內存用來存放new創建的對象和數組。 堆內存中所有的實體都有內存地址值。 堆內存中的實體是用來封裝數據的,這些數據都有默認初始化值。 堆內存中的實體不再被指向時,JVM啓動垃圾回收機制,自動清除,這也是JAVA優於C++的表現之一(C++中需要程序員手動清除)。

2、堆棧:先進後出,如同杯子裝東西
隊列:先進先出,如同水管

三、訪問修飾符

1、public 公共訪問權限
(1)具有最大的訪問權限,可以訪問任何一個在classpath下的類、接口、異常等。

(2)如果一個成員(包括成員變量、方法和構造器等)或者一個外部類使用public訪問控制符修飾, 那麼這個成員或外部類就可以被所有類訪問,不管訪問類和被訪問類是否處於同一個包中,是否具有父子繼承關係。

(3)注:在該類外部,若是類成員,則需要類調用成員或外部類;若是非static的類,則應先實例化後,對象對其調用

2、private 當前類訪問權限
(1)訪問權限僅限於類的內部,是一種封裝的體現

(2)如果類裏的一個成員(包括成員變量、方法和構造器等)使用private訪問控制符來修飾,則這個成員只能在當前類的內部被訪問。

(3)可以用set( ),get( )方法

3、protected 子類訪問權限
(1)主要的作用就是用來保護子類的。

(2)它的含義在於子類可以用它修飾的成員,其他的不可以,它相當於傳遞給子類的一種繼承的東西。

(3)如果一個成員(包括成員變量、方法和構造器等)使用protected訪問控制符修飾, 那麼這個成員既可以被同一個包中的其他類訪問,也可以被不同包中的子類訪問。

(4)在通常情況下,如果使用protected來修飾一個方法,通常是希望其子類來重寫這個方法。

4、default 包訪問權限
(1)有時候也稱爲friendly,它是針對本包訪問而設計的,任何處於本包下的類、接口、異常等, 都可以相互訪問,即使是父類沒有用protected修飾的成員也可以。

(2)同一包中的類可以訪問,聲明時沒有加修飾符,認爲是friendly。

(3)如果類裏的一個成員(包括成員變量、方法和構造器等)或者一個外部類不使用任何訪問控制符修飾, 就稱它是包訪問權限,default訪問控制的成員或外部類可以被相同包下的其他類訪問。

5、public,private,protected,default的作用域

作用域			當前類		同一package		子孫類		其他package
public 			  √             √             √              √
protected         √             √             √         	 ×
friendly          √             √             ×         	 ×
private			  √             ×             ×         	 ×
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章