Java面向对象编程封装

面向对象编程封装

我们先从最简单的一个对象设置开始,设置一个phone对象,并赋予里面brand和number,为了进行比对,我让number私有化,而让brand变成public。

主入口文件:

1
2
3
4
5
6
7
8
9
10
11
package com.bayeeaa.demo1;

public class newphone {
public static void main(String[] args) {
phone p = new phone(); //通过:类名 对象名 = new 类名()来自定义对象
p.brand = "小米"; //这里为了形成对比没有让brand私有化
p.setNumber(20);
System.out.println(p.getNumber());
}

}

类文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.bayeeaa.demo1;

public class phone {
private int number; //private使这个number私有化,让其更改操作只能在本类中实现
String brand;

public int getNumber(){ //这里方便输出内容
return number;
}

public void setNumber(int n){ //通过方法使对象值在本函数中实现改变,函数名最好用set+双驼峰写法
if(n>=18 && n<50){
number = n;
}else{
System.out.println("输入不被允许");
}
}

public void call(){
System.out.println("手机在打电话");
}

}

我们可以看到当number被私有化后,其值的修改就只能在类文件中发送,这样可以提高文件的安全性,我们只要通过调用getNumber和setNumber函数就可以实现值的传递并修改。

两种不同的构造方式

空参构造:

1
2
3
public phone(){

}

不带任何的参数。

有参构造:

1
2
3
4
public phone(String brand,int number){
this.brand = brand; //this.brand指的是类中的brand,是成员变量。右边的brand是方法里的局部变量(this遵循就近原则)
this.number = number;
}

这里的方法不带void或int等,没有return,是由于它的执行是由jvm调动的,所以主函数调用时候就会执行,无需手动执行。

主函数:

1
phone p = new phone("小米",20);  //有参函数直接可以传入数据

这样就可以直接传入参数。

快捷键:

1
2
3
4
5
6
7
public class User {
private String name;
private int number;

// alt + INSERT就可以帮我们快速生成constructer和set,get函数
// ptg插件也可以帮我们快速构造JAVABEAN
}

alt + INSERT

键盘快捷键

ptg

这个方法需要在setting中下载ptg插件。

ptg

通过快捷键我们可以快速的进行javabean构造。

文字游戏的简单应用

我们可以设置一个文字游戏,通过血量,攻击力等为对象创建属性,然后循环攻击最后输出结果。

类文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package com.bayeeaa.demo1.d3; //这里是package,不是import,这是类文件和主入口文件的区别

import java.util.Random;

public class Role {
private int blood;
private String name;

String[] attack_desc = {
"虚弱地", //1~5
"小心地", //6~10
"用力地", //10~20
};

String[] injureds_desc = {
"他似乎自信满满", //HP 100~80
"他认为还有胜算", //HP 79~50
"他还不肯认输", //HP 49~20
"他疲惫不堪" //HP 20~0
};

public Role() {
}

public Role(int blood, String name) { //有参构造
this.blood = blood; //this所表示的就是这个对象的值
this.name = name;
}

public int getBlood() { //得到血量
return blood;
}

public void setBlood(int blood) { //设置血量
this.blood = blood;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int get_attack_desc(int hurt) { //要注意这里函数最后无论如何都是要return 0的
if(hurt<=5 && hurt>0) return 0;
else if (hurt<=10 && hurt>5) return 1;
else if (hurt<=20 && hurt>10) return 2;
return 0;
};

public int get_injureds_desc(int remain) {
if(remain<=100 && remain>=80) return 0;
if(remain<80 && remain>=50) return 1;
if(remain<50 && remain>=20) return 2;
if(remain<20 && remain>=0) return 3;
return 0;
}

public void attack(Role role){ //Role赋予role这个变量意义,也就是变成了对象
Random r = new Random();
int hurt = r.nextInt(20) + 1;
int remainblood = role.getBlood() - hurt;
remainblood = remainblood < 0 ? 0 : remainblood; //三元判断,"?"左边为结果,true就是左边的,false为右边
role.setBlood(remainblood);
System.out.println(this.getName() + attack_desc[get_attack_desc(hurt)] + "打了" + role.getName() + "" + hurt + "点血," + role.getName() +"还剩" + role.getBlood() + "," + injureds_desc[get_injureds_desc(remainblood)]);
//this为调用对象,这里的role就是调入参数
}
}

主入口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.bayeeaa.demo1.d3;

public class RoleTest {
public static void main(String[] args) {
Role r1 = new Role(100,"500c");
Role r2 = new Role(100,"joker");
while(true){
r1.attack(r2);
if(r2.getBlood() == 0){
System.out.println(r1.getName() + " Win");
break;
}
r2.attack(r1);
if(r1.getBlood() == 0){
System.out.println(r2.getName() + " Win");
break;
}
}
}
}

其中一次运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
500c用力地打了joker11点血,joker还剩89,他似乎自信满满
joker用力地打了500c16点血,500c还剩84,他似乎自信满满
500c虚弱地打了joker4点血,joker还剩85,他似乎自信满满
joker用力地打了500c17点血,500c还剩67,他认为还有胜算
500c虚弱地打了joker4点血,joker还剩81,他似乎自信满满
joker用力地打了500c16点血,500c还剩51,他认为还有胜算
500c小心地打了joker7点血,joker还剩74,他认为还有胜算
joker用力地打了500c19点血,500c还剩32,他还不肯认输
500c用力地打了joker17点血,joker还剩57,他认为还有胜算
joker虚弱地打了500c4点血,500c还剩28,他还不肯认输
500c小心地打了joker10点血,joker还剩47,他还不肯认输
joker虚弱地打了500c1点血,500c还剩27,他还不肯认输
500c用力地打了joker19点血,joker还剩28,他还不肯认输
joker用力地打了500c16点血,500c还剩11,他疲惫不堪
500c小心地打了joker7点血,joker还剩21,他还不肯认输
joker虚弱地打了500c2点血,500c还剩9,他疲惫不堪
500c虚弱地打了joker5点血,joker还剩16,他疲惫不堪
joker小心地打了500c8点血,500c还剩1,他疲惫不堪
500c用力地打了joker17点血,joker还剩0,他疲惫不堪
500c Win

Process finished with exit code 0

可以看到我在类文件中先是设置了name和blood两个参数,而其攻击值是随机生成的。我也在类函数中加入了attack_desc和injureds_desc两个字符串数组来形容当前两人的状态。具体解释看代码中的注释。


Java面向对象编程封装
https://bayeeaa.github.io/2024/08/04/Java面向对象编程封装/
Author
Ye
Posted on
August 4, 2024
Licensed under