Java學習-第一部分-第一階段-第六節:面向對象編程(基礎)

来源:https://www.cnblogs.com/wenjie2000/archive/2022/07/14/16479339.html
-Advertisement-
Play Games

面向對象編程(基礎) 類與對象 ●使用現有技術解決 張老太養了兩隻貓貓:一隻名字叫小白,今年3歲,白色。還有一隻叫小花,今年100歲,花色。請編寫一個程式,當用戶輸入小貓的名字時,就顯示該貓的名字,年齡,顏色。如果用戶輸入的小貓名錯誤,則顯示張老太沒有這隻貓貓。 1)單獨的定義變數解決 2)使用數組 ...


面向對象編程(基礎)

類與對象

●使用現有技術解決

張老太養了兩隻貓貓:一隻名字叫小白,今年3歲,白色。還有一隻叫小花,今年100歲,花色。請編寫一個程式,當用戶輸入小貓的名字時,就顯示該貓的名字,年齡,顏色。如果用戶輸入的小貓名錯誤,則顯示張老太沒有這隻貓貓。

1)單獨的定義變數解決
2)使用數組解決

//單獨變數來解決=>平利於數據的管理
//第1只貓信息
String cat1Name = "小白";
int cat1Age = 3;
String cat1Color ="白色";
//第2只貓信息
String cat2Name = "小花";int cat2Age = 100;
String cat2Color ="花色";
//數組===>(1)數據類型體現不出來(2)只能通過[下標]獲取信息,造成變數名字和內容
//   的對應關係不明確(3)不能體現貓的行為
//第1只貓信息
String[] cat1 = {"小白","3","白色"};
String[] cat2 ={"小花","100","花色"};

●現有技術解決的缺點分析

不利於數據的管理
效率低
===》 引出我們的新知識點類與對象哲學,道家思想
java設計者引入類與對象(OOP),根本原因就是現有的技術,不能完美的解決新的新的需求.

●類與對象的關係示意圖

image

●上圖說明
註意:從貓類到對象,目前有幾種說法:1.創建一個對象⒉.實例化一個對象3.把類實例化...
當然:上面的貓也可是魚、狗、人... java最大的特點就是面向對象。

public class HelloWorld{
    public static void main(String []args){
        //1. new Cat()創建一隻貓
        //2.Cat cat1 = new Cat();把創建的貓賦給cat1
        //3. cat1就是一個對象
        Cat cat1 = new Cat();
        cat1.name ="小白";
        cat1.age = 3;
        cat1.color ="白色";
        //創建了第二只貓,並賦給cat2
        // cat2 也是一個對象(貓對象)
        Cat cat2 = new Cat();
        cat2.name ="小花";
        cat2.age = 100;
        cat2.color ="花色";

        //怎麼訪問對象的屬性呢
        System.out.println("第1只貓信息" + cat1.name +" " +cat1.age + " "+ cat1.color);
        System. out.println("第2只貓信息"+ cat2.name +" " + cat2.age + " " + cat2.color);
    }
}
//使用面向對象的方式來解決養貓問題
//
//定義一個貓類Cat ->自定義的數據類型
class Cat {
    //屬性
    String name;//名字
    int age;//年齡
    String color;//顏色
    //行為
}

●類和對象的區別和聯繫

通過上面的案例和講解我們可以看出:

  1. 類是抽象的,概念的,代表一類事物,比如人類,貓類.…,即它是數據類型.
  2. 對象是具體的,實際的,代表一個具體事物,即是實例.
  3. 類是對象的模板,對象是類的一個個體,對應一個實例.

image

屬性/成員變數

基本介紹

  1. 從概念或叫法上看:成員變數=屬性= field(欄位)(即成員變數是用來表示屬性的,授課中,統一叫屬性)。例如: Car(name,price,color)
  2. 屬性是類的一個組成部分,一般是基本數據類型,也可是引用類型(對象,數組)。比如我們前面定義貓類的int age就是屬性。

註意事項和細節說明

  1. 屬性的定義語法同變數,示例:訪問修飾符屬性類型屬性名;

  2. 屬性的定義類型可以為任意類型,包含基本類型或引用類型

  3. 屬性如果不賦值,有預設值,規則和數組一致。

如何創建對象

  1. 先聲明再創建
    Cat cat ;
    cat = new Cat();
  2. 直接創建
    Cat cat = new Cat();

如何訪問屬性

