构造方法和参数传递

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()+"胜利");
			}
		}

	}

}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值