对构造方法、方法的重载、this关键字及值传递引用传递的理解

目标:
1.掌握语法格式和用途
2.熟练使用参数的传递

类是由属性和方法组成。
方法: 1.普通方法(对象的行为)
2.构造方法(实例化对象的方法)

1.构造方法
语法格式:
public 类名(数据类型 形参名,...){ //构造方法
code·····//方法体
}
public 数据类型 方法名返回值(数据类型 形参名,...){ //普通方法
code·····//方法体
}

区别:
1.返回值的不同:普通方法返回返回值数据类型;构造方法返回对象在堆中的地址。
2.方法名的不同:普通方法名可根据需要自己命名;构造方法名必须是类名。



用途:
1.实例化对象。
实例化对象的格式:类名 对象名 = new 类名();
2.给属性设置初始值。
实例化对象并设置初始值的格式:类名 对象名 = new 类名(初始值用‘,’间隔);

Java会给类提供一个默认的构造方法;如果类中定义了构造方法,则默认的会被覆盖
无法再继续使用默认的构造方法。


若需要不同的构造方法可以重载构造方法。

2.方法(构造方法和普通方法)重载
实现方法重载的条件
1.方法名字必须要完全相同
2.方法所带的参数个数、参数类型、参数顺序,这三项中最少要有一个是不同的。

如何调用重载后的方法?
根据参数个数、参数类型、参数顺序,自动选择相对应的方法。

什么情况要使用到方法重载?
需要为同一类下的不同对象初始化不同的初始值,比如说一个学生类,一个高三班上的学生有应届生、复读生,需要详细了解每个学生属性,
所以实例化时复读生用带有设置上次高考成绩的构造方法(Student student2=new Student("姓名",上届高考成绩);),实例化应届
生时用另一个构造方法(Student student2=new Student("姓名");)

普通的方法是相同原理,相同的功能但需要不同的参数。


3.this关键字
this 相当于"我的"的意思
public void setname(String name){
this.name=name;
}
stu1.setname("张三");//此时this指的是stu1,其指的是引用此方法的对象

this可调用相应的方法
public Student(String n){
name=n;
}
public Student(){
this("张三");
} //此时this指的是上个构造方法,这是this的应用之一,构造方法之间的相互调用,但只能调用一次


4.值传递
值传递适用于java的基本数据类型+String

值传递的方法
public void setname(String n){name=n;}
public void setblood(int b){blood=b;}
stu1.setname("张三");
stu1.setblood(100);

5.引用传递
引用传递适用于Java的引用类型(对象类型)[类,抽象类,接口,数组 ]
Student stu1 = new Student("张三",男,20);//实例化一个stu1对象,设置相应属性姓名,性别,年龄
student stu2 = new Student();//重新实例化一个stu2对象
stu2=stu1;
此时stu2的相应属性为:姓名 张三,性别 男,年龄 20

6.练习
1.回合制游戏:**角色和男爵Boss进行战斗,直到一方的血量为0时结束战斗,输出谁胜利了!
**角色和小怪进行战斗,直到一方的血量为0时结束战斗,输出谁胜利了!


注:
构造方法无返回值类型不代表无返回值 可以返回new的对象在堆中开辟空间的地址

Student stu;
stu = new Student("张三");//在堆中开辟一块内存 存储Student对象 相关属性 方法 设地址为123
stu = new Student("张三");//在堆中另开辟一块新的内存 存储一个新的Student对象 相关属性 方法 设地址为@456
此时stu 指的是456的内存 123被覆盖 并被GC垃圾回收机制回收内存

实际上 实例化了 两个对象


Baron类

public class Baron {
private String name;
private int blood;
private int ATK;

public Baron(){}//构造函数
public Baron(String n,int b,int a){//重载构造函数
name=n;
blood=b;
ATK=a;
}
public void setname(String n){//设置对象名字的方法
name=n;
}
public void setblood(int b){//设置对象血量的方法
blood=b;
}
public void setATK(int atk){//设置对象攻击力的方法
ATK=atk;
}
public String getname(){//返回对象名字的方法
return name;
}
public int getblood(){//返回对象血量的方法
return blood;
}
public int getatk(){//返回对象攻击力的方法
return ATK;
}
public void attack(Zed z){//设置攻击方法
z.setblood(z.getblood()-this.ATK);
System.out.println(z.getname()+"的血量为:"+z.getblood());
}
public int if_die(){
if(this.getblood()<0){
return 1;
}
else{return 0;}
}

}


Zed类

public class Zed {
private String name;
private int blood;
private int ATK;

public Zed(){}//构造函数
public Zed(String n,int b,int a){//重载构造函数
name=n;
blood=b;
ATK=a;
}
public void setname(String n){//设置对象名字的方法
name=n;
}
public void setblood(int b){//设置对象血量的方法
blood=b;
}
public void setATK(int atk){//设置对象攻击力的方法
ATK=atk;
}
public String getname(){//返回对象名字的方法
return name;
}
public int getblood(){//返回对象血量的方法
return blood;
}
public int getatk(){//返回对象攻击力的方法
return ATK;
}
public void attack(Baron b){//设置攻击方法
b.setblood(b.getblood()-this.ATK);
System.out.println(b.getname()+"的血量为:"+b.getblood());
}
public void attack(Soldier s){//设置攻击方法
s.setblood(s.getblood()-this.ATK);
System.out.println(s.getname()+"的血量为:"+s.getblood());
}
public int if_die(){
if(this.getblood()<0){
return 1;
}
else{return 0;}
}
}


Soldier类

public class Soldier {
private String name;
private int blood;
private int ATK;

public Soldier(){}//构造函数
public Soldier(String n,int b,int a){//重载构造函数
name=n;
blood=b;
ATK=a;
}
public void setname(String n){//设置对象名字的方法
name=n;
}
public void setblood(int b){//设置对象血量的方法
blood=b;
}
public void setATK(int atk){//设置对象攻击力的方法
ATK=atk;
}
public String getname(){//返回对象名字的方法
return name;
}
public int getblood(){//返回对象血量的方法
return blood;
}
public int getatk(){//返回对象攻击力的方法
return ATK;
}
public void attack(Zed z){//设置攻击方法
z.setblood(z.getblood()-this.ATK);
System.out.println(z.getname()+"的血量为:"+z.getblood());
}
public int if_die(){
if(this.getblood()<0){
return 1;
}
else{return 0;}
}

}


主函数类Fighting

public class Fighting {

/**
* @param args
*/
public static void main(String[] args) {
Baron baron = new Baron("男爵",1000,47);
Soldier soldier = new Soldier("小兵",100,10);
Zed zed = new Zed("劫",800,60);
/********************开始战斗************************/
while(baron.getblood()>0&&zed.getblood()>0){
zed.attack(baron);
if(baron.getblood()<0){
System.out.println(baron.getname()+"战死");
break;
}
else{
baron.attack(zed);
if(zed.getblood()<0){
System.out.println(zed.getname()+"战死");
break;
}
}

}
/**********************第二场*************************/
if(baron.getblood()>0){
System.out.println(zed.getname()+"输了");
}
else{
while(zed.getblood()>0&&soldier.getblood()>0){
zed.attack(soldier);
if(soldier.getblood()<0){
System.out.println(zed.getname()+"胜利");
}
else{
soldier.attack(zed);
if(zed.getblood()<0){
System.out.println(zed.getname()+"战死");
break;
}
}
}
}
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值