●基本語法

對象名.屬性名;

案例演示賦值和輸出

cat.name ;
cat.age;
cat.color;

類和對象的記憶體分配機制(重要)

●看一個思考題
我們定義一個人類(Person)(包括名字,年齡)。

//我們看看下麵一段代碼:
Person p1=new Person();
p1.age=10;
p1.name="小明";
Person p2=p1;//把p1賦給了p2, 讓p2指向p1
System.out.println(p2.age);
//請問:p2.age究竟是多少?並畫出記憶體圖:
//10

image

●Java記憶體的結構分析
1.棧:一般存放基本數據類型(局部變數)
2.堆:存放對象(Cat cat,數組等)
3.方法區:常量池(常量,比如字元串),類載入信息
4.示意圖[Cat (name, age, price)

●Java創建對象的流程簡單分析

Person p = new Person();
p.name = "jack” ;
p.age = 10

1.先載入Person類信息(屬性和方法信息,只會載入一次)
2在堆中分配空間,進行預設初始化(看規則)
3.把地址賦給p,p就指向對象
4.進行指定初始化,比如p.name =" jack" p.age = 10

●看一個練習題,並分析畫出記憶體佈局圖,進行分析

//我們看看下麵一段代碼,會輸出什麼信息:
Person a=new Person();
a.age=10;
a.name="小明";
Person b;
b=a;
System.out.println(b.name);
b.age=200;
b = null;
System.out.println(a.age);
System.out.println(b.age);
/*
小明
200
b.age會出現異常.
*/

image

成員方法

基本介紹

在某些情況下,我們要需要定義成員方法(簡稱方法)。比如人類:除了有一些屬性外(年齡,姓名..),我們人類還有一些行為比如:可以說話、跑步..,通過學習,還可以做算術題。這時就要用成員方法才能完成。現在要求對Person類完善。

●成員方法快速入門

  1. 添加speak成員方法,輸出我是一隻好人

  2. 添加cal01成員方法,可以計算從1+...+1000的結果

  3. 添加cal02成員方法,該方法可以接收一個數n,計算從1+...+n 的結果

  4. 添加getSum成員方法,可以計算兩個數的和

    public class HelloWorld{
        public static void main(String []args){
            //方法使用
            //1方法寫好後,如果不去調用(使用),不會輸出
            //2.先創建對象,然後調用方法即可
            Person p1 = new Person();
            p1.speak();//調用方法
            p1.cal01();//調用cal01方法
            p1.cal02(5);//調用cal02方法
            //調用getSum方法,同時num1=10, num2=20
            //把方法 getsum返回的值,賦給變數 returnRes
            int returnRes = p1.getSum(10,20);
            System.out.println("getsum方法返回的值=" + returnRes);
        }
    }
    
    class Person {
        String name;
        int age;
        //方法(成員方法)
        //添加speak成員方法,輸出“我是一個好人”
        //解讀
        //1.public 表示方法是公開
        //2.void :表示方法沒有返回值
        //3.speak() : speak是方法名,()形參列表
        //4.方法體,可以寫我們要執行的代碼
        //5.System.out.println("我是一個好人");表示我們的方法就是輸出一句話
        public void speak(){
            System.out.println("我是一個好人");
        }
        //添加cal01 成員方法,可以計算從1+..+1000的結果
        public void cal01(){
            //迴圈完成
            int res = 0;
            for(int i = 1; i <= 1000; i++) {
                res += i;
            }
            System.out.println("計算結果=" + res);
        }
        //添加cal02成員方法,該方法可以接收一個數n,計算從1+...+n的結果
        //解讀
        //1. (int n)形參列表,表示當前有一個形參n,可以接收用戶輸入
        public void cal02(int n){
            //迴圈完成
            int res = 0;
            for(int i = 1; i <= n; i++){
                res += i;
            }
            System.out.println("cal02計算結果="+ res);
        }
        //添加getsum成員方法,可以計算兩個數的和//老韓解讀
        //1. public 表示方法是公開的
        //2. int :表示方法執行後,返回一個int 值
        // 3. getsum方法名
        //4. (int num1, intTum2)形參列表,2個形參,可以接收用戶傳入的兩個數
        public int getSum(int num1, int num2) {
            int res = num1 +num2;
            return res;
        }
    }
    

● 方法的調用機制原理:(重要!-示意圖)

提示:畫出程式執行過程[getSum]+說明

image

方法調用小結

  1. 當程式執行到方法時,就會開闢一個獨立的空間(棧空間)
  2. 當方法執行完畢,或者執行到return語句時,就會返回
  3. 返回到調用方法的地方
  4. 返回後,繼續執行方法後面的代碼

為什麼需要成員方法

●看一個需求:
請遍歷一個數組,輸出數組的各個元素值。
✔解決思路1,傳統的方法,就是使用單個for迴圈,將數組輸出,大家看看問題是什麼?
✔解決思路2:定√義一個類 MyTools ,然後寫一個成員方法,調用方法實現,看看效果又如何。

成員方法的好處

✔提高代碼的復用性
✔可以將實現的細節封裝起來,然後供其他用戶來調用即可.

成員方法的定義

訪問修飾符 返回數據類型 方法名 (形參列表..){//方法體
語句;
return 返回值;
}

  1. 形參列表:表示成員方法輸入 cal(int n),getSum(int num1, int num2)
  2. 返回數據類型:表示成員方法輸出;void表示沒有返回值
  3. 方法主體:表示為了實現某一功能代碼塊
  4. return 語句不是必須的。
  5. 提示:結合前面的題示意圖,來理解

註意事項和使用細節

●訪問修飾符(作用是控制方法使用的範圍)
可選,[有四種:?],具體在後面說

●返回類型

  1. 一個方法最多有一個返回值[思考,如何返回多個結果?]
  2. 返回類型可以為任意類型,包含基本類型或引用類型(數組,對象)
  3. 如果方法要求有返回數據類型,則方法體中最後的執行語句必須為return值;而且要求返回值類型必須和return的值類型一致或相容(返回數據支持自動類型轉換)
  4. 如果方法是void,則方法體中可以沒有return語句,或者只寫 return;

●方法名
遵循駝峰命名法,最好見名知義,表達出該功能的意思即可,比如得到兩個數的和getSum,開發中按照規範

●形參列表

  1. 一個方法可以有0個參數,也可以有多個參數,中間用逗號隔開,比如getSum(int n1,int n2)
  2. 參數類型可以為任意類型,包含基本類型或引用類型,比如printArr(int[][] map)
  3. 調用帶參數的方法時,一定對應著參數列表傳入相同類型或相容類型的參數! 【getSum】(傳入數據支持自動類型轉換)
  4. 方法定義時的參數稱為形式參數,簡稱形參;方法調用時的參數稱為實際參數,簡稱實參,實參和形參的類型要一致或相容、個數、順序必須一致![演示]

●方法體
裡面寫完成功能的具體的語句,可以為輸入、輸出、變數、運算、分支、迴圈、方法調用,但裡面不能再定義方法!即:方法不能嵌套定義。[演示]

註意事項和使用細節

●方法調用細節說明

  1. 同一個類中的方法調用:直接調用即可。比如print(參數);案例演示:A類 sayOk調用print()
  2. 跨類中的方法A類調用B類方法:需要通過對象名調用。比如對象名.方法名(參數);案例演示:B類 sayHello 調用print()
  3. 特別說明一下:跨類的方法調用和方法的訪問修飾符相關,先暫時這麼提一下,後面我們講到訪問修飾符時,還要再細說。

成員方法傳參機制

方法的傳參機制對我們今後的編程非常重要,一定要搞的清清楚楚明明白白。我們通過案例來學習。

●基本數據類型的傳參機制

public class HelloWorld{
    public static void main(String []args){
        int a = 10;int b = 20;
        //創建AA對象名字 obj
        AA obj = new AA();
        obj.swap(a,b);//調用swap
        System.out.println( "main方法a=" +a+ " b=" + b); //a=10 b=20
    }
}
class AA {
//同一個類中的方法調用:直接調用即可/ /
    public void swap(int a,int b) {
        System.out. println("\na和b交換前的值\na=" + a + "\tb=" + b);//a=10 b=20
        //完成了a 和b的交換
        int tmp = a;
        a = b;
        b = tmp;
        System.out.println("\na和b交換後的值\na=" + a + "\tb=" + b);//a=20 b=10
    }
}
//swap方法會創建不同的棧。其中的變數a,b所對應的地址也不同,因此不會改變。

●引用數據類型的傳參機制

  1. 看一個案例
    B類中編寫一個方法test100,可以接收一個數組,在方法中修改該數組,看看原來的數組是否變化?
public class HelloWorld{
    public static void main(String []args){
        //測試
        B b = new B();
        int[ ] arr = {1,2,3};
        b.test100(arr);//調用方法
        System.out. println( " main的arr數組");//逼曆數組
        for(int i = 0; i < arr. length; i++) {
        System.out.print(arr[i] +"\t");
        }
        System.out.println();
    }
}

class B {
    //B類中編寫一個方法test100,
    //可以接收一個數組,在方法中修改該數組,看看原來的數組是否變化
    public void test100(int[] arr) {
        arr[0] = 200;//修改元素
        //遍曆數組
        System.out.println( "test100的arr數組");
        for(int i = 0; i <arr. length; i++){
            System.out.print(arr[i] +"\t");
        }
    }
}
//數組為應用類型,調用test100產生新棧時傳入的是arr在堆中的地址而不是拷貝數組,因此修改arr時是對同一空間進行操作。所以會改變
  1. B類中編寫一個方法test200,可以接收一個Person(age,sal)對象,在方法中修改該對象屬性,看看原來的對象是否變化? //會變化
// import java.util.Scanner;
public class HelloWorld{
    public static void main(String []args){
        B b = new B();
        Person p = new Person();
        p.name = "jack" ;
        p.age = 10;
        b.test200(p);
        System.out.println( "main的p.age=" + p.age);
    }
}
class Person {
        String name;
        int age;
    }
class B {
    public void test200 (Person p) {
        p.age = 10000;//修改對象屬性
    }        
}
  1. 再看一個案例,下麵的方法會對原來的對象有影響嗎?
    在test200方法中設置p=null 和p = new Person();
    //結果不變,main中p. age為10。因為此處只是修改test200開闢的棧中的p的指向,並未改變main中p的指向。

方法遞歸調用(難點,為演算法入門,可占時跳過)

●基本介紹
簡單的說:遞歸就是方法自己調用自己,每次調用時傳入不同的變數.遞歸有助於編程者解決複雜問題,同時可以讓代碼變得簡潔

遞歸能解決什麼問題?

  1. 各種數學問題如:8皇後問題,漢諾塔,階乘問題,迷宮問題,球和籃子的問題(google編程大賽)[經典問題,網上答案很多]
  2. 各種演算法中也會使用到遞歸,比如快排,歸併排序,二分查找,分治演算法等.3.將用棧解決的問顆-->詳歸代碼比較簡潔

●八皇後問題說明
八皇後問題,是一個古老而著名的問題,,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯·貝瑟爾於1848年提出:在8×8格的國際象棋上擺放八個皇後,使其不能互相攻擊,即:任意兩個皇後都不能處於同一行、同一列或同一斜線上,問有多少種擺法。

/*
●八皇後思路分析,老韓說下
1)第一個皇後先放第一行第一列
2)第二個皇後放在第二行第一列、然後判斷是否OK,如果不OK,繼、續放在第二列、第三列、依次把所有列都放完,找到一個合適
3)繼續第三個皇後,還是第一列、第二列.…..直到第8個皇後也能放在一個不衝突的位置,算是找到了一個正確解
4)當得到一個正確解時,在棧回退到上一個棧時,就會開始回溯,即將第一個皇後,放到第一列的所有正確解,全部得到.
5)然後回頭繼續第一個皇後放第二列,後面繼續迴圈執行1,2.3.4的步驟

說明:理論上應該創建一個二維數組來表示棋盤,但是實際上可以通過演算法,用一個一維數組即可解決問題. arr[8] ={0,4, 7,5.2,6,1,3}//對應arr下標表示第幾行,即第幾個皇後,arri] = val , val表示第i+1個皇後,放在第i+1行的第val+1列
*/
public class HelloWorld{
    public static void main(String []args){
        B b = new B();
        int huang[]=new int[8];
        System.out.println(b.test200(huang,0));
    }
}
class B {
    public int test200 (int[] huang,int i) {
        if(i>7){
            return 1;
        }else{
            int m=0;
            for(int j=1;j<=8;j++){
                if(aa(huang,j,i)){//不衝突
                    huang[i]=j;
                    m+=test200(huang, i+1);
                }
            }
            return m;
        }
    }
    public boolean aa(int[] huang,int a,int b){//是否已經存在
        for(int i=0;i<b;i++){
            if(a==huang[i] || (a-huang[i]==b-i) || (a-huang[i]==i-b)){
                return false;
            }
        }
        return true;
    }
}

方法重載(overload)

●基本介紹
java中允許同一個類中,多個同名方法的存在,但要求形參列表不一致!比如:System.out.println); out是PrintStream類型

