學習Java的第五天 | 定義方法 | 引用資料型別——類 | 訪問許可權-修飾符 | 全域性變數與區域性變數 | toString | 構造方法 | 方法過載
前面提到的,氣泡排序,二分查詢,我們有時候寫程式碼可能不止要查到一種陣列的資料,這時候我們就很需要想迴圈那樣的結構,來幫我們解決程式碼冗餘的情況。
我們前面使用的main方法,是一個java程式的入口,我們可以把我們的氣泡排序、二分查詢的方法的程式碼,寫在方法裡,不是方法套方法哦,這是不允許的。
1 定義方法
定義方法,可以這樣分類:
1 、方法的( ) ,括號中如果有填入形參,就是 有參方法(形參) ,沒有的話,就是 無參方法()
2、方法是否有返回值,且根據返回值的型別選擇 如果是無返回值,就是void ,如果返回int,就用int,如果是有返回值型別的,切記要加上return。
public class Test02 {
public static void main(String[] args) {
int[] array = new int[10000];
for (int i = 0; i < array.length; i++) {
array[i] = i;
}
//後半部分,是給二分查詢方法傳入主方法的資料,前半部分是,得到其返回值
//不然我們只調用了這個方法,就沒有去得到我們想要的值,無論是沒有找到的-1
//還是找到的那個值,就沒有意義
int r = search(array,8888);
System.out.println(r);
}
//返回值型別為 int 型別 ,且是有參方法
public static int search(int[] arr, int a){
int start = 0;
int end = arr.length - 1;
while(start<=end){
int middle = (start + end)/2;
if (arr[middle] == a){
//如果要查詢的這個數就是中間值,我們主方法中需要這個值,我們得返回
return middle;
}else if (a > arr[middle]){
start = middle + 1 ;
}else if (a < arr[middle]){
end = middle - 1 ;
}
}
//如果陣列找不到這個值,就返回-1,以告訴程式設計師。
return -1;
}
}
2 引用資料型別——類
在java中只要建立了一個類,就是一個數據型別,類是一個模板,只有特徵,沒有具體資料
根據類在每個特徵上輸入對應的值,就會形成資料。
在java中 建立資料 需要用到關鍵詞——new
//這個cat是物件,就是類中的一個例項
Cat cat = new Cat();
public void Cat(){
public String name ;
public int age ;
public String type ;
}
建立了特徵後,需要對其進行賦值,如果不賦值,也會有預設值,預設值參考第四天的內容
cat.name = "胖熊";
cat.age = 1 ;
cat.type = "英短";
獲取一條具體的資料
System.out.println(cat.name+cat.age+ "歲" +cat.type);
在給特徵賦值的時候,有可能會涉及到一些判斷,比如說,沒有負歲數的物件,所以,對其特徵賦值的時候,我們可以在類裡的歲數的特徵,對其進行判斷
set方法進行賦值的時候,引數本來就是給屬性複製的,賦值時候,變數名要加字尾,不能和屬性重名,這裡涉及一個區域性變數與全域性變數的重名問題
public void setAge(int age) {
if (age > 0){
this.age = age;
}else {
age = 0 ;
}
}
3 訪問許可權-修飾符
雖然我們對特徵進行判斷,但是在訪問特徵的時候,我們現在使用的方式是點訪問,就還是可以隨心所欲的將貓咪設成不可能是歲數。相對的,有另一種比較安全訪問private,這種修飾符下的特徵則需要通過特殊的方式進行訪問,就不會隨便接受不合理的賦值了
public class Cat {
private String name;
private int age;
private String type;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age > 0){
this.age = age;
}else {
age = 0 ;
}
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
public class Test01 {
public static void main(String[] args) {
Cat cat = new Cat();
cat.setName("胖熊");
cat.setAge(1);
cat.setType("英短 純白");
System.out.println(cat.getName()+cat.getAge()+ "歲" +cat.getType());
}
}
private修飾的特徵叫屬性,屬性私有化,給私有屬性賦值和取值的方式就是 set get
4 全域性變數與區域性變數
如果寫在類中特徵的屬性的作用範圍就是當前類——全域性變數 類中定義
如果變數在方法內定義或者方法引數上定義 作用範圍就是當前方法——區域性變數 方法中定義
區域性變數距離使用的變數近
全域性變數距離使用的變數遠
區域性變數是方法中的一個引數
全域性變數是類中的一個屬性
this關鍵字區別區域性變數和全域性變數 this.當前變數=值
在我們的案例中,現在使用的是哪個物件 this就是誰 ,誰現在呼叫了set方法 this就是誰
public void setAge(int age) {
if (age > 0){
this.age = age;
}else {
age = 0 ;
}
//類中的當前物件
System.out.println(this);
}
public static void main(String[] args) {
Cat cat = new Cat();
cat.setName("胖熊");
cat.setAge(1);
cat.setType("英短 純白");
//System.out.println(cat.getName()+cat.getAge()+ "歲" +cat.getType());
System.out.println(cat);
Cat cat1 = new Cat();
cat1.setAge(1);
System.out.println(cat1);
}
輸出:
Demo.Cat@1b6d3586
Demo.Cat@1b6d3586
Demo.Cat@4554617c
Demo.Cat@4554617c
5 toString
在上面的程式碼中,我們獲取一個物件的全部資料的時候,我們會自己拼接起來,實際上在java中,有一個toString方法,在物件被列印的時候,會被預設呼叫。
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
", age=" + age +
", type='" + type + '\'' +
'}';
}
public class Test01 {
public static void main(String[] args) {
Cat cat = new Cat();
cat.setName("胖熊");
cat.setAge(1);
cat.setType("英短 純白");
System.out.println(cat);
}
}
輸出:
Cat{name='胖熊', age=1, type='英短 純白'}
6 構造方法
只要我們創造了類,在類中就會有一個預設的無參構造方法,這個構造方法就是為了給我們進行物件的建立
public Cat() {
}
只要我們自己寫了構造方法,其預設的構造方法就會失效。
現在寫一個帶參的構造方法,有了這個構造方法,建立物件的時候,就會指引我們如何建立,我們就按照格式創造就可以,邊創造邊賦值。
//帶參構造方法
public Cat(String name, int age, String type) {
this.name = name;
this.age = age;
this.type = type;
}
Cat cat = new Cat("胖熊",1,"英短 純白");
7 方法過載
一個類中不能有兩個相同的方法,但是我們在創造物件的時候,不想要它因為我們的有參構造方法的存在而報錯,可以使用方法過載
在一個類中,方法名相同,引數列表不同 就是方法過載
引數列表不同可以是以下表現:
1、引數的個數不同 無參 有參
2、引數的順序不同 String int int String
3、引數的型別不同 int String