1. 程式人生 > >Java類(無參、有參構造方法、靜態變數)

Java類(無參、有參構造方法、靜態變數)

構造方法

作用:

初始化成員變數的

注意:

1.構造方法 沒有返回值 甚至不寫返回值的型別
2.構造方法的方法名 與類名 相同

書寫:

關鍵字 構造方法名(){
}

舉例:

建立cat類:

public class Cat {
    private String name;  //貓名
    private String color; //顏色
    private String kind;     //種類

    //  構造方法
    public Cat() {
        name = "小不花";
        color = "不花色"
; kind = "中華不田園貓"; System.out.println("我是貓類的構造方法"); } // 獲取貓名 public String getName() { return this.name; } // 修改貓名 public void setName(String name) { this.name = name; } // 獲取顏色 public String getColor() { return this.color; } // 修改顏色
public void setColor(String color) { this.color = color; } // 獲取種類 public String getKind() { return this.kind; } // 修改種類 public void setKing(String kind) { this.kind = kind; } // 會吃魚 public void eat() { System.out.println("會吃魚"); } // 會賣萌
public void cute() { System.out.println("會賣萌"); } // 會抓老鼠 public void catchMouse() { System.out.println("會抓老鼠"); } // 介紹自己 public void sayHi() { System.out.println(name); System.out.println(color); System.out.println(kind); } }

測試類:

public static void main(String[] args) {
    //  構造方法 如何呼叫
    //  構造方法是不用咱們呼叫的
    //  當你建立物件時 系統會幫你呼叫構造方法
    Cat cat = new Cat();
    //cat.setName("小花");
    //cat.setColor("花色");
    //cat.setKing("中華田園貓");
    cat.sayHi();

    Cat cat1 = new Cat();
    cat1.sayHi();
}

有參構造方法

注意:

不存在無參構造方法時 系統會提供無參構造方法

無參構造方法:

注意:

存在有參的構造方法時 系統不會提供無參的構造方法

書寫:

成員變數 -> 無參有參構造方法 -> set/get方法 -> 成員方法

舉例:

class Car{
    String name;
    int num;
    /*
     * 構造方法的過載:只跟引數有關
     * 當類中成員變數 需要計算時 可以在構造方法中完成
     */
    //  無參 構造方法
    public Car() {
        System.out.println("我是無參的構造方法");
    }

    //  有參 構造方法
    public Car(String name, int num) {
        //  初始化成員變數
        this.name = name;
        this.num = num;
        System.out.println("我是有參的構造方法");
    }

    public void sayHi() {
        System.out.println(name + "..." + num);
    }

    public void fun() {
        System.out.println("哈哈");
    }
}

測試:

public static void main(String[] args) {
    Car car = new Car();
    car.name = "法拉利";
    car.num = 911;
    car.sayHi();

    //  使用有參方法建立物件
    Car car2 = new Car("吉利金剛", 10);
    System.out.println(car2.name);

    //  在賦值成員變數時 使用哪種方法好?
    //  set方法 和 有參構造方法
    Car car3 = new Car("吉利美人豹", 11);
    //  使用構造方法修改車的名字 和 型號
    car3.sayHi();
}

舉例:

需求:

建立一個矩形類
計算周長 和 面積(都是整數就行)

要求:

無參有參構造方法 set/get方法
class Square {
    private int length;    //  長
    private int width;     //  寬
    private int perimeter; //  周長
    private int area;      //  面積

    //  無參構造
    public Square() {       
    }   
    //  有參構造
    public Square(int length, int width) {
        this.length = length;
        this.width = width;
        //  計算周長 和 面積
        this.perimeter = (this.length + this.width) * 2;
        this.area = this.length * this.width;
    }

    //  長 get方法
    public int getLength() {
        return this.length;
    }   
    //  長 set方法
    public void setLength(int length) {
        this.length = length;
    }

    //  寬 get方法
    public int getWidth() {
        return this.width;
    }
    //  寬 set方法
    public void setWidth(int width) {
        this.width = width;
    }