●重載的好處

  1. 減輕了起名的麻煩
  2. 減輕了記名的麻煩

●快速入門案例

public class HelloWorld{
    public static void main(String []args){
        MyCalculator mc = new MyCalculator();
        System.out.println(mc.calculate(1,2));
        System.out.println(mc.calculate(1,2.1));
    }
}
class MyCalculator {
    //下麵的四個calculate方法構成了重載
    //兩個整數的和
    public int calculate(int n1, int n2){
        return n1 +n2;
    }
    //一個整數,一個double的和
    public double calculate(int n1,double n2) {
        return n1 + n2;
    }
    //一個double ,一個工t和
    public double calculate(double n1,int n2) {
        return n1 + n2;
    }
    //三個int的和
    public int calculate(int n1,int n2,int n3) {
        return n1 + n2 + n2;
    }
}

●註意事項和使用細節

  1. 方法名:必須相同
  2. 參數列表:必須不同(參數類型或個數或順序,至少有一樣不同,參數名無要求)
  3. 返回類型:無要求

可變參數

●基本概念
java允許將同一個類中多個同名同功能但參數個數不同的方法,到裝成一個方法。就可以通過可變參數實現

●基本語法
訪問修飾符 返回類型 方法名(數據類型... 形參名){
}

●快速入門案例

