1. 程式人生 > 其它 >JavaSE第六章、面向物件(上)

JavaSE第六章、面向物件(上)

JavaSE第六章、面向物件(上)

一、類與物件

  • 類是一個數據量型別,如:Cat類。

  • 類有屬性,有行為。

  • 物件就是一個具體的例項,如:老王的貓、老李的貓……

  • 從貓類到物件,目前有幾種說法:1.建立一個物件2.例項化一個物件……

public class test{
    public static void main(String[] args){
    	Cat cat1=new Cat();	//建立一個貓,並賦給Cat1.
    	cat1.name="小白";
    	cat1.age=1;
    	cat1.color="白色";
    	
    	System.out.println(cat1.name+" "+cat1.age+" "+cat1.color);
    }
}

class Cat{
    String name;
    int age;
    String color;
}

二、成員方法

修飾符 返回值型別 方法名(引數型別 引數名){
...
方法體
...
return 返回值;

}

public void cal(){
}
//public:公共類
//void:無返回值
//cal:方法名
//()內:形參列表
//{}內:方法體

方法呼叫

Java 支援兩種呼叫方法的方式,根據方法是否返回值來選擇。

  • 當方法返回一個值的時候,方法呼叫通常被當做一個值。

    eg:int larger = max(30, 40);

  • 如果方法返回值是void,方法呼叫一定是一條語句。

    System.out.println("歡迎訪問菜鳥教程!");

通過值傳遞引數

  • 呼叫一個方法時候需要提供引數,你必須按照引數列表指定的順序提供。

  • 方法被呼叫後,實參的值並沒有改變。

**遞迴呼叫 ***

//猴子吃桃問題
public class oop {
    public static void main(String[] args) {
        T t=new T();
        System.out.println(t.peach(1));
    }
}

class T{
    public int peach(int n) {
        if(n==10){
            return 1;
        }else if(n>=1 && n<=9){
            return ( peach(n+1)+1)*2;
        }else{
            System.out.println("無效日期");
            return -1;
        }
    }
}
//漢諾塔
public class HanoiTower {
    public static void main(String[] args){
        Tower tower=new Tower();
        tower.move(5,'A','B','C');
    }
}

class Tower{
    public void move(int num, char a, char b, char c){
        //若只有一個盤 num=1
        if(num == 1){
            System.out.println(a+"->"+c);
        }else{
            //若有多個盤,一律視為兩個整體,最下面的盤(1)和上面的所有盤(num-1)
            //1.移動上面的盤 a->c->b
            move(num-1,a,c,b);
            //2.最下面的盤a->c
            System.out.println(a+"->"+c);
            //3.b上的所有盤b->a->c
            move(num-1,b,a,c);
        }
    }
}

三、overload

  • 一個類的兩個方法擁有相同的名字,但是有不同的引數列表。Java編譯器根據方法簽名判斷哪個方法應該被呼叫。

  • 過載的方法必須擁有不同的引數列表。不能僅僅依據修飾符或者返回型別的不同來過載方法。

四、可變引數

  • 引數數量可變

  • 將同一個類中多個同名同功能引數個數不同的方法,封裝成一個方法。

typeName... parameterName

在方法宣告中,在指定引數型別後加一個省略號(...) 。

  • 一個方法中只能指定一個可變引數,它必須是方法的最後一個引數,個數可以是(0~n)。任何普通的引數必須在它之前宣告。
  • 使用可變引數時,可以當作陣列來使用。(可變引數的本質就是陣列)
public int sum(int... nums){
    System.out.println("nums.length");
    int res=0;
    for(int i=0;i<nums.length;i++){
        res+=nums[i];
    }
    return res;
}

五、作用域

  • 方法內定義的變數被稱為區域性變數。

  • 區域性變數的作用範圍從宣告開始,直到包含它的塊結束。

  • 方法的引數範圍涵蓋整個方法。引數實際上是一個區域性變數。

注意事項

  • 全域性變數/屬性可以加修飾符
  • 區域性變數不可以加修飾符

六、構造器/構造方法

  • 當一個物件被建立時候,構造方法用來初始化該物件。構造方法和它所在類的名字相同,但構造方法沒有返回值

  • 通常會使用構造方法給一個類的例項變數賦初值

  • Java 自動提供了一個預設構造方法,預設構造方法的訪問修飾符和類的訪問修飾符相同。一旦你定義了自己的構造方法,預設構造方法就會失效

// 一個簡單的建構函式
class MyClass {
  int x;
 
  // 以下是建構函式
  MyClass() {
    x = 10;
  }
}

public class test {
   public static void main(String[] args) {
      MyClass t1 = new MyClass();
      MyClass t2 = new MyClass();
      System.out.println(t1.x + " " + t2.x);
      //輸出:10 10
   }
}
// 一個簡單的建構函式
class MyClass {
  int x;
 
  // 以下是建構函式(有引數的構造方法)
  MyClass(int i ) {
    x = i;
  }
}

public class ConsDemo {
  public static void main(String[] args) {
    MyClass t1 = new MyClass( 10 );
    MyClass t2 = new MyClass( 20 );
    System.out.println(t1.x + " " + t2.x);
    //輸出:10 20
  }
}

七、this

java虛擬機器給每個物件分配this,代表當前物件。

訪問成員方法的語法:this.方法名(引數列表);
訪問構造器的語法:this(引數列表);⚠️只能在構造器內使用(即只能再構造器中訪問另外一個構造器,且必須放在第一條語句。)

注意事項

  • this可以訪問本類的屬性、方法、構造器
  • this用於區分當前類的屬性和區域性變數
  • this不能在類定義的外部使用,只能在類定義的方法中使用

繼承中會有更多this的細節。

//小練習:比較兩個人是不是同一個人
public class thisTest {
    public static void main(String[] args) {
        Person p1 = new Person("mary", 28);
        Person p2 = new Person("tom", 18);
        System.out.println(p1.compare(p2));
    }
}

class Person{
    String name;
    int age;

    public Person(String name, int age){
        this.name=name;
        this.age=age;
    }

    public boolean compare(Person p){
        return this.name.equals(p.name) && this.age==p.age;
    }
}