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;
}
}