public class HelloWorld{
    public static void main(String []args){
        HspMethod m = new HspMethod();
        int sum=m.sum(1,5,100);
        System.out.println(sum);
    }
}
class HspMethod {
    //1. int...表示接受的是可變參數,類型是int ,即可以接收多個1nt(0-多)
    //2。使用可變參數時,可以當做數組來使用即nums可以當做數組
    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;
    }
}

●註意事項和使用細節

  1. 可變參數的實參可以為0個或任意多個。
  2. 可變參數的實參可以為數組。
  3. 可變參數的本質就是數組.
  4. 可變參數可以和普通類型的參數一起放在形參列表,但必須保證可變參數任最後
  5. 一個形參列表中只能出現一個可變參數
//細節:可變參數可以和普通類型的參數一起放在形參列表,但必須保證可變參數在最後
public void f2(String str,doubLe... nums) {
}
//細節:一個形參列表中只能出現一個可變參數//下麵的寫法是錯的·
// public void f3(int. .. nums1,double. . . nums2) {}

作用域

●基本使用
面向對象中,變數作用域是非常重要知識點,相對來說不是特別好理解,要求深刻掌握變數作用域。

  1. 在java編程中,主要的變數就是屬性(成員變數)和局部變數。
  2. 我們說的局部變數一般是指在成員方法中定義的變數。【舉例Cat類:cry)
  3. Java中作用域的分類
    全局變數:也就是屬性,作用域為整個類體Cat類:cry eat等方法使用屬性
    局部變數:也就是除了屬性之外的其他變數,作用域為定義它的代碼塊中!
  4. 全局變數(屬性)可以不賦值,直接使用,因為有預設值,局部變數必須賦值後,才能使用,因為沒有預設值。

