Java学习笔记(15)——类、对象与引用

这里将自己学习java及其应用的一些笔记、积累分享一下,如果涉及到了文章、文字侵权,请联系我删除或调整。


一、类

1.1 概述

  • 对事物、算法、逻辑、概念等的抽象
  • 可理解成“模板”、“图纸”
  • 封装

相关的数据、运算代码,封装成一个“类”组件

二、对象

1.1 概述

  • 从“类”创建的具体“实例”
  • 每个对象,占用独立的内存空间,保存各自的属性数据
  • 可以独立控制一个对象,来执行指定的方法代码

​​​​​​​​​​​​​​三、引用

1.1 概述

  • 保存对象的内存地址
  • 理解成“遥控器”
  • 引用变量的特殊值:null(空) 不保存任何对象的地址

​​​​​​​​​​​​​​​​​​​​​1.2 练习:士兵射击游戏

在此,我们需要封装了一个士兵类。同时,我们编写一小段测试代码,来使用封装好的类。我们可以看到,基于类这样一个模板,我们可以创建2个具备相同属性(成员变量)、方法的实例对象,但他们的属性值可能是不同的。

项目:士兵
类:Test1, Soldier

package day0606;
import java.util.Random;
/*
 * 封装:
 * 士兵相关的属性数据、逻辑运算方法,封装成一个士兵“类”组件
 */
public class Soldier {
	//成员变量,属性变量
	int id; //士兵编号,默认值0
	int blood = 100;
	AK47 a;//定一个武器类AK47的变量,但未初始化,默认null 值

	//成员方法
	public void go() {
		//this是一个特殊引用,引用“当前对象”的地址
		//当前对象:谁调用就是谁
		//可以省略,缺省存在
		System.out.println(this.id+"号士兵前进");
	}

	public void attack() {
		if(blood == 0) {
			c
			return;//方法结束
		}
		System.out.println(id+"号士兵进攻");
		if(a != null) {
			a.fire();//调用枪发射子弹
		}else{
            System.out.println("挥拳攻击!");
        }
		//模拟进攻掉血
		//随机的减血量
		int d = new Random().nextInt(10);
		blood -= d; 
		if(blood < 0) {//不允许负数血量
			blood = 0;
		}
		System.out.println("血量:"+blood);
		//血量是0
		if(blood == 0) {
			System.out.println(id+"号士兵阵亡");
		}
	} 
}
package day0606;

public class Test1 {
	public static void main(String[] args) {
		//新建 Soldier 士兵对象
		//内存地址,保存到变量s1
		Soldier s1 = new Soldier();
		Soldier s2 = new Soldier();
		//用s1引用第一个士兵对象
		//为它的id赋值
		s1.id = 9527;
		s2.id = 9528;
		//用s1找到第一个士兵对象
		//让第一个士兵执行go()方法代码
		s1.go();
		s2.go();

		//新建 AK47 对象,保存到s1.a
		s1.a = new AK47();
		s2.a = new AK47();

		s2.attack();
		s2.attack();
		s2.attack();
		s2.attack();
	} 
}

在此,为了丰富游戏的趣味性,我们再将上述例子中未实现的武器类(AK47)编写一下。同时,我们也编写一小段测试代码,来使用“封装好的AK47”。

package day0606;
import java.util.Random;
/*
 * 封装:
 * AK47武器相关的属性数据、运算代码,封装成一个“类”组件
 */
public class AK47 {
	int bullets = 100; // 弹夹子弹

	public void fire() {
		if(bullets == 0) {
			System.out.println("没有子弹");
			return;
		}
		//随机产生发射子弹数量
		int r = new Random().nextInt(10);
		//要发射的数量,比现有子弹多
		if(r > bullets) {
			r = bullets;//有多少发多少
		}
		bullets -= r;
		// 模拟开枪
		for(int i=0;i<r;i++) {
			System.out.print("突");
		}
		System.out.println("~");
		if(bullets == 0) {
			System.out.println("弹夹空了");
		}
	}
	// 重新装弹
	public void load() {
		bullets = 100;
		System.out.println("弹夹已装满");
	} 
}
package day0606;

import java.util.Scanner;

public class Test2 {
	public static void main(String[] args) {
		//新建AK47对象,地址存到变量a
		AK47 a = new AK47();

		System.out.println("按回车射击,输入load装载子弹");
		while(true) {
			String s = new Scanner(System.in).nextLine();
			if(s.equals("load")) {
				a.load();
				continue;
			}
			a.fire();
		}

	} 
}

1.3 练习:百分制计分档位划分

百分制分数

五档分制分数

A [90,100]

B [70,90)

C [60,70)

D [20,60)

E [0,20)

在这个例子中,我们开始使用构造函数了,在后续的博文中,我们会对此做一个分享,这里不再展开。

项目:百分制和五档分制
类:Test1, Score

package day0701;
/*
 * 封装百分之分数,和他对应的五档分制分数
 */
public class Score {
	//成员变量
	int score;
	char level;

	//构造方法
	public Score(int score) {
		this.score = score;
		//计算五档分数,保存到成员变量level
		this.level = setLevel(score);
	}

	private char setLevel(int s) {
		char r = 0;
		switch(s/10) {
		case 10:case 9:
			r = 'A';break;
		case 8:case 7:
			r = 'B';break;
		case 6:
			r = 'C';break;
		case 5:case 4:case 3:case 2:
			r = 'D';break;
		case 1:case 0:
			r = 'E';break;
		}
		return r;
	}
	public String toString() {
		return score+", "+level; // 省略了this
	} 
}
package day0701;

public class Test1 {
	public static void main(String[] args) {
		/*
		 * A [90,100]
		 * B [70,90)
		 * C [60,70)
		 * D [20,60)
		 * E [0,20)
		 */
		Score s = new Score(34);
		System.out.println(s.toString());
	} 
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值