1.类是一个模版,通过类可以创建多个对象,类中定义了具体对象所有的属性和方法,通过这个模版可以生成具体的对象,调用每个对象自己的方法,可以改变其属性值,创建对象是通过new关键字实现的,创建类后,类本身就有一个默认的构造函数,即:类名(){ 方法体 }
构造函数是用来实例化对象并给属性赋初值,创建对象的格式为:类名 对象名 =new 类名();构造函数的函数名必须与类名相同(且首字母要大写),构造函数无“返回值”这一项
2.在类中定义方法
方法的基本结构为:访问限定符【包括private、public等】 返回值类型【有时无返回值时为void】 方法名(参数类型 参数变量名){ 方法体 }
方法的重载:在同一个类中,方法名相同但方法的参数类型、个数不同,在对象调用方法时会根据参数的具体情况调用不同的方法;
3.值传递与引用传递
值传递:基本数据类型以及String类型的变量进行传递时是值传递的模式,只把对应的变量的数值传递给另外一个变量,之后这两个变量的值改变时互不影响,基本数据类型包括:byte/short/int/long/float/double/char/boolean.
引用传递:类类型在传递时是遵循引用传递的模式,进行传递时会将相应的对象名的首地址传递给另一个对象名,即这两个对象名所指的就是同一个对象,一个对象名的属性改变时,另外一个对象的属性也相应的变化。
4.this关键字
(1)如果一个类中有多个构造方法,可以用this关键字进行相互调用;如:
public Student(){
System.out.println("无参构造函数");
}
public Student(String name){
this();
this.name=name;
System.out.println("一个参数的构造方法");
}
当要求在类中有多个构造方法时,只要对象一被实例化,就必须打印一行语句“一个新的对象被实例化”信息出来,很明显,此时如果在各个构造方法中编写此输出语句肯定不合适,所以要利用this关键字来完成,如以下代码:
public class Student{
private String name;
public Student(){
System.out.println("一个新的对象被实例化");
}
public Student(String name){
this();
this.name=name;
}
public String getName(){
return name;
}
}
public class Test{
public static void main(String [] args){
Student stu =new Student("张三");
System.out.println("姓名为"+name);
}
}
运行结果为:一个新的对象被实例化
姓名为张三
注意:由于构造方法是在实例化对象时自动调用的,也就是说在类中的所有方法,只有构造函数是被优先调用的,所以使用this调用构造方法必须也只有放在构造方法的首行,this调用构造方法时一定要留一个构造方法作为出口,即程序中至少存在一个构造方法是不使用this调用其他构造方法的。
(2)使用this调用本类属性
public class Student{
private String name;
private int score;
public void setName(){
name=name;
}
public String getName(){
return name;
}
public class Test(){
public static void main(){
Student stu=new Student();
stu.setName("张三");
System.out.print("姓名为"+name)
}
}
运行结果为:姓名为null
出现上述情况是因为参数名与属性名一致,,赋值时由于就近原则两个量都取得的得参数的默认值0,如果将“name=name”改为“this.name=name”就不会出现错误,this最重要的特点就是表示当前的对象,在java中当前对象就是指当前正在调用的类中方法的对象。
5.练习:战士与Boss进行pk直至一方血数为零,结束战斗,并输出胜负情况,战士可以使用不同的攻击方法。
代码如下:
package cn.netjava.sample0314;
import java.util.Random;
/**
* 定义战士类
*
*
*
*/
public class Soldiers {
private String name;// 姓名属性
private int blood;// 血量属性
private String skill;// 技能属性
/**
* 构造方法
*/
public Soldiers() {
this("元素师", 100);// 调用带两个参数的构造方法
}
/**
* 构造方法
*
* @param name要赋值给name属性的参数
* @param blood要赋值给blood属性的参数
*/
public Soldiers(String name, int blood) {
this(name, blood, "普通攻击");// 调用带三个参数的方法
}
/**
* 构造方法
*
* @param name要赋值给name属性的参数
* @param blood要赋值给blood属性的参数
* @param skill要赋值给skill属性的参数
*/
public Soldiers(String name, int blood, String skill) {
this.name = name;
this.blood = blood;
this.skill = skill;
}
/**
* 定义给姓名属性设置值的方法
*
* @param name要赋值给name属性的参数
*/
public void setName(String name) {
this.name = name;
}
/**
* 定义获取姓名属性中存储值的方法
*
* @return 返回name中存储的值
*/
public String getName() {
return name;
}
/**
* 定义给血量属性设置值的方法
*
* @param blood要赋值给blood属性的参数
*/
public void setBlood(int blood) {
this.blood = blood;
}
/**
* 定义获取血量属性中存储值的方法
*
* @return 返回blood中存储的值
*/
public int getBlood() {
return blood;
}
/**
* 定义给技能属性设置值的方法
*
* @param skill要赋值给skill属性的参数
*/
public void setSkill(String skill) {
this.skill = skill;
}
/**
* 定义获取技能属性中存储值的方法
*
* @return 返回skill中存储的值
*/
public String getSkill() {
return skill;
}
/**
* 战士类的攻击方法,攻击的是怪兽对象
*
* @param mon要被攻击的怪兽对象
*/
public void attack(Monster mon) {
//随机数类的对象
Random rand = new Random();
// 减少怪兽对象的血量
mon.setBlood(mon.getBlood() - rand.nextInt(20));
// int b = mon.getBlood();
// b = b-20;
// mon.setBlood(b);
// 输出攻击后的信息
System.out.println(name + "使用" + skill + "攻击了" + mon.getName() + ","
+ mon.getName() + "剩余" + mon.getBlood() + "血量。");
}
}
package cn.netjava.sample0314;
import java.util.Random;
/**
* 怪兽类
*
*
*
*/
public class Monster {
private String name;// 姓名属性
private int blood;// 血量属性
private String skill;// 技能属性
/**
* 构造方法
*/
public Monster(){
this("怪兽",100);//调用带两个参数的构造方法
}
/**
* 构造方法
*
* @param name要赋值给name属性的参数
* @param blood要赋值给blood属性的参数
*/
public Monster(String name,int blood){
this(name,blood,"普通攻击");//调用带三个参数的方法
}
/**
* 构造方法
*
* @param name要赋值给name属性的参数
* @param blood要赋值给blood属性的参数
* @param skill要赋值给skill属性的参数
*/
public Monster(String name, int blood, String skill) {
this.name = name;
this.blood = blood;
this.skill = skill;
}
/**
* 定义给姓名属性设置值的方法
*
* @param name要赋值给name属性的参数
*/
public void setName(String name) {
this.name = name;
}
/**
* 定义获取姓名属性中存储值的方法
*
* @return 返回name中存储的值
*/
public String getName() {
return name;
}
/**
* 定义给血量属性设置值的方法
*
* @param blood要赋值给blood属性的参数
*/
public void setBlood(int blood) {
this.blood = blood;
}
/**
* 定义获取血量属性中存储值的方法
*
* @return 返回blood中存储的值
*/
public int getBlood() {
return blood;
}
/**
* 定义给技能属性设置值的方法
*
* @param skill要赋值给skill属性的参数
*/
public void setSkill(String skill) {
this.skill = skill;
}
/**
* 定义获取技能属性中存储值的方法
*
* @return 返回skill中存储的值
*/
public String getSkill() {
return skill;
}
/**
* 怪兽类的攻击方法,攻击的是战士对象
* @param sol要被攻击的战士对象
*/
public void attack(Soldiers sol){
//随机数类的对象
Random rand = new Random();
//减少战士对象的血量
sol.setBlood(sol.getBlood()-rand.nextInt(20));
//int b = sol.getBlood();
//b = b-10;
//sol.setBlood(b);
//输出攻击后的信息
System.out.println(name+"使用"+skill+"攻击了"+sol.getName()+","+sol.getName()+"剩余"+sol.getBlood()+"血量。");
}
}
package cn.netjava.sample0314;
import java.util.Random;
/**
* 主函数的类
*
*
*
*/
public class Game {
/**
* 程序的入口
*/
public static void main(String[] args) {
// 创建一个Soldiers类的对象
Soldiers sol = new Soldiers("元素师", 100, "火球术");
// 实例化一个Monster类的对象
Monster mon = new Monster();
// 实例化一个随机数类的对象
Random rand = new Random();
int value = rand.nextInt(2);
// 游戏对战平台的方法
Game.test(sol, mon, value);
}
public static void test(Soldiers sol, Monster mon, int i) {
switch (i) {
case 0:
// 循环判断对象的血量是否为0
while (sol.getBlood() > 0 && mon.getBlood() > 0) {
// 调用战士的战斗方法
sol.attack(mon);
// 判断mon的血量是否小于等于0
if (mon.getBlood() <= 0) {
System.out.println(sol.getName() + "胜利了!");
break;
}
// 调用怪兽的战斗方法
mon.attack(sol);
// 判断sol的血量是否小于等于0
if (sol.getBlood() <= 0) {
System.out.println(mon.getName() + "胜利了!");
break;
}
}
break;
case 1:
// 循环判断对象的血量是否为0
while (sol.getBlood() > 0 && mon.getBlood() > 0) {
// 调用怪兽的战斗方法
mon.attack(sol);
// 判断sol的血量是否小于等于0
if (sol.getBlood() <= 0) {
System.out.println(mon.getName() + "胜利了!");
break;
}
// 调用战士的战斗方法
sol.attack(mon);
// 判断mon的血量是否小于等于0
if (mon.getBlood() <= 0) {
System.out.println(sol.getName() + "胜利了!");
break;
}
}
}
}
}
构造函数是用来实例化对象并给属性赋初值,创建对象的格式为:类名 对象名 =new 类名();构造函数的函数名必须与类名相同(且首字母要大写),构造函数无“返回值”这一项
2.在类中定义方法
方法的基本结构为:访问限定符【包括private、public等】 返回值类型【有时无返回值时为void】 方法名(参数类型 参数变量名){ 方法体 }
方法的重载:在同一个类中,方法名相同但方法的参数类型、个数不同,在对象调用方法时会根据参数的具体情况调用不同的方法;
3.值传递与引用传递
值传递:基本数据类型以及String类型的变量进行传递时是值传递的模式,只把对应的变量的数值传递给另外一个变量,之后这两个变量的值改变时互不影响,基本数据类型包括:byte/short/int/long/float/double/char/boolean.
引用传递:类类型在传递时是遵循引用传递的模式,进行传递时会将相应的对象名的首地址传递给另一个对象名,即这两个对象名所指的就是同一个对象,一个对象名的属性改变时,另外一个对象的属性也相应的变化。
4.this关键字
(1)如果一个类中有多个构造方法,可以用this关键字进行相互调用;如:
public Student(){
System.out.println("无参构造函数");
}
public Student(String name){
this();
this.name=name;
System.out.println("一个参数的构造方法");
}
当要求在类中有多个构造方法时,只要对象一被实例化,就必须打印一行语句“一个新的对象被实例化”信息出来,很明显,此时如果在各个构造方法中编写此输出语句肯定不合适,所以要利用this关键字来完成,如以下代码:
public class Student{
private String name;
public Student(){
System.out.println("一个新的对象被实例化");
}
public Student(String name){
this();
this.name=name;
}
public String getName(){
return name;
}
}
public class Test{
public static void main(String [] args){
Student stu =new Student("张三");
System.out.println("姓名为"+name);
}
}
运行结果为:一个新的对象被实例化
姓名为张三
注意:由于构造方法是在实例化对象时自动调用的,也就是说在类中的所有方法,只有构造函数是被优先调用的,所以使用this调用构造方法必须也只有放在构造方法的首行,this调用构造方法时一定要留一个构造方法作为出口,即程序中至少存在一个构造方法是不使用this调用其他构造方法的。
(2)使用this调用本类属性
public class Student{
private String name;
private int score;
public void setName(){
name=name;
}
public String getName(){
return name;
}
public class Test(){
public static void main(){
Student stu=new Student();
stu.setName("张三");
System.out.print("姓名为"+name)
}
}
运行结果为:姓名为null
出现上述情况是因为参数名与属性名一致,,赋值时由于就近原则两个量都取得的得参数的默认值0,如果将“name=name”改为“this.name=name”就不会出现错误,this最重要的特点就是表示当前的对象,在java中当前对象就是指当前正在调用的类中方法的对象。
5.练习:战士与Boss进行pk直至一方血数为零,结束战斗,并输出胜负情况,战士可以使用不同的攻击方法。
代码如下:
package cn.netjava.sample0314;
import java.util.Random;
/**
* 定义战士类
*
*
*
*/
public class Soldiers {
private String name;// 姓名属性
private int blood;// 血量属性
private String skill;// 技能属性
/**
* 构造方法
*/
public Soldiers() {
this("元素师", 100);// 调用带两个参数的构造方法
}
/**
* 构造方法
*
* @param name要赋值给name属性的参数
* @param blood要赋值给blood属性的参数
*/
public Soldiers(String name, int blood) {
this(name, blood, "普通攻击");// 调用带三个参数的方法
}
/**
* 构造方法
*
* @param name要赋值给name属性的参数
* @param blood要赋值给blood属性的参数
* @param skill要赋值给skill属性的参数
*/
public Soldiers(String name, int blood, String skill) {
this.name = name;
this.blood = blood;
this.skill = skill;
}
/**
* 定义给姓名属性设置值的方法
*
* @param name要赋值给name属性的参数
*/
public void setName(String name) {
this.name = name;
}
/**
* 定义获取姓名属性中存储值的方法
*
* @return 返回name中存储的值
*/
public String getName() {
return name;
}
/**
* 定义给血量属性设置值的方法
*
* @param blood要赋值给blood属性的参数
*/
public void setBlood(int blood) {
this.blood = blood;
}
/**
* 定义获取血量属性中存储值的方法
*
* @return 返回blood中存储的值
*/
public int getBlood() {
return blood;
}
/**
* 定义给技能属性设置值的方法
*
* @param skill要赋值给skill属性的参数
*/
public void setSkill(String skill) {
this.skill = skill;
}
/**
* 定义获取技能属性中存储值的方法
*
* @return 返回skill中存储的值
*/
public String getSkill() {
return skill;
}
/**
* 战士类的攻击方法,攻击的是怪兽对象
*
* @param mon要被攻击的怪兽对象
*/
public void attack(Monster mon) {
//随机数类的对象
Random rand = new Random();
// 减少怪兽对象的血量
mon.setBlood(mon.getBlood() - rand.nextInt(20));
// int b = mon.getBlood();
// b = b-20;
// mon.setBlood(b);
// 输出攻击后的信息
System.out.println(name + "使用" + skill + "攻击了" + mon.getName() + ","
+ mon.getName() + "剩余" + mon.getBlood() + "血量。");
}
}
package cn.netjava.sample0314;
import java.util.Random;
/**
* 怪兽类
*
*
*
*/
public class Monster {
private String name;// 姓名属性
private int blood;// 血量属性
private String skill;// 技能属性
/**
* 构造方法
*/
public Monster(){
this("怪兽",100);//调用带两个参数的构造方法
}
/**
* 构造方法
*
* @param name要赋值给name属性的参数
* @param blood要赋值给blood属性的参数
*/
public Monster(String name,int blood){
this(name,blood,"普通攻击");//调用带三个参数的方法
}
/**
* 构造方法
*
* @param name要赋值给name属性的参数
* @param blood要赋值给blood属性的参数
* @param skill要赋值给skill属性的参数
*/
public Monster(String name, int blood, String skill) {
this.name = name;
this.blood = blood;
this.skill = skill;
}
/**
* 定义给姓名属性设置值的方法
*
* @param name要赋值给name属性的参数
*/
public void setName(String name) {
this.name = name;
}
/**
* 定义获取姓名属性中存储值的方法
*
* @return 返回name中存储的值
*/
public String getName() {
return name;
}
/**
* 定义给血量属性设置值的方法
*
* @param blood要赋值给blood属性的参数
*/
public void setBlood(int blood) {
this.blood = blood;
}
/**
* 定义获取血量属性中存储值的方法
*
* @return 返回blood中存储的值
*/
public int getBlood() {
return blood;
}
/**
* 定义给技能属性设置值的方法
*
* @param skill要赋值给skill属性的参数
*/
public void setSkill(String skill) {
this.skill = skill;
}
/**
* 定义获取技能属性中存储值的方法
*
* @return 返回skill中存储的值
*/
public String getSkill() {
return skill;
}
/**
* 怪兽类的攻击方法,攻击的是战士对象
* @param sol要被攻击的战士对象
*/
public void attack(Soldiers sol){
//随机数类的对象
Random rand = new Random();
//减少战士对象的血量
sol.setBlood(sol.getBlood()-rand.nextInt(20));
//int b = sol.getBlood();
//b = b-10;
//sol.setBlood(b);
//输出攻击后的信息
System.out.println(name+"使用"+skill+"攻击了"+sol.getName()+","+sol.getName()+"剩余"+sol.getBlood()+"血量。");
}
}
package cn.netjava.sample0314;
import java.util.Random;
/**
* 主函数的类
*
*
*
*/
public class Game {
/**
* 程序的入口
*/
public static void main(String[] args) {
// 创建一个Soldiers类的对象
Soldiers sol = new Soldiers("元素师", 100, "火球术");
// 实例化一个Monster类的对象
Monster mon = new Monster();
// 实例化一个随机数类的对象
Random rand = new Random();
int value = rand.nextInt(2);
// 游戏对战平台的方法
Game.test(sol, mon, value);
}
public static void test(Soldiers sol, Monster mon, int i) {
switch (i) {
case 0:
// 循环判断对象的血量是否为0
while (sol.getBlood() > 0 && mon.getBlood() > 0) {
// 调用战士的战斗方法
sol.attack(mon);
// 判断mon的血量是否小于等于0
if (mon.getBlood() <= 0) {
System.out.println(sol.getName() + "胜利了!");
break;
}
// 调用怪兽的战斗方法
mon.attack(sol);
// 判断sol的血量是否小于等于0
if (sol.getBlood() <= 0) {
System.out.println(mon.getName() + "胜利了!");
break;
}
}
break;
case 1:
// 循环判断对象的血量是否为0
while (sol.getBlood() > 0 && mon.getBlood() > 0) {
// 调用怪兽的战斗方法
mon.attack(sol);
// 判断sol的血量是否小于等于0
if (sol.getBlood() <= 0) {
System.out.println(mon.getName() + "胜利了!");
break;
}
// 调用战士的战斗方法
sol.attack(mon);
// 判断mon的血量是否小于等于0
if (mon.getBlood() <= 0) {
System.out.println(sol.getName() + "胜利了!");
break;
}
}
}
}
}