### 类(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);
}
}
~~~
### 内存模型
![](https://box.kancloud.cn/f1d5d006946d362c76cb96d01b350b5f_854x517.png)
**只有两个引用指向堆区同一块区域,才是同一个对象(上图中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)内存模型--后进先出
先调用的方法,后执行完毕
![](https://box.kancloud.cn/71a95f46e1e035a9f721afb68b8017c6_447x279.png)
***
### 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;
}
}
~~~