今天写一个文字游戏:用到了javabean类,面向对象的方法.
还记得标准的javabean类的要求吗:
1:类名需要见名知意
2:成员变量需要使用private进行修饰
3:至少提供两个构造方法
(1)无参构造方法
(2)带全部参数的构造方法
4:成员方法
(1)提供每一个成员变量对应的setXxx()/getXxx
(2)如果还有其他行为还要写上
import java.util.Random;
public class Role {
// 属性
private String name;
private int blood;
public Role() {
}
public Role(String name, int blood) {
this.name = name;
this.blood = blood;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getBlood() {
return blood;
}
public void setBlood(int blood) {
this.blood = blood;
}
// 行为(方法)
// 定义一个方法去攻击别人(方法的调用者去攻击参数)
// r1攻击(r2)
public void attack(Role role) {
// 计算造成的伤害
Random r = new Random();
int hurt = r.nextInt(20) + 1;
// 剩余血量
int remainBlood = role.getBlood() - hurt;
// 对剩余血量进行验证,如果小于0了,就修改为0
//remainBlood = remainBlood < 0 ? 0 : remainBlood;
if(remainBlood<0) {
remainBlood=0;
}
// 修改一下挨揍人的血量
role.setBlood(remainBlood);
System.out.println(this.getName() + "举起拳头,打了" + role.getName() + "一下," + "造成了" + hurt + "点的伤害,鸠摩智还剩下"
+ remainBlood + "点血");
}
}
其实刚开始都还挺好理解,就从后面行为方法开始:
首先我当时听课时看到这个Random时就想着它能不能放到开头,当成成员变量,但结果是不行的,试了后结果是下面的这样 我们可以发现攻击的点数都是一样的,这是因为在test类中,while循环内Random是被attack调用后才进行循环的,如果我们把他放在javabean的开头,是只有一种Random的结果的,所以要放在attack方法中
对于public void attack(Role role) {}的理解,我们主要 是定义一个攻击的方法 role只是一个形参,而Role则是它的数据类型,对于Role我觉得不必深究,它也是一个数据类型罢了,只不过是自定义的,而且后期一定会学,而role是形参,而老师讲课中提到了一句这个:
我一直以为role指的就是r2,后来明白形参它是不固定的,既可以指r1,也可以是r2,看我们在测试类中如何调用(我觉得他可能写错了,或者他想的意思跟我不一样)
还有一个就是如何理解
我们怎么知道this.getName() role.getName()分别指的谁呢? 起初我只理解this.是成员变量,而role是局部变量,但还是无法区分,但我们看Test类中的
在attack中首先是r1调用了r2, r1是方法的调用者,所以this指的是r1 后面r2是方法的调用者,this指的是r2
最后一个为解决的疑问:为什么将whlie(true)换成while(1)会报错