贺兰兰
本帖最后由 贺兰星辰 于 2020-4-12 00:55 编辑

    上一章:https://www.mcbbs.net/thread-940795-1-1.html
    同学们大家好,我是钉钉数字化教师贺兰星辰....(划掉)
    两个月了又回来更新了咳咳(要不是因为服务器机房炸了还真会继续咕)
    首先我们先来看一下上上个月留的家庭作业:
"家 庭 作 业:思考以下问题:
1.按照上面所讲的,Paper是Spigot的优化版,那么Paper可以使用SpigotAPI和BukkitAPI吗,反过来,Spigot可以使用PaperAPI吗
2.思考:cn.lingyuncraft.A.B.C.D.HelloWorld中,哪些是包名,哪些是类名"

首先公布答案。第一题,Paper可以使用SpigotAPI和BukkitAPI,因为Paper同时也包括BukkitAPI和SpigotAPI;Spigot服务端不能理解PaperAPI的内容,因为他根本不包括这些内容,因此也就无法完成解析这些内容,所以Spigot服务端不可以使用使用了PaperAPI的插件。第二题,cn.lingyuncraft.A.B.C.D均为包名,HelloWorld为类名(当然,有一定偏差,这里的HelloWorld应该是指HelloWorld.class文件,如果他是一个HelloWorld文件夹,那么他依然是一个包)。

    于是我们接着之前的讲,如你所见,如果不出意外,你应该看到了如下界面(可能和大部分人的界面不一样,因为这里我安装了Material Theme主题插件,安装方式同安装Minecraft Developement插件,此处略)

如果你像我一样,在界面上方看到了“Setup SDK”,那么说明你的电脑里安装了两个以上的JDK,IDE需要你选一个当做编程用JDK(IDEA自带JDK11,但我们开发大部分插件应该都要用到JDK8,因此选择Java 1.8.X)
同时,如果你在上一章选择Maven和Gradle时选择了"Maven"(也是本教程所主要介绍和使用的的,因为Gradle需要你掌握Groove语言才能配置,而Maven则仅需要理解XML文件的写法即可),那么你将能够看到右下角浮窗里有一个

意思我不用多说,学Java的人不应该不理解这么简单的英语语句,在此处,你可以选择仅导入本次更改(Import Changes,这样的话每次修改Maven配置文件都会弹出以上浮窗并需要点击Import Changes,好处是可以防止你误输入)还是持续自动导入。
    接下来你的界面下方会显示任务进度,此处为下载Maven存档数据并加载(下载速度可能会比较慢,这里建议科学上网)
    加载完成后,界面大概是这样的(如果你没有显示代码编辑器,那么请点击界面左侧的“1.Project”,并按照下方截图顺次进入你的主类文件内)

在编辑器中,你可以看到绿色,黄色和红色组成的波浪线,他们分别代表着“建议,警告和错误”,第一者总是能给你带来代码写法上的优化,第二者会提醒你可能导致的运行时错误,第三者则直接告诉你这样的代码不能通过编译(也就是说,前两者在编译时均可忽略,编译会成功,但在实际运行时第二者的位置可能会出现错误并抛出(即,引发)异常,但第三者直接令你无法将源代码编译为真正可用的插件)
当出现这样的波浪线时,只需将鼠标放在波浪线上即可得知提醒的原因并可根据提供的修复方法修复问题
于是,自动生成的主类代码如下所示:
  1. package cn.lingyuncraft.hellominecraftplugin;

  2. import org.bukkit.plugin.java.JavaPlugin;

  3. public final class Hellominecraftplugin extends JavaPlugin {

  4.     @Override
  5.     public void onEnable() {
  6.         // Plugin startup logic

  7.     }

  8.     @Override
  9.     public void onDisable() {
  10.         // Plugin shutdown logic
  11.     }
  12. }
