本帖最后由 andylizi 于 2016-6-15 19:57 编辑
↑上面的字可以点!可以点!可以点!可以点!
继续查看请点击上面的目录翻页
↑上面的字可以点!可以点!可以点!可以点!
继续查看请点击上面的目录翻页
一、Bukkit、CraftBukkit 与 NMS ?
Bukkit,又称BukkitAPI,指的是一套API,这套API单独拿出来没有任何功能,只是插件执行各种操作的接口(也许这个比喻不恰当?有更好的比喻欢迎指正)。它位于 org.bukkit 包
CraftBukkit 在 org.bukkit.craftbukkit 包。它内置Bukkit并实现了Bukkit。嗯,让我想想怎么说。举个梨子吧。
注: VERSION处指的是服务端的内部版本,例如1.8.8-r0.3是v1_8_r3,此后不再说明
那么为什么操作还必须要通过这一套接口呢?直接操作既方便又简单,并且能实现更多内部操作——bukkitapi没提供的操作,非常的powerful。
要理解这个问题的答案,必须先明白
这个看似简单的问题非常有深度,于是让我们有请目前吃掉插件版3/9精华并正打算吃掉更多的,发过3个贴全是精华的,下一届艺术家提名的,在线时间555小时=我的1/4但贡献却比我还多的,脑洞简直不敢想象,码代码水平让我自叹不如的@CustomStuff 来进行解答与教♂育(给点面子回答一下呗~

咳咳,回到正题。
CraftBukkit虽说实现了Bukkit这套API,但是MC世界的各种逻辑并不是由它负责运算的。
负责运算的就是Mojang的官方服务端——NMS(啊这个名字可能不正式,但实在不知道还有什么称呼。NMS是它所在的包net.minecraft.server的缩写。
CraftBukkit使用MCP对NMS干了某些事情(咳咳)后使不能看的NMS能看懂了(勉强),然后对NMS进行了包装(BukkitAPI),在里面插♂入了各种与BukkitAPI交互的代码(也许还优化了NMS的代码),最终变成了我们现在见到的CraftBukkit服务端核心。举个梨子
既然NMS没有插件一说,那自然没有事件一说。所有事件都是CraftBukkit在NMS发生事件的地方插入进触发事件的代码,才得以执行的。
而Spigot又在CraftBukkit之上加入了自己的新api(例如 player.spigot().setViewDistance(10); ),并且对NMS进行了优化,在。
PaperSpigot也同样,在Spigot之上再加入更多的优化。
Caulrdon整合了Forge+Spigot,使其兼容mod。
那为什么Spigot和Cauldron避免了DMCA?抱歉这个我也不清楚(会不会是因为BuildTools呢,也许)。我只知道Paper避免版权问题的方式是:使用paperclip。至于什么是paperclip,paperclip的原理,不在赘述。
另: 本来官服只有 server.properties ,CraftBukkit的加入带来了 bukkit.yml ,Spigot的加入又带来了 spigot.yml , Paper的加入又带来了 paper.yml, Forge(Cauldron)的加入带来了 cauldron.yml。。真是有趣,对不对?
有没有明白为什么我之前说“不推荐导入服务端核心,因为里面的NMS与IDE的import补全联合一起会误导人”了吧。
一个Block类,在IDE的自动import补全里会显示:
除非你知道你在做什么,导入时一定要导入 org.bukkit 开头的类并且里面没有出现 craftbukkit
二、什么是Bukkit插件?
Bukkit插件本质是一个Java程序,只是其符合了Bukkit插件的规范使CraftBukkit和基于CraftBukkit的服务端(以后统称CraftBukkit或cb,不再说明“基于CraftBukkit”)可以理解并加载。
那么这套规范是什么呢?
1. 每个插件将所有类必须打包为jar格式才能被读取并识别
2. 插件的Jar根目录必须有一个名为 plugin.yml 的符合 YAML语法 的文件。
3. plugin.yml 内必须按规范填写足够的保证插件能运行的信息。下面会详细说明。
4、插件内必须有一个类继承了 org.bukkit.plugin.java.JavaPlugin 来作为插件的主类(入口点,就像Java应用程序的main方法)
5、插件主类必须是公共的,并且有一个公共的构造方法。
满足以上条件的程序即为一个Bukkit插件。
三、一个最基本的Bukkit插件的结构
主类这个极其简单最后讲,我们先来说说 plugin.yml来,乖,叔叔这有棒棒糖
其实 plugin.yml 的格式和规范完全可以在 http://wiki.bukkit.org/Plugin_YAML 找到。我就简单的说一下。
必须的值:下面的为可选选项
我建议加上或为什么要加上?原因:这里是天朝。明白了?
注意: plugin.yml 和 config.yml 等文件里面强烈建议不要用中文。原因:Bukkit在编码这块没做好,读取时使用的是系统默认编码,而不同系统的默认编码不一样,所以有中文的 plugin.yml 会导致有些系统可以加载有些系统不能加载。如果想用中文,可以把中文转换为Unicode码再放 plugin.yml
主类的格式

明白为啥我说写插件简单了吧~
(上面从 JavaPlugin 类里重写所有的方法都是可选的,甚至一个空的类都可以当主类。不过那就会使你的插件变成真正意义上的“无卵用”插件
好了就讲这么多=-=我说过我这篇教程的目的是让你们学会如何写,而不是CV大法,以后代码一律用图片咯
如果有Java基础,相信上面的说明是很清楚明白的。
如果不明白,热烈欢迎问。但是注意,请不要问那些Java基础问题,帖子开头就说的很清楚,不会教Java相关知识。
所以我看到这种问题就别怪我不客气了a.a。但是在研究Java时遇到各种疑难杂症还是欢迎问滴~
祝大家学习愉快早日繁荣我大插件版233~
另:如果你能猜到我下一章打算讲什么,那说明你已经明白了学习写插件的真谛了。
↑上面的字可以点!可以点!可以点!可以点!
|
索引 & 第一章 |
|
| 此教程不会教你任何Java相关知识。 所以如果你不会Java就请不要来了。 在没有学会Java的情况下就不要想学插件了。 不要认为“边学插件边学Java就可以了”。 没有基础知识,你任然可以写插件(CV大法),但是你永远学不会。 但能写和会写是两回事。 因为,看不懂。 另:人无完人,此教程是基于我插件开发时的经验与认识并用我自己的语言描述出来,但能用的并不一定是好的,可能还有各种问题与不足。 如果您发现了问题,并且不认为已经无可救药了,绝对的欢迎指正,将此教程尽可能变的更好,更全面。 另外一点需要说明的是,由于我的强迫症关系,喜欢把能省去的空行都删了,还不喜欢给文字加上不同的样式,所以一堆小字挤在一起看起来可能会一堆一堆的非常复杂。。真抱歉。请尽量一句一句读,虽然很麻烦 |
|
继续查看请点击上面的目录翻页
2021.12 数据,可能有更多内容
↑上面的字可以点!可以点!可以点!可以点!
|
| 索引 & 第一章 |
|
| 此教程不会教你任何Java相关知识。 所以如果你不会Java就请不要来了。 在没有学会Java的情况下就不要想学插件了。 不要认为“边学插件边学Java就可以了”。 没有基础知识,你任然可以写插件(CV大法),但是你永远学不会。 但能写和会写是两回事。 因为,看不懂。 另:人无完人,此教程是基于我插件开发时的经验与认识并用我自己的语言描述出来,但能用的并不一定是好的,可能还有各种问题与不足。 如果您发现了问题,并且不认为已经无可救药了,绝对的欢迎指正,将此教程尽可能变的更好,更全面。 另外一点需要说明的是,由于我的强迫症关系,喜欢把能省去的空行都删了,还不喜欢给文字加上不同的样式,所以一堆小字挤在一起看起来可能会一堆一堆的非常复杂。。真抱歉。请尽量一句一句读,虽然很麻烦 |
|
继续查看请点击上面的目录翻页
一、Bukkit、CraftBukkit 与 NMS ?
Bukkit,又称BukkitAPI,指的是一套API,这套API单独拿出来没有任何功能,只是插件执行各种操作的接口(也许这个比喻不恰当?有更好的比喻欢迎指正)。它位于 org.bukkit 包
CraftBukkit 在 org.bukkit.craftbukkit 包。它内置Bukkit并实现了Bukkit。嗯,让我想想怎么说。举个梨子吧。
org.bukkit.entity.Player 接口。插件开发时或多或少都要通过这个接口来操作玩家。但它是一个接口,它没有具体的实现代码。那真正的实现到底在哪里呢?
org.bukkit.craftbukkit.VERSION.entity.CraftPlayer 类。对,这就是实现BukkitAPI的地方。
Bukkit中几乎每个接口都在CraftBukkit的对应位置有对应实现(很容易发现规律,例如 org.bukkit.block.Block接口 对应 org.bukkit.craftbukkit.block.CraftBlock)。org.bukkit.craftbukkit.VERSION.entity.CraftPlayer 类。对,这就是实现BukkitAPI的地方。
注: VERSION处指的是服务端的内部版本,例如1.8.8-r0.3是v1_8_r3,此后不再说明
那么为什么操作还必须要通过这一套接口呢?直接操作既方便又简单,并且能实现更多内部操作——bukkitapi没提供的操作,非常的powerful。
要理解这个问题的答案,必须先明白
为什么Java程序要分public,protected,private?直接用public不好么,既方便又简单,还不用写getter/setter
这个问题的答案。这个看似简单的问题非常有深度,于是让我们有请目前吃掉插件版3/9精华并正打算吃掉更多的,发过3个贴全是精华的,下一届艺术家提名的,在线时间555小时=我的1/4但贡献却比我还多的,脑洞简直不敢想象,码代码水平让我自叹不如的@CustomStuff 来进行解答与教♂育(给点面子回答一下呗~

咳咳,回到正题。
CraftBukkit虽说实现了Bukkit这套API,但是MC世界的各种逻辑并不是由它负责运算的。
负责运算的就是Mojang的官方服务端——NMS(啊这个名字可能不正式,但实在不知道还有什么称呼。NMS是它所在的包net.minecraft.server的缩写。
CraftBukkit使用MCP对NMS干了某些事情(咳咳)后使不能看的NMS能看懂了(勉强),然后对NMS进行了包装(BukkitAPI),在里面插♂入了各种与BukkitAPI交互的代码(也许还优化了NMS的代码),最终变成了我们现在见到的CraftBukkit服务端核心。举个梨子
既然NMS没有插件一说,那自然没有事件一说。所有事件都是CraftBukkit在NMS发生事件的地方插入进触发事件的代码,才得以执行的。
net.minecraft.server.VERSION.Explosion 类,是用来处理爆炸的。然后我们仔细看看就会发现,(经过简化,大致意思表现了。
这部分代码很明显就是CraftBukkit为了触发事件流程插♂进去的东♂西了。能理解吧?
看到这里,你应该明白为什么CraftBukkit被DMCA掉了,嗯。代码:
- BlockExplodeEvent event = new BlockExplodeEvent(location.getBlock(), blockList, 0.3F);
- world.getServer().getPluginManager().callEvent(event);
- if(event.isCancelled())
- return;
这部分代码很明显就是CraftBukkit为了触发事件流程插♂进去的东♂西了。能理解吧?
而Spigot又在CraftBukkit之上加入了自己的新api(例如 player.spigot().setViewDistance(10); ),并且对NMS进行了优化,在。
PaperSpigot也同样,在Spigot之上再加入更多的优化。
Caulrdon整合了Forge+Spigot,使其兼容mod。
那为什么Spigot和Cauldron避免了DMCA?抱歉这个我也不清楚(会不会是因为BuildTools呢,也许)。我只知道Paper避免版权问题的方式是:使用paperclip。至于什么是paperclip,paperclip的原理,不在赘述。
另: 本来官服只有 server.properties ,CraftBukkit的加入带来了 bukkit.yml ,Spigot的加入又带来了 spigot.yml , Paper的加入又带来了 paper.yml, Forge(Cauldron)的加入带来了 cauldron.yml。。真是有趣,对不对?
有没有明白为什么我之前说“不推荐导入服务端核心,因为里面的NMS与IDE的import补全联合一起会误导人”了吧。
一个Block类,在IDE的自动import补全里会显示:
添加 net.minecraft.server.v1_8_r3.Block 的 import
添加 org.bukkit.block.Block 的 import
添加 org.bukkit.craftbukkit.v1_8_r3.block.Block 的 import
由于NMS的“net”的'n'字母顺序在实际应该导入的bukkit的“org”的'o'之前,所以IDE会把NMS的import放前面,于是有些不明真相的初学者就导入了nms的包。这种事我见过好多次了呢添加 org.bukkit.block.Block 的 import
添加 org.bukkit.craftbukkit.v1_8_r3.block.Block 的 import
除非你知道你在做什么,导入时一定要导入 org.bukkit 开头的类并且里面没有出现 craftbukkit
二、什么是Bukkit插件?
Bukkit插件本质是一个Java程序,只是其符合了Bukkit插件的规范使CraftBukkit和基于CraftBukkit的服务端(以后统称CraftBukkit或cb,不再说明“基于CraftBukkit”)可以理解并加载。
那么这套规范是什么呢?
1. 每个插件将所有类必须打包为jar格式才能被读取并识别
2. 插件的Jar根目录必须有一个名为 plugin.yml 的符合 YAML语法 的文件。
3. plugin.yml 内必须按规范填写足够的保证插件能运行的信息。下面会详细说明。
4、插件内必须有一个类继承了 org.bukkit.plugin.java.JavaPlugin 来作为插件的主类(入口点,就像Java应用程序的main方法)
5、插件主类必须是公共的,并且有一个公共的构造方法。
满足以上条件的程序即为一个Bukkit插件。
三、一个最基本的Bukkit插件的结构
主类这个极其简单最后讲,我们先来说说 plugin.yml
其实 plugin.yml 的格式和规范完全可以在 http://wiki.bukkit.org/Plugin_YAML 找到。我就简单的说一下。
必须的值:
代码:
- name: CYQ # 插件名字,支持英文数字下划线连字符 - ,不推荐空格
- main: net.mcbbs.cyq.Main # 主类路径
- version: 1.0 # 版本。一般从1.0起始。
我建议加上
代码:
- author: 作者名
代码:
- authors: [作者1, 作者2, 作者3]
代码:
- description: 666 CYQ Attack # 插件描述不解释
- # BukkitWiki上提供的梨子是"This plugin is so 31337. You can set yourself on fire.",什么意思自己理解23333
- load: POSTWORLD # 插件何时被启用(enable
- # 可用的值为默认的 POSTWORLD 或 STARTUP
- # 什么意思呢?POSTWORLD 是指在服务器的世界加载完成后再启用插件(onEnable() 方法),STARTUP是在世界加载之前。
- # 为什么要指定这个值?如果你的onEnable里直接或间接的使用到了世界相关的方法,那么,哎这个不用说吧我觉得
- website: http://www.mcbbs.net/thread-568714-1-1.html
- # 不解释。跟author一样,标示作用
- database: false
- # http://wiki.bukkit.org/Plugin_Databases
- # 我就见过mcbbs里有一个人用,所以不翻译了。
- depend: [Synflood, DDoS]
- # 插件运行所必须的前置插件。如果CB检测到少了前置,会拒绝加载插件。此插件会在前置启用(onEnable)后被启用。
- softdepend: [LOIC]
- # 软前置。跟 depend 的唯一不同就是,它不是必须的,检测到缺少也会继续使用。如果你想让某插件在你的插件之前加载,就用它吧。
- loadbefore: [CYQ]
- # 哪些插件要在你的插件之后加载。跟 softdepend 与 depend 相反。与 softdepend 配合可以精确的控制插件加载顺序。
- commands:
- cyqattack: # 定义命令/cyqattack 。注意如果这个命令与原版命令重名,会覆盖原版命令。跟插件命令重名呢?抱歉没试过
- usage: Usage: /<command> [IP|Player]# 当 onCommand 返回false时的提示信息,<command>变量代表什么相信看的懂
- description: What a cyq? # 描述,显示在/help的不解释
- aliases: [cyq] # 指令别名。意思是 /cyq 和 /cyqattack 执行同样的代码
- permission: cyq.attack # 所需权限不解释
- permission-message: You do not have /<permission> # 当没权限时的提示。默认提示你应该见过的。<permission>变量无需解释。
- cyq: # 第二个命令,还可以继续添加
- usage: Usage: /<command> help # 这里所有选项均为可选。
- # 其实不需要指定这个也可以使用 hasPermission() 判断,这条我感觉惟一用途是指定默认值。。
- permissions:
- cyq.*
- description: Gives access to all CYQ commands # 不解释
- default: op # 默认值为什么。可用 true/false/op/not optrue表示默认所有人有权限,false默认所有人都没,op表示只有op有,not op只有op没
- children:
- cyq.attack: true # cyq.attack 权限是否继承 cyq.* 权限。wiki上这一段说的好像就这么多
- cyq.attack:
- description: "[REDACTED]" # 所有设置为可选
注意: plugin.yml 和 config.yml 等文件里面强烈建议不要用中文。原因:Bukkit在编码这块没做好,读取时使用的是系统默认编码,而不同系统的默认编码不一样,所以有中文的 plugin.yml 会导致有些系统可以加载有些系统不能加载。如果想用中文,可以把中文转换为Unicode码再放 plugin.yml
主类的格式

明白为啥我说写插件简单了吧~
(上面从 JavaPlugin 类里重写所有的方法都是可选的,甚至一个空的类都可以当主类。不过那就会使你的插件变成真正意义上的“无卵用”插件
好了就讲这么多=-=我说过我这篇教程的目的是让你们学会如何写,而不是CV大法,以后代码一律用图片咯
如果有Java基础,相信上面的说明是很清楚明白的。
如果不明白,热烈欢迎问。但是注意,请不要问那些Java基础问题,帖子开头就说的很清楚,不会教Java相关知识。
所以我看到这种问题就别怪我不客气了a.a。但是在研究Java时遇到各种疑难杂症还是欢迎问滴~
祝大家学习愉快
另:如果你能猜到我下一章打算讲什么,那说明你已经明白了学习写插件的真谛了。
本帖最后由 DGK2 于 2016-6-15 19:49 编辑
沙发有没有沙发奖励?
于是最近想努力一把参加第十届擂台赛,有时间在入坑吧
沙发有没有沙发奖励?
于是最近想努力一把参加第十届擂台赛,有时间在入坑吧
先怒拿2楼在看~
学到了。
额-.-我刚才忘记抢沙发了 QWQ
支持梨子~
支持梨子~
补充一下BukkitAPI的下载地址:https://hub.spigotmc.org/nexus/c ... /org/bukkit/bukkit/
和各种预编译好的服务端文件的下载网站:https://tcpr.ca/
另外个人比较喜欢用类似gradle这样的工具来管理依赖和做发布工作。
和各种预编译好的服务端文件的下载网站:https://tcpr.ca/
另外个人比较喜欢用类似gradle这样的工具来管理依赖和做发布工作。
抢个板凳先
高级入门知识。。
歪果仁小学生开发的插件他们咋做到的·
歪果仁小学生开发的插件他们咋做到的·
117779284 发表于 2016-6-15 20:14
高级入门知识。。
歪果仁小学生开发的插件他们咋做到的·
梨子也是小学生XD
梨子也开始做教程了..希望能把坑早日填完
为毛你能@到我但帖子里没看到哪里@了(
本帖最后由 CustomStuff 于 2016-6-15 23:57 编辑
噗看到问题了,我尽可能用大家听得懂的话来说。。
其实你问的是两个问题,一个是为啥要分成四种访问修饰符,另一个是getter和setter。。。
首先访问修饰符这个不是java的概念,事实上很多OO语言都有,这其实要从OO的发展来讲。
首先OO强调的是两个概念,职责与协作。(暂时不提封装、继承与多态)
所谓职责,就是一个类定义的是一组数据和在这组数据上的操作。
所谓协作,就是一系列的类的对象相互调用,完成我们想要的任务。
而封装与继承来自于职责,多态来自于协作。
当然你们可能会问写个软件不就是弄个机器码吗,为啥要这么多奇葩的东西(一堆语言,一堆设计的范式)?
事实上对于初级的程序员,需要关注的是怎么写出一个程序,然而程序语言/范式是为高级程序员准备的。
高级程序员关注的,是如何面对变更。面对变更的手段有很多,封装、继承和多态就是典型的用来面对变更的。(这也是我一直在强调的,判断代码好坏还要看代码面对新需求的能力)。
好了扯远了,来回归正题。
访问修饰符是封装的一个组成部分,封装的最终目的是为了达到功能内聚或逻辑内聚。
考虑到大部分人的英文水平,我就粘个百度的:http://baike.baidu.com/view/553710.htm
为了达到功能内聚和逻辑内聚,就需要达到一个类蕴含类中数据的所有操作,类边界以外受控制的访问类的数据,这就是封装(看清楚了,两个概念,语文要学好)。
如果类边界以外随意控制类的数据的话,最可能的结果就是破坏类数据的完整性——类:我的数据谁改的,一脸蒙蔽。
根据类边界以内和以外,可能分成私有的(private,只有自己能访问)和公有的(public,大家都能改)。
当我们引入了继承之后,我们类的边界就变得恶心了:子类属于类边界以内还是类边界以外?
于是仿照前面的思路,我们分配给子类一个受保护(protected)的访问权限。
而java有个很恶心的地方,就是它的高层模块是以包为单位的。(以满足共同封闭原则, 百度:
http://baike.baidu.com/subview/170036/6845485.htm )
因此java的设计师又异想天开地弄了个类边界以外、包边界以内的权限,叫package权限。
因此我们经常说java的访问权限从宽到严有四个级别:public、package,protected,private。
(咔,回答这个真特么降san值)
至于写成public方便嘛,我也觉得挺方便的,但也有条件,比如你觉得写getter太麻烦,就可以直接把那个字段写成public final类型。
但这么做有一个主要风险,就是面对变更的能力不好。比如你那个字段从原来的类移到了别的类去,你可能很多访问这个字段的类都要修改。
但是写成getter之后,除了这个类,别的类都不需要修改。(虽然我的个人喜好就是懒)
还没答完,关于getter和setter。
首先getter和setter的主要作用,在于:
1. 提供不存在于类的“字段”的修改和访问。比如你们经常写的圆,圆的类很可能就只存放圆的半径,但圆的类可以包含圆周长和面积的getter与setter,这是字段不可以做到的。
2. 提供数值的清洗功能。比如你要把某个有限定条件的字段改写掉,比直接修改字段,更有效的做法是利用setter进行清洗。而这种清洗也避免了分布式的修改,符合我们之前说的易于修改的要求。
噗看到问题了,我尽可能用大家听得懂的话来说。。
其实你问的是两个问题,一个是为啥要分成四种访问修饰符,另一个是getter和setter。。。
首先访问修饰符这个不是java的概念,事实上很多OO语言都有,这其实要从OO的发展来讲。
首先OO强调的是两个概念,职责与协作。(暂时不提封装、继承与多态)
所谓职责,就是一个类定义的是一组数据和在这组数据上的操作。
所谓协作,就是一系列的类的对象相互调用,完成我们想要的任务。
而封装与继承来自于职责,多态来自于协作。
当然你们可能会问写个软件不就是弄个机器码吗,为啥要这么多奇葩的东西(一堆语言,一堆设计的范式)?
事实上对于初级的程序员,需要关注的是怎么写出一个程序,然而程序语言/范式是为高级程序员准备的。
高级程序员关注的,是如何面对变更。面对变更的手段有很多,封装、继承和多态就是典型的用来面对变更的。(这也是我一直在强调的,判断代码好坏还要看代码面对新需求的能力)。
好了扯远了,来回归正题。
访问修饰符是封装的一个组成部分,封装的最终目的是为了达到功能内聚或逻辑内聚。
考虑到大部分人的英文水平,我就粘个百度的:http://baike.baidu.com/view/553710.htm
为了达到功能内聚和逻辑内聚,就需要达到一个类蕴含类中数据的所有操作,类边界以外受控制的访问类的数据,这就是封装(看清楚了,两个概念,语文要学好)。
如果类边界以外随意控制类的数据的话,最可能的结果就是破坏类数据的完整性——类:我的数据谁改的,一脸蒙蔽。
根据类边界以内和以外,可能分成私有的(private,只有自己能访问)和公有的(public,大家都能改)。
当我们引入了继承之后,我们类的边界就变得恶心了:子类属于类边界以内还是类边界以外?
于是仿照前面的思路,我们分配给子类一个受保护(protected)的访问权限。
而java有个很恶心的地方,就是它的高层模块是以包为单位的。(以满足共同封闭原则, 百度:
http://baike.baidu.com/subview/170036/6845485.htm )
因此java的设计师又异想天开地弄了个类边界以外、包边界以内的权限,叫package权限。
因此我们经常说java的访问权限从宽到严有四个级别:public、package,protected,private。
(咔,回答这个真特么降san值)
至于写成public方便嘛,我也觉得挺方便的,但也有条件,比如你觉得写getter太麻烦,就可以直接把那个字段写成public final类型。
但这么做有一个主要风险,就是面对变更的能力不好。比如你那个字段从原来的类移到了别的类去,你可能很多访问这个字段的类都要修改。
但是写成getter之后,除了这个类,别的类都不需要修改。(虽然我的个人喜好就是懒)
还没答完,关于getter和setter。
首先getter和setter的主要作用,在于:
1. 提供不存在于类的“字段”的修改和访问。比如你们经常写的圆,圆的类很可能就只存放圆的半径,但圆的类可以包含圆周长和面积的getter与setter,这是字段不可以做到的。
2. 提供数值的清洗功能。比如你要把某个有限定条件的字段改写掉,比直接修改字段,更有效的做法是利用setter进行清洗。而这种清洗也避免了分布式的修改,符合我们之前说的易于修改的要求。
107874017 发表于 2016-6-15 20:25
梨子也是小学生XD
艾玛·不可能吧··这小学生那也太有前途了···
本帖最后由 q513902026 于 2016-6-16 06:09 编辑
我要买本《Java从入门到精通》(ISBN 978-7-302-28756-8)
在看教学了_(:зゝ∠)_
在看教学了_(:зゝ∠)_
请问onEnable方法是必须要写吗?还有onLoad方法,我看别人的事例一般都加上onEnable()但什么都不写。
挖槽我好慌
黄总 发表于 2016-6-18 23:05
请问onEnable方法是必须要写吗?还有onLoad方法,我看别人的事例一般都加上onEnable()但什么都不写。 ...
所有方法都不是必须的
梨子大法好入教保平安
求主类格式复制下来。
zhangcy 发表于 2016-6-23 17:54
求主类格式复制下来。
您不适合学插件。
要是能单独推出一系列常用但是找不到教程和文档的东西的教程就好了
比如nbt nms之类的玩意儿
比如nbt nms之类的玩意儿
梨子大大,我的签名档拿去不要客气
简单明了...第二章应该是讲 注册,监听,,或者就是 spigotdoc类用法
我想做1.9的插件,用的是1.9的API,但编译出来1.9不能用,1.8能用。
学习一下
然后你的头像变了
你的人也变了
然后你的头像变了
你的人也变了
哇,这个帖子很详细哎,收藏一下。
难道只有我盯着屏幕盯了好久才理解CV大法师Ctrl+C和Ctrl+V?
当时我还奇怪?CV是什么?声优吗?
当时我还奇怪?CV是什么?声优吗?
不过对于我已经入门的人来说这些教程确实简单易懂
催更
大角虫你好
这个帖子完结了吗?是不是没有第二章了?
黄总 发表于 2016-8-6 14:34
这个帖子完结了吗?是不是没有第二章了?
第二章我在想应该怎么写。。头疼。
什么时候出第二章~
这个书号把我吓到了233
看来我的《从入门到弃坑》ISBN(978-7-302-22746-5)一定是盗版的!
不然我怎么还什么都不会!肯定是这个世界的错!
看来我的《从入门到弃坑》ISBN(978-7-302-22746-5)一定是盗版的!
不然我怎么还什么都不会!肯定是这个世界的错!
今日无事,来搞一发锟斤拷
梨子更新更新~
2个月啦还不更新{:10_498:}
2个月啦还不更新{:10_498:}
纯白剑姬 发表于 2016-8-24 21:38
这个书号把我吓到了233
看来我的《从入门到弃坑》ISBN(978-7-302-22746-5)一定是盗版的!
不然我怎么还什 ...
噗,为什么会有书叫这个名字
神の手 发表于 2016-7-22 17:43
难道只有我盯着屏幕盯了好久才理解CV大法师Ctrl+C和Ctrl+V?
当时我还奇怪?CV是什么?声优吗? ...
CV是什么?航母吗?(笑)
梨子出来。。
为什么我extends JavaPlugin后package那里就出错。。
用bukkit 1.8/1.8.8都是这样,而我用paperspigot1.8.8的就没事。。
为什么我extends JavaPlugin后package那里就出错。。
用bukkit 1.8/1.8.8都是这样,而我用paperspigot1.8.8的就没事。。
小0w0卡 发表于 2016-9-25 07:40
梨子出来。。
为什么我extends JavaPlugin后package那里就出错。。
用bukkit 1.8/1.8.8都是这样,而我用pap ...
请给出截图
小0w0卡 发表于 2016-9-25 14:11
另外,你这个帖子改更新了0w0
就是package XX.XX.XX的p下面被红色波浪线划了出来,有个错(eclipse),然后错误内容是:
The type com.avaje.ebean.EbeanServer cannot be resolved. It is indirectly referenced from required .class files
解决方法让我配置 build path。。。
請問这教學是以 1.10 為基础的嗎?
Tales 发表于 2016-9-25 16:28
請問这教學是以 1.10 為基础的嗎?
...目前为止本教程涉及的内容,是全版本通用——下至1.4.5,上至1.10。不过以后就说不定了。
andylizi 发表于 2016-9-25 16:54
...目前为止本教程涉及的内容,是全版本通用——下至1.4.5,上至1.10。不过以后就说不定了。 ...
梨子,我就是package XX.XX.XX的p下面被红色波浪线划了出来,有个错(eclipse),然后错误内容是:
The type com.avaje.ebean.EbeanServer cannot be resolved. It is indirectly referenced from required .class files
解决方法让我配置 build path。。。
很强势,不过我怎么喜欢写插件我喜欢命令方块,哪天可以用命令方块代替java就精彩了
andylizi 发表于 2016-9-25 16:54
...目前为止本教程涉及的内容,是全版本通用——下至1.4.5,上至1.10。不过以后就说不定了。 ...
好的~
順便想問一下問題! 因為我發不了貼= =
就是想做一個類似工業MOD裏的充電背包的話要怎樣做?
貼圖那邊我不知道需要怎樣畫
我只會把官方的裝備換顏色而已...
已经买了JAVA方面的书来学
不过好困难...仰望大佬
不过好困难...仰望大佬
你会Java么?很厉害!