### 類(class)
java中只提供了基本數據類型,字符串,及一些數組,無法表示很多類型數據,比如學生:那么如何在java程序中表示一個Student?我們可以創建一個新的類型是就是Student,這就是類的功能。
**類是一種數據類型**
***
### 構造器
從類當中實例化出來的個體,我們稱之為對象,創建對象的語法為:**類名 對象(實例)名稱 = new 構造器();**
構造器的作用:
1.創建對象
2.為對象屬性進行初始化
#### **注意:一個類如果沒有寫任何構造器,這個類會默認提供一個空的無參構造器,一旦一個類有了任意一個構造器,默認的構造器將不再提供,創建對象時只能調用已經存在的構造器**
通過構造器的重載,可以在實例化對象的時候大大便利我們的開發
Person.java
~~~
public class Person {
String name;// 名字
String sex;// 性別
int age;// 年齡
// 構造器:1.創建對象,如果一個類沒有寫任何構造器,系統會默認提供一個空的無參構造器
// 一旦寫了有參構造器,默認構造器不再提供
// 2.直接給對象屬性賦值
public Person() {
}
public Person(String n,String s) {
name = n;
sex = s;
}
public Person(String n,String s,int a) {
name = n;
sex = s;
age = a;
}
public void updateName(String n) {
name = n;
}
public void updateAge(int a) {
if(a > 0) {
age = a;
}else {
System.out.println("error");
}
}
public void study(String subject) {
int num = 20;
System.out.println(name+"嗷嗷學"+subject);
}
}
~~~
Test.java
~~~
public class Test {
public static void main(String[] args) {
// 創建對象:類名 對象(實例)名稱 = new 構造器();
// Person p1 = new Person(); 無參構造器實例化
Person p1 = new Person("張三","男",16);// 有參構造器實例化
// 可以用對象調用到對象屬性和方法
p1.updateName("hello");
System.out.println(p1.name);
}
}
~~~
### 內存模型

**只有兩個引用指向堆區同一塊區域,才是同一個對象(上圖中p1,p2雖然屬性值完全一樣,但是因為指向區域不同,所以不是一個對象)**
***
### 對象作為參數及屬性
#### 小練習
**戰士PK**
Fighter.java 戰士類
~~~
/**
* 戰士類
* @author Administrator
*/
public class Fighter {
String name;// 角色名
int hp = 100;// 血量
int defend = 8;// 防御力
int level = 1;// 等級
int dps = 10;// 攻擊力
Weapon w = new Weapon("烏木劍", 4);// 武器
public Fighter(String n) {
name = n;
}
public Fighter(String n,Weapon w1) {
name = n;
w = w1;
}
/**
* 攻擊方法
* @param fighter 另一個戰士對象
*/
public void attack(Fighter f) {
// 判斷當前戰士是否有血
if(hp <= 0) {
System.out.println("您已經死亡,無法攻擊目標");
}else {
// 判斷對方是否有血
if(f.hp > 0) {
// 計算傷害
int damage = 0;
if(level + 10 <= f.level || dps + w.dps <= f.defend) {
// 對方等級超出自己10級,強制傷害為1點
damage = 1;
}else {
damage = (int)((dps + w.dps - f.defend)*((1-(f.level - level)*0.1)));
}
// 暴擊
double random = Math.random();
if(random < 0.4) {
damage *= 1.5;
System.out.print(name+"發動強力一擊,");
}
System.out.println(name+"手持"+w.name+"對"+f.name+"造成了"+damage+"點傷害");
f.hp = f.hp - damage;
if(f.hp < 0) {
f.hp = 0;
System.out.println(f.name+"陣亡了");
return;
}
System.out.println(f.name+"還有"+f.hp+"點血");
}else{
System.out.println("目標已經死亡,嚴禁鞭尸");
}
}
}
/**
* 升級
* @param money 充的金幣
*/
public void Uplevel(int money) {
if(money <= 0) {
System.out.println("不充錢玩聲明游戲");
}else {
int num = money/100;
level = level + num;
dps = dps + num * 8;
defend = defend + num * 3;
hp = hp + num * 30;
System.out.println(name+"升了"+num+"級,能力獲得很大提升!!!!!!!");
}
}
/**
* 回復
*/
public void drink() {
if(hp < 0) {
System.out.println("去死,喝不了");
return;
}
hp = 100 + (level - 1) * 30;
System.out.println(name+"滿血了,很牛b!");
}
}
~~~
Weapon.java 武器類
~~~
/**
* 武器
* @author Administrator
*
*/
public class Weapon {
String name;
int dps;
public Weapon(String n,int d) {
name = n;
dps = d;
}
}
~~~
FighterTest.java 測試類
~~~
public class FighterTest {
public static void main(String[] args) {
Weapon w1 = new Weapon("搟面杖", 12);
Weapon w2 = new Weapon("凳子", 11);
Fighter f1 = new Fighter("三季稻",w1);
Fighter f2 = new Fighter("李大花");
while(true) {
double num = Math.random();
// num小于0.5,f1攻擊f2
if(num < 0.5) {
double num1 = Math.random();
if(num1 < 0.1) {
f1.Uplevel(500);
}
if(num1 >= 0.1 && num1<= 0.2) {
f1.drink();
}
f1.attack(f2);
}else {
double num1 = Math.random();
if(num1 < 0.2) {
f2.Uplevel(500);
}
if(num1 >= 0.2 && num1<= 0.4) {
f2.drink();
}
f2.attack(f1);
}
if(f1.hp <= 0 || f2.hp <= 0) {
break;
}
}
}
}
~~~
***
### 匿名對象
~~~
// 匿名對象--只生效一次
new Person().age = 12;
~~~
***
### 垃圾回收機制(GC)
**沒有引用指向的對象JVM會視其為垃圾**,JVM會調用這個對象的finalize()釋放內存空間
~~~
// 如下代碼,堆區當中始終都只保留一個對象,之前生成的都被回收了
for(int i = 0;i <10000;i++) {
Person p = new Person();
}
~~~
***
### 棧(stack)內存模型--后進先出
先調用的方法,后執行完畢

***
### JavaBean(實體類)
1.有無參構造器(必要條件)--與框架相關
2.所有屬性私有--保護數據
3.公有的get和set方法--獲取修改數據
~~~
public class JavaBean {
private int num;
private String name;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
~~~