复制代码
首先,你看到了空行,这些空行把代码分成了不同的模块(注意,这话是给开发者说的,也就是说,你空不空行,空多少行对编译器来说没任何关系,你把他们聚集到一起编译起来也是同样的效果,因为编译器会自动忽略空格,而真正把他们区分开的,则应该是那些大括号)。然后,你看到了有一些语句的末尾是分号。分号才代表着一个语句的结束,而与任何空行和空格无关,这也就是说
  1. package cn.lingyuncraft.hellominecraftplugin;
复制代码

  1. package
  2.   cn
  3.   .lingyuncraft
  4.   .hellominecraftplugin;
复制代码
没有一点点不同实际上,在你的开发过程中,大部分以分号结尾的语句被称作“方法(Method)”,有时也有人叫他们“函数(Function)”(示例代码里没有可被调用的方法,但你以后一定会用到),这样的语句往往代表执行了另一段(或是一堆)代码,以后你会知道,这样把很多代码隐藏起来,只留给用户一句自定义语句来达到效果的行为叫做“封装”,你使用这样的自定义语句被称作“调用”。于是我们开始从上到下了解每一行语句的用途:
  1. package cn.lingyuncraft.hellominecraftplugin;
复制代码
这一行声明了这个文件(即这个类)属于cn.lingyuncraft.hellominecraftplugin包(也就是说,一个类所在哪个包的怕评判标准不仅是他处于的文件夹物理位置,还要取决于package所声明的包位置),一般情况下,package语句均为任何一个类的第一句(例外是,有的程序只需要一个类就能运行,所以他们不需要包声明)。
  1. import org.bukkit.plugin.java.JavaPlugin;
