# [Java]初识Java-类与对象(附练习)

[Java]初识Java-类与对象(附练习)

1、现实生活中的对象和类

对象: 一个具体的事物、一个具体的实体
举例:面前这一个电脑、我们当前所在的房子
描述:
面前这一个电脑:
特征: 颜色、品牌、内存大小
行为/功能:写代码、听音乐、打游戏

我们当前所在的房子:
特征:楼层数、位置
行为/功能:遮风 、 避雨、居住

:具有相同特征(属性)和行为/功能(方法)的对象归为一类。

即:对象是类的具体实例
类是对象的抽象模板

2、java中的类

类的创建: class
格式: public class 类名{ }
类的属性
格式: public 属性类型 属性名;
类的方法:
格式: public 方法返回值类型 方法名(参数类型 参数名,……){
方法体,方法需要执行的内容
}

3、java中的对象

对象的创建: 关键字 new
格式: 类名 对象名 = new 类名();
对象的属性使用: 对象名.属性名
对象的方法使用: 对象名.方法名(参数值,……);

4、练习场景

机器人和射手艾希对战,采用回合制,每次攻击让对方的血量减少攻击方的攻击值,重复直到一方死亡。
输出: 战斗的过程、结果
第一步:分析场景中有哪些对象?
机器人、射手艾希
第二步: 分析场景中的对象有哪些属性和方法
机器人:
属性: 名称、血量、攻击力
方法:攻击英雄
射手艾希
属性: 名称、血量、攻击力
方法:攻击英雄
参数: 英雄对象
方法体
1、随机给定英雄的攻击力,并且能够以双倍伤害暴击
2、被攻击英雄减去攻击英雄的攻击力的值的血量
3、输出过程
第三步:创建类
第四步:在主方法中创建对象,给对象的属性赋值,调用方法

Begin
首先创建Hero类

package day1;

import java.util.Random;

public class Hero {
	
	public String name;
	public int hp;
	public int damage;
	public void attack(Hero h) {
		Random rand = new Random();  //随机数来确定暴击率及攻击力
		int baoji = rand.nextInt(99);
		damage = rand.nextInt(10) + 10;   //选择合适的攻击力范围
		if(baoji>=70) {     //暴击率为30%
			damage *= 2;
		}
		h.hp -= damage;
		System.out.println(name+"对"+h.name+"造成了"+damage+"点伤害,目前"+h.name+"剩余"+h.hp+"点血量");
		if(h.hp<=0) {   //判断对手是否被打败
			System.out.println(name+"战胜了"+h.name);
		}
	}
}

然后创建主方法

package day1;

import java.util.Random;

public class Battle {

	public static void main(String[] args) {
		Hero robot = new Hero();    //初始化对象
		Hero shooter = new Hero();
		robot.name = "蒸汽机器人";
		robot.hp = 100;
		shooter.name = "艾希";
		shooter.hp = 100;
		while(robot.hp>0 && shooter.hp>0) {  //轮流攻击
			shooter.attack(robot);
			if(robot.hp <= 0) {
				break;
			}
			robot.attack(shooter);
		}
	}
}

以上代码具有较强的面向过程编程的感觉,体现在如果有多个英雄混战时,需要写许多while,会使得主方法显得杂乱无章,so,我进行了一些改进:将两个英雄轮流攻击到击败其中一方为止这个过程放入Hero类中。

改进后的代码:
Hero类:

package day1;

import java.util.Random;

public class Hero {
	public String name;
	public int hp;
	public int damage;
	public void attack(Hero h) {
		while(h.hp>0 && hp>0) {     //开始双方轮流对战
			Random rand = new Random();
			int baoji = rand.nextInt(99);
			damage = rand.nextInt(10) + 10;
			if(baoji>=70) {
				damage *= 2;
			}
			h.hp -= damage;
			System.out.println(name+"对"+h.name+"造成了"+damage+"点伤害,目前"+h.name+"剩余"+h.hp+"点血量");
			if(h.hp<=0) {
				System.out.println(name+"战胜了"+h.name);
				break;  //若一方已败,则无需让其再攻击,跳出循环
			}
			//另一英雄攻击回合
			int baoji1 = rand.nextInt(99);
			h.damage = rand.nextInt(10) + 10;
			if(baoji1>=70) {
				h.damage *= 2;
			}
			hp -= h.damage;
			System.out.println(h.name+"对"+name+"造成了"+h.damage+"点伤害,目前"+name+"剩余"+hp+"点血量");
			if(hp<=0) {
				System.out.println(h.name+"战胜了"+name);
			}
		}
	}
}

主方法

package day1;

public class Battle {

	public static void main(String[] args) {
		Hero robot = new Hero();
		Hero shooter = new Hero();
		robot.name = "蒸汽机器人";
		robot.hp = 100;
		shooter.name = "艾希";
		shooter.hp = 100;
		shooter.attack(robot);
	}
}

修改之后虽然Hero类复杂一些,但是主方法简洁很多,特别是在主方法中需要创建多个对象时,会比修改前要简洁很多。
个人觉得这也是面向对象编程的原因和追求的目标之一。在学习面向对象编程时要逐步改进自己面向过程编程的思想。

你可能感兴趣的:(Java)