註意事項和細節使用

  1. 屬性和局部變數可以重名,訪問時遵循就近原則。
  2. 在同一個作用域中,比如在同一個成員方法中,兩個局部變數,不能重名。
  3. 屬性生命周期較長,伴隨著對象的創建而創建,伴隨著對象的銷毀而銷毀。局部變數,生命周期較短,伴隨著它的代碼塊的執行而創建,伴隨著代碼塊的結束而銷毀。即在一次方法調用過程中。\
class Person {
    String name = "jack";
    public void say() {
        //細節屬性和局部變數可以重名,訪問時遵循就近原則
        String name= "king";
        System.out. println( "say() name=" +name);
    }
    public void hi(){
        String address ="北京";
        // String address =“上海";//錯誤,重覆定義變數
        String name= "hsp";
    }
}
  1. 作用域範圍不同
    全局變數/屬性:可以被本類使用,或其他類使用(通過對象調用)
    局部變數;只能在本類中對應的方法中使用
  2. 修飾符不同
    全局變數/屬性可以加修飾符
    局部變數不可以加修飾符

構造方法/構造器

●看一個需求
我們來看一個需求:前面我們在創建人類的對象時,是先把一個對象創建好後,再給他的年齡和姓名屬性賦值,如果現在我要求,在創建人類的對象時,就直接指定這個對象的年齡和姓名,該怎麼做?這時就可以使用構造器。

