一、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 √ × × ×