    //  周長 get方法
    //  建議:不要修改set和get方法的 寫法
    public int getPerimeter() {
        return this.perimeter;
    }
    //  周長 set方法
    public void setPerimeter(int perimeter) {
        this.perimeter = perimeter;
    }

    //  面積 get方法
    public int getArea() {
        return this.area;
    }
    //  面積 set方法
    public void setArea(int area) {
        this.area = area;
    }

    /*
    //  計算周長
    public int getPerimeter() {
        return(this.length + this.width) * 2;
    }
    //  計算面積
    public int getArea() {
        return this.length * this.width;
    }
    */
}

靜態變數和靜態方法

特點:

使用static修飾

靜態變數:

靜態變數儲存在方法區的靜態區(共享區)
靜態變數是共享的區間

呼叫:

1.物件呼叫
2.類名呼叫(推薦)
  推薦原因:只要載入了.class檔案 就載入靜態變數 這時還沒有物件產生

靜態變數(類變數)和 非靜態變數的(物件變數)區別

1.呼叫方式不同
  靜態變數:  物件或類名去呼叫(推薦 類名)
  非靜態變數:只能使用物件去呼叫
2.記憶體中存在位置不同
  靜態變數:  方法區的靜態區
  非靜態變數:堆記憶體
3.載入的是不同
  靜態變數:隨著類的載入而載入(不依賴物件而載入)
  非靜態變數:隨著物件的建立而建立(依賴物件)
4.生命週期不同
  靜態變數:  隨著類的銷燬而銷燬(相當於程式結束)
  非靜態變數:隨著物件銷燬而銷燬

舉例:

建立類

class Girl{
    String name;     //  姓名
    static String country;  //  國籍

    public void sayHi() {
        System.out.println(this.name + "..." + Girl.country);
    }
}

main中測試

public static void main(String[] args) {
    Girl girl1 = new Girl();
    girl1.name = "夏可可";
    Girl.country = "中國";
    girl1.sayHi();

    Girl girl2 = new Girl();
    girl2.name = "伊柯";
    girl2.sayHi();
}

圖片分析:

這裡寫圖片描述

總結步驟:

1.載入.class檔案(位元組碼檔案)到方法區
2.main方法入棧
3.要建立Girl的物件 先要載入 Girl.clss
  Girl.clss中分為 靜態區和非靜態區
  這時初始化靜態變數country初始值為null
4.建立物件(堆記憶體開闢空間)
5.把物件地址 賦值給 girl 變數 儲存
6.通過類名 修改 類變數的值
7.sayHi方法入棧 列印
8.sayHi出棧
9.main出棧

靜態方法

特點:

使用static修飾的方法
非靜態方法:
1.可以使用靜態變數 和 非靜態變數
2.可以使用靜態方法 和 非靜態方法

靜態方法:
1.只能使用靜態變數
2.只能使用靜態方法

舉例:

class Man {
    int num1 = 10;
    static int num2 = 5;
    //  非靜態方法 可以訪問 靜態變數 和 非靜態變數
    //  靜態方法 可以訪問啥?(加上靜態 相當於 隨著類改變 跟物件沒關係)
    public void fun() {
        System.out.println(num1);
        System.out.println(num2);
        //  呼叫靜態方法(類方法)推薦使用 類名調方法
        Man.sayHi();
    }

    public static void sayHi() {
        System.out.println("我是sayhi");
    }

    //  靜態方法
    //  靜態方法中 不能訪問 非靜態變數(因為載入類的時候 還沒有物件)
    //  簡單記:靜態只能使用靜態的
    public static void fun1() {
        //System.out.println(this.num1);
        System.out.println(Man.num2);
        sayHi();
    }
}
public static void main(String[] args) {
    Man man = new Man();
    man.fun();
    Man.fun1();

    /* 系統靜態方法
     * Math.random();
     * Arrays.toString();
     */
}

main解析

main就是為了讓jvm去呼叫的方法
public jvm呼叫這個方法 要使用最大許可權
static jvm呼叫時是不需要建立物件 直接使用類名調就行
main 不是關鍵字 jvm只認識main這個詞
String[] args 接收鍵盤輸入的值