●基本語法
[修飾符] 方法名(形參列表){
方法體;
}

說明:

  1. 構造器的修飾符可以預設
  2. 構造器沒有返回值
  3. 方法名和類名字必須一樣
  4. 參數列表和成員方法一樣的規則
  5. 構造器的調用系統完成

基本介紹
構造方法又叫構造器(constructor),是類的一種特殊的方法,它的主要作用是完成對新對象的初始化。它有幾個特點:

  1. 方法名和類名相同
  2. 沒有返回值
  3. 在創建對象時,系統會自動的調用該類的構造器完成對象的初始化。

快速入門
現在我們就用構造方法來完成剛纔提出的問題:在創建人類的對象時,就直接指定這個對象的年齡和姓名

public class HelloWorld{
    public static void main(String []args){
        //當我們new 一個對象時,直接通過構造器指定名字和年齡
        Person p1 = new Person( "smith",80);
        System.out.println( "p1的信息如下");
        System.out.println( "p1對象name=" + p1.name); // smith
        System.out.println( "p1對象age=" + p1.age);//80
    }
}
//在創建人類的對象時,就直接指定這個對象的年齡和姓名
//
class Person {
    String name;
    int age;
    //構造器//老韓解讀
    //1。構造器沒有返回值,也不能寫void
    //2。構造器的名稱和類Person—樣
    //3.(String pName, int pAge)是構造器形參列表,規則和成員方法―樣
    public Person(String pName, int pAge){
        System.out.println("構造器被調用~~完成對象的屬性初始化");
        name = pName;
        age = pAge;
    }
    public Person(String pName){
        System.out.println("構造器重載---");
        name = pName;
    }
}

●註意事項和使用細節

  1. 一個類句以定義多個不同的構造器,即構造器重載
    比如:我們可以再給Person類定義一個構造器,用來創建對象的時候,只指定人名,不需要指定年齡
  2. 構造器名和類名要相同3.構造器沒有返回值
  3. 構造器是完成對象的初始化.並不是創建對象
  4. 在創建對象時,系統自動的調用該類的構造方法
  5. 如果程式員沒有定義構造器,系統會自動給類生成一個預設無參構造器(也叫預設構造器),比如Dog (){},使用javap指令反編譯看看
  6. 一旦定義了自己的構造器,預設的構造器就覆蓋了,就不能再使用預設的無參構造器,除非顯式的定義一下,即: Person(){}

this

●先看一段代碼,並分析問題

public class HelloWorld{
    public static void main(String []args){
        Dog dog1 = new Dog("大壯",3);
        dog1.info();
    }
}
class Dog{//類
    String name;
    int age;
    // public Dog (String dName,int dAge){//構造器/ /name = dName;
    //age = dAge;/ / }
    //如果我們構造器的形參,能夠直接寫成屬性名,就更好了
    //但是出現了一個問題,根據變數的作用域原則
    //構造器的name是局部變數,而不是屬性
    //構造器的age是局部變數,而不是屬性
    //==>引出this關鍵字來解決
    public Dog (String name, int age){//構造器
        name = name;
        age = age;
    }
    public void info(){//成員方法,輸出屬性×信息
        System.out.println(name + "\t" +age + "\t");
    }
}

●什麼是this

java虛擬機會給每個對象分配this,代表當前對象。

●使用this解決前面變數命名問題

public class HelloWorld{
    public static void main(String []args){
        Dog dog1 = new Dog("大壯",3);
        dog1.info();
    }
}
class Dog{//類
    String name;
    int age;
    // public Dog (String dName,int dAge){//構造器/ /name = dName;
    //age = dAge;/ / }
    //如果我們構造器的形參,能夠直接寫成屬性名,就更好了
    //但是出現了一個問題,根據變數的作用域原則
    //構造器的name是局部變數,而不是屬性
    //構造器的age是局部變數,而不是屬性
    //==>引出this關鍵字來解決
    public Dog (String name, int age){//構造器
        //this.name就是當前對象的屬性name
        this.name = name;
        //this.age就是當前對象的屬性age
        this.age = age;
    }
    public void info(){//成員方法,輸出屬性×信息
        System.out.println(name + "\t" +age + "\t");
    }
}

