一、
构造器方法
Student st1=new Student();
这里的Student()就叫做Student类的构造器方法。
如果我们在类里不去
自定义一个构造器方法的话,我们
创建对象时,就只能使用类里面默认的无参构造器,创建格式为:类名 对象名=new 类名(); 。
自己去定义一个构造器是有好处的。因为我们可以定义一个有参构造器。其格式为:
public 类名(int 参数1,String 参数2,...){};
这些参数值是类里面的属性值。打个比方:
现在类里面定义一个构造器:
//带两个参数的构造器方法
public Participant(String a,int b){
this.ident=a;
//使用构造器创建三个Participant类并初始化其身份和血量属性
Participant part1=new Participant("Ultraman",18);
Participant part2=new Participant("Monster",10);
而用类里默认的无参构造器来达到上述目的的话,就需要调用如下方法:
Participant partl1=new Participant();
part1.setIdent("Ultraman");
part1.setBlood(18);
Participant part2=new Participant
part1.setIdent("Monster");
part1.setBlood(10);
比较一下就能知道用有参构造器初始化参数的好处,参数越多的话,这个作用越明显。
二、方法的
重载
在一个类中,可以定义多个同名,但参数类型和数量不同的方法,叫做方法的重载。
例如在类中定义这样一些构造器方法:
public void study(){};
public void study(int i){};
public void study(String st){};
对象调用时,传入的参数和那个方法定义的参数相配,则调用对应的方法。
三、this
关键字
1.this在类中用来指代当前对象,如:
在Student类的构造器中:
public Student(String name){
this.name=name;
}
在这里,this用来强调是将参数值name赋给使用这个构造器的对象的name属性,而不是赋给Student类里的name属性。
2.this可以在构造器中调用自己的另外一个构造器。
四、值传递
值传递适用于Java的八大基本数据类型和String类型。
值传递的传递方法:对象调用方法用到了方法之外的数据值(该数据在调用前已有了存储空间),调用时开辟了新的存储空间用来存储该数据,调用方法之过后,该数据在方法内的存储被销毁,方法之外的存储依然存在,因此值不变。
五、引用传递
类中的对象名存储着其属性和方法等内容的首地址,该存储空间开辟在栈里面,对象和方法的内容存储在堆中。每个对象名对应着相应的属性和方法。当把一个对象名a2赋给a1,那么a1里面的属性和方法就变成a2的了,此时两个对象名都对应于对象a2的属性和方法。
如:a1.setName("wo");
a2.setName("ni");
a1=a2;
此时会有a1.getName=a2.getName="ni"
练习:
回合制游戏:奥特曼和小怪兽要战斗,奥特曼还可以和Boss进行战斗,直到一方的血量为0的时候结束战斗,输出谁胜利了!
1.找出这个场景中的对象
2.找出每一个对象的特征和行为
3.根据类的格式和对象的特性与行为定义一个
class
4.定义主函数的类,实例化对象和调用方法
分析:
对象: 奥特曼、怪兽、Boss
共有的特征:有身份、有血量
共有的行为:能战斗
根据以上共同的特征和行为定义一个类
其程序如下:
类Participant
//定义一个参与者类Participant
public class Participant{
//参与者身份属性
private String ident;
//参与者血量属性
private int blood;
//带两个参数的构造器方法
public Participant(String a,int b){
this.ident=a;
this.blood=b;
}
//定义一个设置参与者身份的方法
public void setIdent(String st){
ident=st;
}
//定义一个获取参与者身份的方法
public String getIdent(){
return ident;
}
//定义设置血量的方法
public void setBlood(int bl){
blood = bl;
}
//获取血量的方法
public int getBlood(){
return blood;
}
//定义一个奥特曼与怪兽的战斗方法
public void fightSmall(Participant par){
par.setBlood(par.getBlood() - 1);
System.out.println(ident+"攻击了"+par.getIdent()+","+par.getIdent()+"剩余的血量是"+par.getBlood());
}
//定义一个奥特曼与Boss的战斗方法
public void fightBig(Participant par){
par.setBlood(par.getBlood() - 2);
System.out.println(ident+"攻击了"+par.getIdent()+","+par.getIdent()+"剩余的血量是"+par.getBlood());
}
类Game
/定义类Game
public class Game{
public static void main(String[] args){
//使用构造器创建三个Participant类并初始化其身份和血量属性
Participant part1=new Participant("Ultraman",18);
Participant part2=new Participant("Monster",10);
Participant part3=new Participant("Boss",20);
//奥特曼与怪兽之间的战斗
for(int i=1;i<11;i++){
//奥特曼调用战斗方法
part1.fightSmall(part2);
//怪兽调用战斗方法
part2.fightSmall(part1);
}
//输出奥特曼与怪兽之间的战斗结果
System.out.println("奥特曼与怪兽之间的战斗结果:");
if(part1.getBlood()<=0) System.out.println("胜者是"+part2.getIdent());
else if(part2.getBlood()<=0) System.out.println("胜者是"+part1.getIdent());
else System.out.println("平局");
//战胜怪兽后的奥特曼继续在余血的情况下和Boss战斗
for(int i=1;i<5;i++){
//奥特曼两次调用战斗方法
part1.fightBig(part3);
part1.fightBig(part3);
//怪兽调用战斗方法
part3.fightBig(part1);
}
//输出奥特曼与Boss之间的战斗结果
System.out.println("奥特曼与Boss之间的战斗结果:");
if(part1.getBlood()<=0) System.out.println("胜者是"+part3.getIdent());
else if(part3.getBlood()<=0) System.out.println("胜者是"+part1.getIdent());
else System.out.println("平局");
}
}