复制代码
这一行声明这个类导入了一个叫做org.bukkit.plugin.java.JavaPlugin的类,这就意味着,在这个类中,我们可以直接用JavaPlugin来表示org.bukkit.plugin.java.JavaPlugin(反过来讲,如果你不嫌麻烦,你也可以写全部包名,这样你便不需要导入类了)(有一只特殊情况,就是类名相同的情况,如有hello.minecraft.JavaPlugin类,也有org.bukkit.plugin.java.JavaPlugin类,如果你在一个类中要使用两个类,那么你可以导入一个类,另一个类用全名;或者两个都不导入,都写全名)
  1. public final class Hellominecraftplugin extends JavaPlugin {
复制代码
这其实不是这个语句的完整形态,他的完整形态应该是
  1. public final class Hellominecraftplugin extends JavaPlugin {}
复制代码
那个大括号尾对应的是整个类结尾的那个大括号尾
事实上,大括号说明了括号内的代码属于括号前的那段语句,例如在以下语句中:
  1. public static void sendMessage(){
  2.   Bukkit.getPlayer("shaokeyibb").sendMessage("1");
  3.   Bukkit.getPlayer("shaokeyibb").sendMessage("2");
  4. }
复制代码
那个有“1”和有“2”的两个语句包含在那个sendMessage()方法里,二那个有“3”的语句则不包含在其中(也就是说,如果我试图执行sendMessage()方法,那么玩家shaokeyibb只能收到1和2(别管为啥是这个玩家收到了这样的信息,只是举个例子)
上面的语句其实是由很多“关键字(keyword)”组成的,这些keyword包括但不限于public,protected,private,class,package,int,long,true,false。这类关键字不能作为变量名,比如,我能够创建一个叫做hello的整数变量
  1. int hello;//可以运行
复制代码
但我不能创建一个叫做true的整数变量
  1. int true;//不可运行
复制代码
但是特殊地,当作为一段字符串时,这些关键字可以存在
  1. String a = "class";//可以运行
复制代码

你可能不知道int是什么东西,但你现在只需要知道,有些关键字不可以直接用作变量名。回到上面的语句,我们看到了public final class Hellominecraftplugin extends JavaPlugin这六个词(注意,顺序不可颠倒),它们分别代表了:
public:代表这个语句对所有人公开,即整个项目或其他项目的其他包内的其他类均可访问这个类,使用这个类里的内容;相对的,protected则代表只有这个包内的其他类可以访问这个类,private则代表只有他自己能访问他自己(即没有任何地方可以访问他)(特殊地,Java支持一种叫做“反射”的操作,允许在其他位置访问private成员
final:简单的来说,给语句带上final就代表这个语句不能被改变了(固定住了);
class:代表这是一个类,这个类后面大括号内的内容即代表这个类的内容;
Hellominecraftplugin:代表类的名字(这不是一个关键字);
extends:表明这个类继承了后面写的另一个类(这样的关键字只能用在类声明中(即语句中有class));
JavaPlugin:即上面导入的org.bukkit.plugin.java.JavaPlugin;
关于继承是什么,为什么要继承我们以后再说。
  1. @Override
复制代码
在Java中,像是这种放在方法体(就是类似于下面的那段语句)的头上(依然不严谨,因为空行在编译中被忽略,因为你也可以直接写在方法体的前面),以@开头的语句叫做“注解”,简单的来说,注解告诉可以告诉Java编译器应该执行什么样的检查或是添加什么样的设置以适应代码。在这里,@Override注解则表明下面的方法体应当覆盖继承的那个类里的某个方法(也就是说,他们的返回值(下面再说)和方法名(即"onEnable()",这里其实不严谨。()不属于方法名)应当和org.bukkit.plugin.java.JavaPlugin内的方法相同

上面就是org.bukkit.plugin.java.JavaPlugin内的onEnable()方法
  1. public void onEnable() {}
复制代码
这是一个典型的方法声明,以上关键字分别代表了:
public:前面说过,代表这个方法被公开,任何地方都可以调用
void:这里填写的是返回值,即我们调用(使用)这个方法时,这个方法给我们返回的一些东西,在这里,void代表这个方法不返回东西。
注意,此处你在声明一个方法而不是调用一个方法,调用方法只需要写出方法名即可,在这里,真正的调用者是服务端(服务端加载插件的时候会调用onEnable方法对插件进行初始化)
onEnable():(不是关键字)代表了一个叫做onEnable,不要求提供任何参数的方法,在这里,()内为空即代表不要求提供任何参数,如果括号内有东西,就要求调用这个方法的人提供一些参数例如,计算两个数的加法需要你提供两个参数,一个是第一个数,一个是第二个数
{}:这里面的内容便是调用onEnable方法后程序会执行的内容
hey,说到这里,我想问问,请问以上实例中,onEnable方法内有什么东西吗?答案是,什么都没有。
为什么,但是我明明看见了
  1. // Plugin startup logic
复制代码
什么?那是什么,我什么都没有看见!
在Java中,以//开头的一整行(注意,仅这一行,不可换行)或是以/*开头,*/结尾的多行(当然也可以是一行)被称为注释,编译器不会识别这里头的任何东西,只是给你自己看的东西。
onDisable()则是在插件卸载(服务器关闭)时需要做的操作(当然,你也可以留空不写,即啥都不做)

所以至此,你已经知道了主类内的插件代码结构

没 家 庭 作 业,自己理解吧

下一章应该会讲:plugin.yml,API,调用和声明方法,基本数据类型,String字符串,等号,for,while,switch语句


下一章传送门:https://www.mcbbs.net/thread-1014671-1-1.html




来自群组: Server CT

情谊asfa
打死这只鸽子

Phtatomr
贺兰老师明年见

LightiNike
贺兰兄,我来了

TerrenceYuan
要不是服务器机房炸了(划重点)

结城希亚
你要是早点更新我就用idea了。。。Eclipse真好用,草

缘生
更新啦!!!终于更新了!!!我等的好苦啊。现在恨不得把你先绑了(愤恨恨的说)

萝卜石头
贺兰速度更啊

stydxm
等下一期

1752614267
这就是和作者比命长系列么,i了i了

a1642566224
在线求更

walle1996
可以,很强势,学到了

yangmyzbq
66666666666666666666666666666666666

克鲁鲁殿下
呃。。。。。。。
请问怎么导出呀。。。。

下一页 最后一页