Java類(無參、有參構造方法、靜態變數)
阿新 • • 發佈:2018-12-31
構造方法
作用:
初始化成員變數的
注意:
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 接收鍵盤輸入的值