这里将自己学习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());
}
}