对构造方法、方法的重载、this关键字及值传递引用传递的理解_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 对构造方法、方法的重载、this关键字及值传递引用传递的理解

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

 2013/8/1 1:08:42  guanxianxiao  程序员俱乐部  我要评论(0)
  • 摘要:目标:1.掌握语法格式和用途2.熟练使用参数的传递类是由属性和方法组成。方法:1.普通方法(对象的行为)2.构造方法(实例化对象的方法)1.构造方法语法格式:public类名(数据类型形参名,...){//构造方法code·····//方法体}public数据类型方法名返回值(数据类型形参名,...){//普通方法code·····//方法体}区别:1.返回值的不同:普通方法返回返回值数据类型;构造方法返回对象在堆中的地址。2.方法名的不同:普通方法名可根据需要自己命名;构造方法名必须是类名
  • 标签:方法 构造 理解 重载 关键字
目标:
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类
class="java">
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;
					}
				}
			}		
		}
	}
}

上一篇: 数据的游戏:冰与火 下一篇: 没有下一篇了!
发表评论
用户名: 匿名