this小結:簡單的說,哪個對象調用,this就代表哪個對象

this的註意事項和使用細節

  1. this關鍵字可以用來訪問本類的屬性、方法、構造器

  2. this用於區分當前類的屬性和局部變數

class Dog{//類
  String name;
  int age;
  public Dog (String name, int age){//構造器
      //this.name就是當前對象的屬性name
      this.name = name;
      //this.age就是當前對象的屬性age
      this.age = age;
  }
}
  1. 訪問成員方法的語法:this.方法名(參數列表);註意:訪問構造器語法:this(參數列表);必須放置第一條語句

    /*
    細節:訪問構造器語法:this(參數列表);
    註意只能在構造器中使用(即只能在構造器中訪問另外一個構造器)
    註意:訪問構造器語法:this(參數列表);必須放置第一條語句
    */
    public T(){
        this("jack",100);//這裡去訪問 T(String name,int age)
    	System.out.print1n("T()構造器");
    }
    public T(String name, int age) {
        System.out.println("T(String name,int age)構造器");
    }
    
  2. 訪問構造器語法:this(參數列表);註意只能在構造器中使用5. this不能在類定義的外部使用,只能在類定義的方法中使用。

●this的課堂案例
定義Person類,裡面有name、age屬性,並提供compareTo比較方法,用於判斷是否和另一個人相等,提供測試類TestPerson用於測試名字和年齡完全一樣,就返回true,否則返回false

public class HelloWorld{
    public static void main(String []args){
        Person p1 =new Person( "mary" ,20);
        Person p2 =new Person( "smith", 30);
        System.out.println(p1.compareTo(p2));
    }
}
class Person{//類
    String name;
    int age;
    public Person(String name,int age){
        this.name=name;
        this.age=age;
    }
    public boolean compareTo(Person p){
        return (this.name.equals(p.name)&& this.age==p.age);
    }
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 想要一款專業且易用的代碼文本編輯器?小編今天為大家推薦BBEdit Mac版。BBEdit Mac版是專業的HTML文本編輯器,提供豐富的功能,用於編輯,搜索和處理散文,源代碼和文本數據。 詳情:BBEdit for Mac(專業HTML文本編輯器) 功能特色 1、對文本進行全面控制 - 在任何Au ...
  • 準備工作 下載 electron-v9.4.4-win32-ia32.zip https://npm.taobao.org/mirrors/electron/9.4.4/electron-v9.4.4-win32-ia32.zip 解壓放到 C:\Users\Admin\AppData\Local\ ...
  • 在使用樹形節點或級聯組件時常常會碰到根據id處理數據的情況 下麵為大家簡單介紹關於節點遞歸增刪改查方法 根據目標id刪除指定節點 /** * 根據目標id刪除指定節點 * @param {*} list 數據源 * @param {*} targetId 目標id */ function delet ...
  • JavaScript進階知識點——函數和對象詳解 我們在上期內容中學習了JavaScript的基本知識點,今天讓我們更加深入地瞭解JavaScript JavaScript函數 JavaScript函數和Java函數是有一部分相似的,所以學習起來也會相對簡單 基本構造 1.直接構造 //functi ...
  • 當前工作區內的文件如下 首先當然是安裝 yarn,此命令可在任何地方執行 npm install -g yarn 查看版本,會發現版本並不是 3.因為版本 1 是經典版 升級 yarn,此命令在你的工作區根目錄運行 註意:這個升級操作不會影響你的其他項目 yarn set version berry ...
  • 剛學習完Java SE,不知道怎麼寫項目?不知道寫什麼項目?本篇文章將線上ATM詳細架構設計分享出來,幫助初學者開發項目。 ...
  • 原文鏈接:全網最新的nacos 2.1.0集群多節點部署教程-語雀 基本信息 進度整理中 版本 2.1.0 版本發佈日期 2022-04-29 git revision number b584531331cc95054964ba4e33984f4cab9e582d 編寫日期 2022-07-04~ ...
  • 苦惱於Python運行時感人的速度,我決定學習C++。 為了激勵我自己好好地學習這門未曾謀面的編程語言,我決定在此開設專欄:C++學習日記。希望在讀者們的監督下,我可以早日掌握這門語言。當然,如果那位大佬願意賜教,在下也是感激不盡。 2022年7月14日 由於懶得安裝編譯環境,我找了一個線上編程的網 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...