一、前言
java部分的基础学习已经完结,接下来给大家分享的大多为java相关的案例分析,也会有一些小项目,这点不要太过于担心,主要还是基础部分要打牢固。java部分的难点就在面向对象这一点,学习C语言的小伙伴们应该是第一次听说方法。这点也是和C语言相差巨大的地方,不过对于学习过python的小伙伴们应该会十分友好。
温馨提示一下:要好好运用工具
如果大家基础知识掌握的还不太行的话,一定要点击下方链接仔细观看欧❥(^_-)
二、JavaBean简单概括
概念
“JavaBean”,它是Java语言中的一种特殊类别,通常用于在Java应用程序中作为可重用的软件组件。
特点
属性封装
:JavaBean通过私有的成员变量(字段)和公共的getter和setter方法来封装属性。这种做法使得属性可以被控制访问,从而提高了代码的安全性和可维护性。
无参构造方法
:JavaBean通常提供一个无参构造方法,使得它可以被Java的反射机制实例化。
实现Serializable接口
:为了支持Java的序列化机制,JavaBean通常实现Serializable接口,使得它可以在网络上传输或保存到磁盘。
事件处理支持
:JavaBean可以支持事件处理,通过添加事件监听器来响应特定的事件。
命名约定
:JavaBean的命名通常遵循一定的约定,例如属性名通过getter和setter方法命名的规则。
应用场景
:JavaBean常用于构建图形用户界面(GUI)应用程序、Web应用程序和企业级Java应用程序中的模型层,提供数据的封装和业务逻辑的处理。
三、Java面向对象知识点汇总
Java中的面向对象编程(Object-Oriented Programming, OOP)是其核心编程范式之一。
注:javabeen类似与C语言中的模块化编程,python中的方法
类与对象
:
-
类(Class)
:类是对象的模板,定义了对象的属性(成员变量)和行为(方法)。 -
对象(Object)
:对象是类的实例,具体化了类的定义,每个对象都有自己的状态(属性)和行为(方法)。
封装(Encapsulation)
:
- 封装是面向对象的基本特征之一,通过将数据(成员变量)和操作数据的方法(成员方法)封装在一起,实现了对数据的隐藏和保护,提高了安全性和代码的复用性。
继承(Inheritance)
:
- 继承允许一个类(子类)继承另一个类(父类)的属性和方法。子类可以重用父类的代码,并且可以通过覆盖(重写)方法或者增加新的方法来扩展其功能。
多态(Polymorphism)
:
- 多态是指同一个方法调用由于对象不同可能会产生不同的行为。Java中实现多态的方式包括方法重载(Overloading)和方法重写(Overriding)。
抽象类与接口
:
-
抽象类(Abstract Class)
:抽象类不能被实例化,其目的是为了被子类继承,可以包含抽象方法和非抽象方法。 -
接口(Interface)
:接口定义了一组方法的规范,但不包含实现。类可以实现接口来强制执行接口定义的方法。
重要概念
:
-
构造方法(Constructor)
:用于初始化对象的特定实例。 -
this关键字
:表示当前对象的引用,可以在类的方法中使用。 -
super关键字
:表示父类的引用,用于调用父类的构造方法和成员方法。
其他关键词
:
-
final关键字
:表示最终的、不可改变的意思,可以用来修饰类、方法和变量。 -
static关键字
:表示静态的意思,可以用来修饰成员变量、成员方法、代码块和内部类等。 -
包(Package)
:用来组织类和接口,避免命名冲突。
设计原则
:
-
单一职责原则
:一个类应该只有一个引起它变化的原因。 -
开闭原则
:软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。 -
里氏替换原则
:子类必须能够替换其基类。 -
依赖倒置原则
:高层模块不应该依赖低层模块,二者都应该依赖其抽象。 -
接口隔离原则
:不应该强迫客户端依赖它们不使用的接口。 -
迪米特法则
:一个对象应该对其他对象有尽可能少的了解。
四、JavaBeen部分代码讲解
private String name;
private int blood;
private char gender;
private String face;
//面部描述
String[] boyfaces={"眉清目秀","一表人才","神采奕奕","目光炯炯","英姿飒爽","目不斜视","容光焕发","神情自若","面如冠玉","眉飞色舞"};
String[] girlfaces={"姹紫嫣红","姣好靓丽","柳眉星眼","芙蓉出水","明眸皓齿","冰清玉洁","红颜白发","笑逐颜开","美若天仙","闭月羞花"};
//攻击描述
String[] attack_dasc={
"%s刀光剑影,无声无息地一击打中了%s",
"%s提取方法…招招势如破竹,迅猛无比打向%s",
"%s手起刀落,锋利如鹰击长空,击中%s",
"%s招招精准,步步为营,势不可挡。功向%s",
"%s突如其来,快如闪电,令%s防不胜防。"
};
//受伤描述
String[] hurt_dasc={
"结果%s退了半步,毫发无伤",
"结果%s造成了一处瘀伤。",
"结果%s皮开肉绽,伤痕累累。",
"结果%s受伤虽重,仍孜孜不倦地站立。",
"结果%s脸色苍白,连退好几步",
"结果%s受到内伤,气息奄奄。",
"结果%s一声惨叫,像烂泥班塌了下去"
};
成员变量定义
:
这些是角色的基本属性:
-
private String name;
-
private int blood;
-
private char gender;
-
private String face;
-
name
是角色的名字,类型为字符串。 -
blood
是角色的血量,类型为整数。 -
gender
是角色的性别,类型为字符(通常用 ‘M’ 或 ‘F’ 表示男性或女性)。 -
face
是角色的面部特征,类型为字符串。
面部描述数组
:
这两个数组存储了男性角色和女性角色的面部描述,每个描述是一个字符串,描述了角色的外貌特征。
-
String[] boyfaces = {...};
-
String[] girlfaces = {...};
攻击描述数组
:
这个数组包含了角色进行攻击时的描述模板,使用了
占位符
%s
来表示攻击者和被攻击者的名字。这些描述字符串似乎是为了在游戏或者故事情节中描绘战斗或攻击的场景。
-
String[] attack_dasc = {...};
注:这里的占位符和C语言中的用法类似使用占位符的时候要看清是printf而不是println
受伤描述数组
:
这个数组包含了角色受伤时的描述模板,同样使用了
%s
占位符表示受伤的角色。这些描述用于描述角色在战斗中或者遭遇意外时的反应和状态。
-
String[] hurt_dasc = {...};
public Role() {//空参
}
public Role(String name, int blood,char gender) {
this.name = name;
this.blood = blood;
this.gender = gender;
setFace(gender);
}
public String getFace() {
return face;
}
public void setFace(char gender) {
Random r = new Random();
if(gender=='男'){
int index = r.nextInt(boyfaces.length);
this.face = boyfaces[index];
}else if(gender=='女'){
int index = r.nextInt(girlfaces.length);
this.face = girlfaces[index];
}else{
this.face = "抽象";
}
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getBlood() {
return blood;
}
public void setBlood(int blood) {
this.blood = blood;
}
构造方法
:
在这个构造方法中:
-
public Role() {}
:空参构造方法,没有任何参数,可能用于创建对象实例时的默认初始化。 -
public Role(String name, int blood, char gender)
:带参数的构造方法,用来初始化角色对象的属性。-
name
:角色的名字。 -
blood
:角色的血量。 -
gender
:角色的性别(’男’ 或 ‘女’)。
-
-
将传入的
name
、
blood
、
gender
分别赋值给对象的对应属性。 -
调用
setFace(gender)
方法来根据性别设定角色的面部描述。
成员变量
:
-
private String name;
:角色名字。 -
private int blood;
:角色血量。 -
private char gender;
:角色性别。 -
private String face;
:角色面部描述。
方法
:
-
public String getFace()
和
public void setFace(char gender)
:用于获取和设置角色的面部描述。-
setFace(char gender)
方法根据传入的性别参数选择性别对应的面部描述,并将其赋值给
face
属性。
-
-
public char getGender()
和
public void setGender(char gender)
:用于获取和设置角色的性别。 -
public String getName()
和
public void setName(String name)
:用于获取和设置角色的名字。 -
public int getBlood()
和
public void setBlood(int blood)
:用于获取和设置角色的血量。
面部描述数组和随机选择
:
-
boyfaces
和
girlfaces
分别存储了男性和女性角色的面部描述。 -
setFace(char gender)
方法根据传入的性别参数选择性别对应的面部描述数组,并随机选取一个面部描述赋给
face
属性。
//定义一个方法用于攻击别人
//方法的调用者去攻击参数
public void attack(@org.jetbrains.annotations.NotNull Role role) {
//攻击方式
Random r = new Random();
int index = r.nextInt(attack_dasc.length);
String attack_fun =attack_dasc[index];
//输出一个攻击效果
System.out.printf(attack_fun,this.getName(),role.getName());
System.out.println();
//伤害1-20
Random ran = new Random();
int hurt = ran.nextInt(20) + 1;
//剩余的血量
int remainBlood = role.getBlood() - hurt;
remainBlood = remainBlood > 0 ? remainBlood : 0;
role.setBlood(remainBlood);
//输出一下结果
//受伤的描述
if(remainBlood>=80){
System.out.printf(hurt_dasc[0],role.getName());
}else if(remainBlood>=70){
System.out.printf(hurt_dasc[1],role.getName());
}else if(remainBlood>=60){
System.out.printf(hurt_dasc[2],role.getName());
}else if(remainBlood>=50){
System.out.printf(hurt_dasc[3],role.getName());
}else if(remainBlood>=40){
System.out.printf(hurt_dasc[4],role.getName());
}else if(remainBlood>=30){
System.out.printf(hurt_dasc[5],role.getName());
}else{
System.out.printf(hurt_dasc[6],role.getName());
}
System.out.println();
}
public void showRoleInfo(){
System.out.println("姓名为:"+getName());
System.out.println("血量为:"+getBlood());
System.out.println("性别为:"+getGender());
System.out.println("长相为:"+getFace());
}
attack(Role role)
方法:
-
这个方法用于让当前角色对象攻击另一个角色对象
role
。 -
首先,从
attack_dasc
数组中随机选择一种攻击方式,并将选择结果存储在
attack_fun
变量中。 -
使用
System.out.printf
方法输出攻击效果,其中
%s
标记会分别被当前角色的名字
this.getName()
和被攻击角色的名字
role.getName()
替换。 -
然后,通过生成一个随机数(1到20之间)来计算造成的伤害
hurt
。 -
计算被攻击角色剩余的血量
remainBlood
,并将其更新到
role
对象中。 -
根据剩余血量的不同范围,选择合适的受伤描述从
hurt_dasc
数组中输出。
showRoleInfo()
方法:
- 这个方法用于显示当前角色对象的信息,包括姓名、血量、性别和长相。
-
使用
System.out.println
分别输出角色的姓名(
getName()
)、血量(
getBlood()
)、性别(
getGender()
)、长相(
getFace()
)。
五、Java部分代码讲解
package day4;
public class text1 {
public static void main(String []args){
//案例、文字格斗游戏
Role r1=new Role("狼叔",100,'男');
Role r2=new Role("鲨鱼妹",100,'女');
//展示角色信息
r1.showRoleInfo();
r2.showRoleInfo();
//开始战斗
while (true){
//r1攻击r2
r1.attack(r2);
if (r2.getBlood() == 0){
System.out.println(r1.getName()+"击败了"+r2.getName());
break;
}
//r2攻击r1
r2.attack(r1);
if (r1.getBlood() == 0){
System.out.println(r2.getName()+"击败了"+r1.getName());
break;
}
}
}
}
Role 类
:
- 每个角色有姓名、血量和性别等属性。
-
角色具有
attack(Role role)
方法用于攻击另一个角色,并在攻击时产生随机的攻击效果和伤害。
text1 类
:
-
main 方法
:-
创建了两个角色对象
r1
和
r2
,分别命名为 “狼叔” 和 “鲨鱼妹”,初始化血量为 100,并指定性别。 -
调用
showRoleInfo()
方法展示两个角色的初始信息(姓名、血量、性别)。 -
使用
while
循环来模拟战斗的过程,直到其中一个角色的血量降到或者低于 0。 -
在循环中,先让
r1
攻击
r2
,然后检查
r2
的血量是否降到 0。如果是,输出
r1
击败
r2
的信息,并结束战斗。 -
然后让
r2
攻击
r1
,并检查
r1
的血量。如果
r1
的血量降到 0,输出
r2
击败
r1
的信息,并结束战斗。
-
创建了两个角色对象
战斗过程
:
-
每个角色的攻击和受伤效果是随机的,通过
Random
类来生成随机数,因此每次运行的战斗结果可能不同。 - 当一个角色的血量降到 0 或以下时,战斗结束,并输出哪个角色击败了另一个角色的信息。
六、全套源代码展示
Java部分
package day4;
public class text1 {
public static void main(String []args){
//案例、文字格斗游戏
Role r1=new Role("狼叔",100,'男');
Role r2=new Role("鲨鱼妹",100,'女');
//展示角色信息
r1.showRoleInfo();
r2.showRoleInfo();
//开始战斗
while (true){
//r1攻击r2
r1.attack(r2);
if (r2.getBlood() == 0){
System.out.println(r1.getName()+"击败了"+r2.getName());
break;
}
//r2攻击r1
r2.attack(r1);
if (r1.getBlood() == 0){
System.out.println(r2.getName()+"击败了"+r1.getName());
break;
}
}
}
}
javabeen部分
package day4;
import java.util.Random;
public class Role {
private String name;
private int blood;
private char gender;
private String face;
//面部描述
String[] boyfaces={"眉清目秀","一表人才","神采奕奕","目光炯炯","英姿飒爽","目不斜视","容光焕发","神情自若","面如冠玉","眉飞色舞"};
String[] girlfaces={"姹紫嫣红","姣好靓丽","柳眉星眼","芙蓉出水","明眸皓齿","冰清玉洁","红颜白发","笑逐颜开","美若天仙","闭月羞花"};
//攻击描述
String[] attack_dasc={
"%s刀光剑影,无声无息地一击打中了%s",
"%s提取方法…招招势如破竹,迅猛无比打向%s",
"%s手起刀落,锋利如鹰击长空,击中%s",
"%s招招精准,步步为营,势不可挡。功向%s",
"%s突如其来,快如闪电,令%s防不胜防。"
};
//受伤描述
String[] hurt_dasc={
"结果%s退了半步,毫发无伤",
"结果%s造成了一处瘀伤。",
"结果%s皮开肉绽,伤痕累累。",
"结果%s受伤虽重,仍孜孜不倦地站立。",
"结果%s脸色苍白,连退好几步",
"结果%s受到内伤,气息奄奄。",
"结果%s一声惨叫,像烂泥班塌了下去"
};
public Role() {//空参
}
public Role(String name, int blood,char gender) {
this.name = name;
this.blood = blood;
this.gender = gender;
setFace(gender);
}
public String getFace() {
return face;
}
public void setFace(char gender) {
Random r = new Random();
if(gender=='男'){
int index = r.nextInt(boyfaces.length);
this.face = boyfaces[index];
}else if(gender=='女'){
int index = r.nextInt(girlfaces.length);
this.face = girlfaces[index];
}else{
this.face = "抽象";
}
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getBlood() {
return blood;
}
public void setBlood(int blood) {
this.blood = blood;
}
//定义一个方法用于攻击别人
//方法的调用者去攻击参数
public void attack(@org.jetbrains.annotations.NotNull Role role) {
//攻击方式
Random r = new Random();
int index = r.nextInt(attack_dasc.length);
String attack_fun =attack_dasc[index];
//输出一个攻击效果
System.out.printf(attack_fun,this.getName(),role.getName());
System.out.println();
//伤害1-20
Random ran = new Random();
int hurt = ran.nextInt(20) + 1;
//剩余的血量
int remainBlood = role.getBlood() - hurt;
remainBlood = remainBlood > 0 ? remainBlood : 0;
role.setBlood(remainBlood);
//输出一下结果
//受伤的描述
if(remainBlood>=80){
System.out.printf(hurt_dasc[0],role.getName());
}else if(remainBlood>=70){
System.out.printf(hurt_dasc[1],role.getName());
}else if(remainBlood>=60){
System.out.printf(hurt_dasc[2],role.getName());
}else if(remainBlood>=50){
System.out.printf(hurt_dasc[3],role.getName());
}else if(remainBlood>=40){
System.out.printf(hurt_dasc[4],role.getName());
}else if(remainBlood>=30){
System.out.printf(hurt_dasc[5],role.getName());
}else{
System.out.printf(hurt_dasc[6],role.getName());
}
System.out.println();
}
public void showRoleInfo(){
System.out.println("姓名为:"+getName());
System.out.println("血量为:"+getBlood());
System.out.println("性别为:"+getGender());
System.out.println("长相为:"+getFace());
}
}
