7月7日 类和对象2(续)
类中的方法有两种:
普通方法,可以理解为对象的行为
构造方法,专门用来实例化对象的方法(另外一个用途:给属性设置初始值)。
构造方法,定义格式:
public 类名(数据类型 形参名,...){
//方法体
}
区别:
构造方法不能定义返回值数据类型(但并不意味着他无返回值),方法名必须为类名
普通方法必须设置返回值数据类型,方法名可以设置为类名,也可以不是类名。
只有方法可以带“()”。
若想实例化对象,必须使用构造方法。在没有定义构造方法时,java会提供默认的构造方法(不带任何参数的构造方法),当在类中已经自己定义了一个构造方法时,java中提供的默认的无参数的构造方法不能再使用,该默认方法已经被自己设置的构造方法所替换覆盖。
用途:
实例化对象
为属性赋予初始值。例如:
public Student(String n){
name=n;
}
引用传递与值传递:
值传递适用于java的基本数据类型+String
引用传递适用于java的引用类型(对象类型)[类,抽象类,接口,数组 ]
一个new一个新对象。
内存分为“栈”内存和“堆”内存。类被存储在“栈”内存中
new关键字的作用:
在“堆”内存中开辟一个大小由“类”决定的新空间,则该新空间具备一个新的地址。当利用构造方法创建了一个对象A时,该地址被返回给“栈”内存中的类。当再用new和构造方法创建一个对象B时(B与A的对象名相同,如stu),“栈”内存中的类获取了新的地址,再调用stu时,无法调用出A.地址已经被覆盖,已经找不到A的地址。A被GC回收。(即使AB对象名相同,AB被赋予的属性初始值相同。B都是一个新的对象。利用构造方法创建对象时,一个new一个新对象)
GC:销毁对象,释放内存。
new关键字的作用:在内存中开辟一个新的空间。
构造方法作用:在内存中创建一个对象,赋予其初始值
例如:
Student stu=new Student("张三");
stu=new Student("张三");
Student stu=new Student("张三");
//这三个“stu”均为不同的对象。
stu1.setName("张三");//用是stu1的地址在“堆”内存中调用study的方法。
stu2.setName("李四");//对象里存储的是对象在内存空间的首地址!!!
stu3.setName("王五");//创建一个对象,该对象就相当于一个指针,类似,但不是指针。
//当进行如下操作时
stu2=stu1;
stu1=stu3;
stu3=stu2;
//当调用时
stu1.getName();
stu2.getName();
stu3.getName();
//结果为
王五
张三
张三
方法重载(普通方法和构造方法都可以)
构造方法的重载(用于创建对象):看该对象需要有怎样的参数,要创建的对象与对象之间存在不同时(例如:生活中在制作电脑时,有些不需要摄像头,有些需要摄像头,这个时候需要用到方法重载。)需要使用构造方法的重载
this关键字:参数名和属性名相同时,就近原则(参数近于属性),相当于参数的值赋给参数。例如:
public Student(String name){
name=name;
}
则最后调用属性时,显示“null”(因为属性无赋值);
修改方法:1、修改参数名
2、在属性名前加上“this.”
//this的第一用途。当属性名和参数名相同时,用于区分属性和参数
this的第二用途:
public Student(){
this("aaa");//表示调用当前类中带有字符串的构造方法。
//只有这种格式允许在创建对象时调用多个构造方法
}
this表示当前对象。当在stu1对象中调用对应方法时,this表示stu1.
当再创建一个对象stu2时,在stu2对象中调用对应方法时,this表示stu2。
代码示例:回合制游戏:**角色和男爵Boss进行战斗,直到一方的血量为0时结束战斗,输出谁胜利了!
**角色和小怪进行战斗,直到一方的血量为0时结束战斗,输出谁胜利了!
public class Boss{
//定义Boss类
//定义属性
private String name;
private int hp;
//定义构造方法
public Boss(String n,int h){
name=n;
hp=h;
}
//定义普通方法
//定义设置姓名的方法
public void setName(String n){
name=n;
}
//定义获取姓名的方法
public String getName(){
return name;
}
//定义设置血量的方法
public void setHp(int h){
hp=h;
}
//定义获取血量的方法
public int getHp(){
return hp;
}
//定义攻击Fighter的方法
public void fight(Fighter f){
System.out.println(getName()+"对"+f.getName()+"造成了8点伤害");
f.setHp(f.getHp()-8);
}
}
public class Soldier{
//定义Soldier类
//定义属性
private String name;
private int hp;
//定义构造方法
public Soldier(String n,int h){
name=n;
hp=h;
}
//定义普通方法
//定义设置姓名的方法
public void setName(String n){
name=n;
}
//定义获取姓名的方法
public String getName(){
return name;
}
//定义设置血量的方法
public void setHp(int h){
hp=h;
}
//定义获取血量的方法
public int getHp(){
return hp;
}
//定义攻击Fighter的方法
public void fight(Fighter f){
System.out.println(getName()+"对"+f.getName()+"造成了3点伤害");
f.setHp(f.getHp()-3);
}
}
public class Fighter{
//定义Fighter类
//定义属性
private String name;
private int hp;
//定义构造方法
public Fighter(String n,int h){
name=n;
hp=h;
}
//定义普通方法
//定义设置姓名的方法
public void setName(String n){
name=n;
}
//定义获取姓名的方法
public String getName(){
return name;
}
//定义设置血量的方法
public void setHp(int h){
hp=h;
}
//定义获取血量的方法
public int getHp(){
return hp;
}
//定义攻击Boss的方法
public void fight(Boss b){
System.out.println(getName()+"对"+b.getName()+"造成了10点伤害");
b.setHp(b.getHp()-10);
}
//定义攻击小怪的方法
public void fight(Soldier s){
System.out.println(getName()+"对"+s.getName()+"造成了15点伤害");
s.setHp(s.getHp()-15);
}
}
public class Fighting{
//主函数,程序的入口
public static void main(String[] args){
//创建新对象,并赋予初始值
Fighter fig=new Fighter("陆逊",100);
Boss bos=new Boss("姜维",100);
Soldier sol=new Soldier("敌兵",100);
java.util.Random r=new java.util.Random();
//调用各自战斗方法进行战斗
//利用随机函数,使Fighter与Boss和Soldier相遇,遇到Boss的几率为1/3,
//遇到Soldier的几率为2/3
int a=r.nextInt(3);
if(a==0){
//当两者血量都大于0时,继续战斗
while(bos.getHp()>0&&fig.getHp()>0){
fig.fight(bos);
bos.fight(fig);
}
//一方血量小于0时,输出结果
if(bos.getHp()<0){
System.out.println(bos.getName()+"战败,"+fig.getName()+"胜利");
}else{
System.out.println(fig.getName()+"战败,"+bos.getName()+"胜利");
}
}else{
//同上
while(sol.getHp()>0&&fig.getHp()>0){
fig.fight(sol);
sol.fight(fig);
}
if(sol.getHp()<0){
System.out.println(sol.getName()+"战败,"+fig.getName()+"胜利");
}else{
System.out.println(fig.getName()+"战败,"+sol.getName()+"胜利");
}
}
}
}