andylizi
本帖最后由 andylizi 于 2016-6-15 19:57 编辑

↑上面的字可以点!可以点!可以点!可以点!
某梨的插件开发教程

索引 & 第一章



前言

其实啊,写插件是一件非常非常非常非常非常简单的事情。
不过啊,有一个前提——
你会Java么?

此教程不会教你任何Java相关知识。
所以如果你不会Java就请不要来了。
在没有学会Java的情况下就不要想学插件了。
不要认为“边学插件边学Java就可以了”。
没有基础知识,你任然可以写插件(CV大法),但是你永远学不会。
但能写和会写是两回事。
因为,看不懂。

另:人无完人,此教程是基于我插件开发时的经验与认识并用我自己的语言描述出来,但能用的并不一定是好的,可能还有各种问题与不足。
如果您发现了问题,并且不认为已经无可救药了,绝对的欢迎指正,将此教程尽可能变的更好,更全面。


另外一点需要说明的是,由于我的强迫症关系,喜欢把能省去的空行都删了,还不喜欢给文字加上不同的样式,所以一堆小字挤在一起看起来可能会一堆一堆的非常复杂。。真抱歉。请尽量一句一句读,虽然很麻烦

能愉快的查看此教程所需的必要条件

  • 能力需求
    • Java
      • 完整基础知识
        • 结构,包,变量、常量,数据类型,数据类型转换,运算符,方法,流程控制语句,字符串,数组等等等等
      • 面向对象完整知识(非常重要少一个都不行,不然只能写hello world
        • 类与对象,继承,转型,方法重载,多态,抽象类,接口,final方法与final类,内部类(成员内部类 匿名内部类 局部内部类 静态内部类 及 内部类的继承)
      • 异常处理基础和中级知识
        • Throwable,Error,Exception与RuntimeException,try..catch..finally语句,throw、throws关键字,Java常见异常
        • 可以读懂Stacktrace(重要) 如果还认为报错是一堆乱码,也不是不能写插件,但调试错误会变的非常、非常困难。
      • 高级特性
        • 集合类,反射(非必须,如果你打算在插件中使用NMS的话),枚举类型,泛型,多线程
      • I/O
        • 流的相关知识
        • 能使用输入与输出流读取/写入数据(这个不强求必须知道原理
        • File类
        • 数据库操作(非必须,如果你想在插件中使用数据库连接)
      • 其他
        • 库的概念,API的概念
        • 导入库,使用库,import关键字
        注:我学习Java时使用的是《Java从入门到精通》(ISBN 978-7-302-28756-8),整本书看下来写插件基本就没问题了
        (这本书真的只能算基础,但是写简单的插件也不需要多高级的知识(俗话说写代码很难,写好代码更难,),但是等你开始接触更高深的内容时你会发现完全不够用)。

        不过不管你使用什么方式学习,千万别认为看了mcbbs那些Java教程就可以了。那些不可能做到全面系统的讲解。
    • 其他
      • 熟练的掌握 YAML语法。服主与插件猿必备知识。什么?怎么算熟练?看看这个
      • 至少小学的数学知识
      • 至少小学的英语知识
      • 至少小学的理解能力
      • 知道1+1等于几
  • 环境需求
    • 至少JDK 1.6开发环境
      • 建议不要使用JDK 1.8——因为,如果你使用JDK8写插件,那么写出来的插件只有Java8或以上版本才能运行了——

        而我们知道,1.7.10以下的forge对Java8过敏,只能使用Java7才能打开,
        而cauldron/mcpc+内置了forge,这就意味着,使用Java7或cauldron/mcpc+服务端完全无法使用你的插件。
      • 然而现在在Oracle Java官网是很难找到JDK7了因为被藏起来了,但翻了半天还是找到了下载地址。
        全版本JDK下载列表:http://www.oracle.com/technetwork/java/javase/archive-139210.html
        选择Java SE 7即可。
      • 不过开服务器还是建议使用Java8啦,性能优化做的好(并且还可以让你使用某些JDK8写出来的插件)
    • 一个你认为好用并且能熟练使用的IDE
      • 我用的是Netbeans
        虽然它功能没有Eclipse多也没有Eclipse有名,
        但是对于初学者来说简单易用(自带全中文+一键式操作),进入高级阶段时功能还可以通过插件扩展。

        而且我最开始学插件看的教程(忘了是哪个了)使用的IDE就是它。
        每个人有不同的看法,对于IDE来说你能熟练使用就行了。
        但如果你在这方面还什么也不知道,我会推荐Netbeans邪教的。

        希望这段话不要影响你对Eclipse的看法。如果你不喜欢IDE的话,
        记事本也可以【雾,只要你够牛逼。以前我写asp都是用记事本的
    • 一个可以用来测试你的插件的服务器
      • 你能想象写了插件却无法测试么?
        建议把测试服务端放在本机,而不要使用你的服务器的机房(毕竟你要经常测试,你能忍受调试代码时不断往机房上传么),用本地的服务器一个reload就可以了。
      • 测试服务器不需要你的电脑有多好,内存只要能支撑一个1人的服务器和你的mc客户端就行了..Spigot或PaperSpigot内存优化做的很好的
    • BukkitAPI
      • 然而我找不到BukkitAPI的下载地址了。。(补:找到了在这但最高1.7.6)(再补充:感谢RecursiveG提供的1.8以上的API)但是使用服务端的核心文件也可以的
        (虽然我不推荐这样做,因为里面的NMS与IDE的import补全联合一起会误导人)

        BuildTools如何指定下载版本(默认为最新):在BuildTools的命令行参数最后面添加 --rev [你要的版本]
      • 得到BukkitAPI后,在IDE中,添加一个类库,类路径选择你刚刚下载的API/或直接使用核心文件,JavaDoc请添加:
        Bukkit的JavaDoc:  https://hub.spigotmc.org/javadocs/bukkit
        Spigot的JavaDoc:  https://hub.spigotmc.org/javadocs/spigot
        (均为最新版本,会随着Spigot和Bukkit的发布而更新,比如我写这句话时是1.9)
        (BuildTools也会生成javadoc的,构建时加上 --generate-docs)

        不同IDE的具体添加库方法请百度
      • 如果你要开发给1.7.2服务端使用的插件,那么尽量选择1.7.2的API。
        虽然插件不同于mod,不同版本在一定程度上是兼容的,但是还是有些细节:比如Bukkit.getOnlinePlayers()方法的返回值等等。
        所以如果你要使用1.8的新特性:比如title或粘液块,那么就只能使用1.8的api。
        BukkitAPI大部分是向上兼容的。

继续查看请点击上面的目录翻页

2021.12 数据,可能有更多内容
↑上面的字可以点!可以点!可以点!可以点!
某梨的插件开发教程

索引 & 第一章



前言

其实啊,写插件是一件非常非常非常非常非常简单的事情。
不过啊,有一个前提——
你会Java么?

此教程不会教你任何Java相关知识。
所以如果你不会Java就请不要来了。
在没有学会Java的情况下就不要想学插件了。
不要认为“边学插件边学Java就可以了”。
没有基础知识,你任然可以写插件(CV大法),但是你永远学不会。
但能写和会写是两回事。
因为,看不懂。


另:人无完人,此教程是基于我插件开发时的经验与认识并用我自己的语言描述出来,但能用的并不一定是好的,可能还有各种问题与不足。
如果您发现了问题,并且不认为已经无可救药了,绝对的欢迎指正,将此教程尽可能变的更好,更全面。



另外一点需要说明的是,由于我的强迫症关系,喜欢把能省去的空行都删了,还不喜欢给文字加上不同的样式,所以一堆小字挤在一起看起来可能会一堆一堆的非常复杂。。真抱歉。请尽量一句一句读,虽然很麻烦

能愉快的查看此教程所需的必要条件

  • 能力需求
    • Java
      • 完整基础知识
        • 结构,包,变量、常量,数据类型,数据类型转换,运算符,方法,流程控制语句,字符串,数组等等等等
      • 面向对象完整知识(非常重要少一个都不行,不然只能写hello world
        • 类与对象,继承,转型,方法重载,多态,抽象类,接口,final方法与final类,内部类(成员内部类 匿名内部类 局部内部类 静态内部类 及 内部类的继承)
      • 异常处理基础和中级知识
        • Throwable,Error,Exception与RuntimeException,try..catch..finally语句,throw、throws关键字,Java常见异常
        • 可以读懂Stacktrace(重要) 如果还认为报错是一堆乱码,也不是不能写插件,但调试错误会变的非常、非常困难。
      • 高级特性
        • 集合类,反射(非必须,如果你打算在插件中使用NMS的话),枚举类型,泛型,多线程
      • I/O
        • 流的相关知识
        • 能使用输入与输出流读取/写入数据(这个不强求必须知道原理
        • File类
        • 数据库操作(非必须,如果你想在插件中使用数据库连接)
      • 其他
        • 库的概念,API的概念
        • 导入库,使用库,import关键字
        注:我学习Java时使用的是《Java从入门到精通》(ISBN 978-7-302-28756-8),整本书看下来写插件基本就没问题了
        (这本书真的只能算基础,但是写简单的插件也不需要多高级的知识(俗话说写代码很难,写好代码更难,),但是等你开始接触更高深的内容时你会发现完全不够用)。


        不过不管你使用什么方式学习,千万别认为看了mcbbs那些Java教程就可以了。那些不可能做到全面系统的讲解。
    • 其他
      • 熟练的掌握 YAML语法。服主与插件猿必备知识。什么?怎么算熟练?看看这个
      • 至少小学的数学知识
      • 至少小学的英语知识
      • 至少小学的理解能力
      • 知道1+1等于几
  • 环境需求
    • 至少JDK 1.6开发环境
      • 建议不要使用JDK 1.8——因为,如果你使用JDK8写插件,那么写出来的插件只有Java8或以上版本才能运行了——


        而我们知道,1.7.10以下的forge对Java8过敏,只能使用Java7才能打开,
        而cauldron/mcpc+内置了forge,这就意味着,使用Java7或cauldron/mcpc+服务端完全无法使用你的插件。
      • 然而现在在Oracle Java官网是很难找到JDK7了因为被藏起来了,但翻了半天还是找到了下载地址。
        全版本JDK下载列表:http://www.oracle.com/technetwork/java/javase/archive-139210.html
        选择Java SE 7即可。
      • 不过开服务器还是建议使用Java8啦,性能优化做的好(并且还可以让你使用某些JDK8写出来的插件)
    • 一个你认为好用并且能熟练使用的IDE
      • 我用的是Netbeans
        虽然它功能没有Eclipse多也没有Eclipse有名,
        但是对于初学者来说简单易用(自带全中文+一键式操作),进入高级阶段时功能还可以通过插件扩展。


        而且我最开始学插件看的教程(忘了是哪个了)使用的IDE就是它。
        每个人有不同的看法,对于IDE来说你能熟练使用就行了。
        但如果你在这方面还什么也不知道,我会推荐Netbeans邪教的。


        希望这段话不要影响你对Eclipse的看法。如果你不喜欢IDE的话,
        记事本也可以【雾,只要你够牛逼。以前我写asp都是用记事本的
    • 一个可以用来测试你的插件的服务器
      • 你能想象写了插件却无法测试么?
        建议把测试服务端放在本机,而不要使用你的服务器的机房(毕竟你要经常测试,你能忍受调试代码时不断往机房上传么),用本地的服务器一个reload就可以了。
      • 测试服务器不需要你的电脑有多好,内存只要能支撑一个1人的服务器和你的mc客户端就行了..Spigot或PaperSpigot内存优化做的很好的
    • BukkitAPI
      • 然而我找不到BukkitAPI的下载地址了。。(补:找到了在这但最高1.7.6)(再补充:感谢RecursiveG提供的1.8以上的API)但是使用服务端的核心文件也可以的
        (虽然我不推荐这样做,因为里面的NMS与IDE的import补全联合一起会误导人)


        BuildTools如何指定下载版本(默认为最新):在BuildTools的命令行参数最后面添加 --rev [你要的版本]
      • 得到BukkitAPI后,在IDE中,添加一个类库,类路径选择你刚刚下载的API/或直接使用核心文件,JavaDoc请添加:
        Bukkit的JavaDoc:https://hub.spigotmc.org/javadocs/bukkit
        Spigot的JavaDoc:https://hub.spigotmc.org/javadocs/spigot
        (均为最新版本,会随着Spigot和Bukkit的发布而更新,比如我写这句话时是1.9)
        (BuildTools也会生成javadoc的,构建时加上 --generate-docs)


        不同IDE的具体添加库方法请百度
      • 如果你要开发给1.7.2服务端使用的插件,那么尽量选择1.7.2的API。
        虽然插件不同于mod,不同版本在一定程度上是兼容的,但是还是有些细节:比如Bukkit.getOnlinePlayers()方法的返回值等等。
        所以如果你要使用1.8的新特性:比如title或粘液块,那么就只能使用1.8的api。
        BukkitAPI大部分是向上兼容的。

继续查看请点击上面的目录翻页

一、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)。
注: 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 类,是用来处理爆炸的。然后我们仔细看看就会发现,

代码:

  1. BlockExplodeEvent event = new BlockExplodeEvent(location.getBlock(), blockList, 0.3F);
  2. world.getServer().getPluginManager().callEvent(event);
  3. if(event.isCancelled())
  4.     return;
(经过简化,大致意思表现了。
这部分代码很明显就是CraftBukkit为了触发事件流程插♂进去的东♂西了。能理解吧?
看到这里,你应该明白为什么CraftBukkit被DMCA掉了,嗯。


而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 开头的类并且里面没有出现 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 找到。我就简单的说一下。
必须的值:

代码:

  1. name: CYQ    # 插件名字,支持英文数字下划线连字符 - ,不推荐空格
  2. main: net.mcbbs.cyq.Main   # 主类路径
  3. version: 1.0  # 版本。一般从1.0起始。
下面的为可选选项
我建议加上

代码:

  1. author: 作者名

代码:

  1. authors: [作者1, 作者2, 作者3]
为什么要加上?原因:这里是天朝。明白了?

代码:

  1. description: 666 CYQ Attack   # 插件描述不解释
  2. # BukkitWiki上提供的梨子是"This plugin is so 31337. You can set yourself on fire.",什么意思自己理解23333

  3. load: POSTWORLD   # 插件何时被启用(enable
  4. # 可用的值为默认的 POSTWORLD 或 STARTUP
  5. # 什么意思呢?POSTWORLD 是指在服务器的世界加载完成后再启用插件(onEnable() 方法),STARTUP是在世界加载之前。
  6. # 为什么要指定这个值?如果你的onEnable里直接或间接的使用到了世界相关的方法,那么,哎这个不用说吧我觉得

  7. website: http://www.mcbbs.net/thread-568714-1-1.html
  8. # 不解释。跟author一样,标示作用

  9. database: false
  10. # http://wiki.bukkit.org/Plugin_Databases
  11. # 我就见过mcbbs里有一个人用,所以不翻译了。

  12. depend: [Synflood, DDoS]
  13. # 插件运行所必须的前置插件。如果CB检测到少了前置,会拒绝加载插件。此插件会在前置启用(onEnable)后被启用。

  14. softdepend: [LOIC]
  15. # 软前置。跟 depend 的唯一不同就是,它不是必须的,检测到缺少也会继续使用。如果你想让某插件在你的插件之前加载,就用它吧。

  16. loadbefore: [CYQ]
  17. # 哪些插件要在你的插件之后加载。跟 softdepend 与 depend 相反。与 softdepend 配合可以精确的控制插件加载顺序。

  18. commands:
  19.     cyqattack:   # 定义命令/cyqattack 。注意如果这个命令与原版命令重名,会覆盖原版命令。跟插件命令重名呢?抱歉没试过
  20.   usage: Usage: /<command> [IP|Player]# 当 onCommand 返回false时的提示信息,<command>变量代表什么相信看的懂
  21.   description: What a cyq?   # 描述,显示在/help的不解释
  22.   aliases: [cyq]    # 指令别名。意思是 /cyq 和 /cyqattack 执行同样的代码
  23.   permission: cyq.attack  # 所需权限不解释
  24.   permission-message: You do not have /<permission>    # 当没权限时的提示。默认提示你应该见过的。<permission>变量无需解释。
  25.     cyq:   # 第二个命令,还可以继续添加
  26.   usage: Usage: /<command> help   # 这里所有选项均为可选。

  27. # 其实不需要指定这个也可以使用 hasPermission() 判断,这条我感觉惟一用途是指定默认值。。
  28. permissions:
  29.     cyq.*
  30.   description: Gives access to all CYQ commands    # 不解释
  31.   default: op    # 默认值为什么。可用 true/false/op/not optrue表示默认所有人有权限,false默认所有人都没,op表示只有op有,not op只有op没
  32.   children:
  33.    cyq.attack: true   # cyq.attack 权限是否继承 cyq.* 权限。wiki上这一段说的好像就这么多
  34.     cyq.attack:
  35.   description: "[REDACTED]"    # 所有设置为可选

注意: plugin.yml 和 config.yml 等文件里面强烈建议不要用中文。原因:Bukkit在编码这块没做好,读取时使用的是系统默认编码,而不同系统的默认编码不一样,所以有中文的 plugin.yml 会导致有些系统可以加载有些系统不能加载。如果想用中文,可以把中文转换为Unicode码再放 plugin.yml


主类的格式

明白为啥我说写插件简单了吧~
(上面从 JavaPlugin 类里重写所有的方法都是可选的,甚至一个空的类都可以当主类。不过那就会使你的插件变成真正意义上的“无卵用”插件


好了就讲这么多=-=我说过我这篇教程的目的是让你们学会如何写,而不是CV大法,以后代码一律用图片咯
如果有Java基础,相信上面的说明是很清楚明白的。
如果不明白,热烈欢迎问。但是注意,请不要问那些Java基础问题,帖子开头就说的很清楚,不会教Java相关知识。
所以我看到这种问题就别怪我不客气了a.a。但是在研究Java时遇到各种疑难杂症还是欢迎问滴~


祝大家学习愉快早日繁荣我大插件版233~


另:如果你能猜到我下一章打算讲什么,那说明你已经明白了学习写插件的真谛了。



DGK2
本帖最后由 DGK2 于 2016-6-15 19:49 编辑
沙发有没有沙发奖励?
于是最近想努力一把参加第十届擂台赛,有时间在入坑吧



孤独秋叶
先怒拿2楼在看~

Mistook
学到了。

额-.-我刚才忘记抢沙发了 QWQ
支持梨子~

RecursiveG
补充一下BukkitAPI的下载地址:https://hub.spigotmc.org/nexus/c ... /org/bukkit/bukkit/
和各种预编译好的服务端文件的下载网站:https://tcpr.ca/
另外个人比较喜欢用类似gradle这样的工具来管理依赖和做发布工作。

907154475
抢个板凳先

117779284
高级入门知识。。
歪果仁小学生开发的插件他们咋做到的·

107874017
117779284 发表于 2016-6-15 20:14
高级入门知识。。
歪果仁小学生开发的插件他们咋做到的·

梨子也是小学生XD

ju哌y
梨子也开始做教程了..希望能把坑早日填完

CustomStuff
为毛你能@到我但帖子里没看到哪里@了(

CustomStuff
本帖最后由 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进行清洗。而这种清洗也避免了分布式的修改,符合我们之前说的易于修改的要求。

117779284
107874017 发表于 2016-6-15 20:25
梨子也是小学生XD

艾玛·不可能吧··这小学生那也太有前途了···

q513902026
本帖最后由 q513902026 于 2016-6-16 06:09 编辑


迷の十六
我要买本《Java从入门到精通》(ISBN 978-7-302-28756-8)
在看教学了_(:зゝ∠)_

黄总
请问onEnable方法是必须要写吗?还有onLoad方法,我看别人的事例一般都加上onEnable()但什么都不写。

晚安2001
挖槽我好慌

andylizi
黄总 发表于 2016-6-18 23:05
请问onEnable方法是必须要写吗?还有onLoad方法,我看别人的事例一般都加上onEnable()但什么都不写。 ...

所有方法都不是必须的

hhttll
梨子大法好入教保平安

zhangcy
求主类格式复制下来。

andylizi
zhangcy 发表于 2016-6-23 17:54
求主类格式复制下来。

您不适合学插件。

914554688wyt
要是能单独推出一系列常用但是找不到教程和文档的东西的教程就好了
比如nbt   nms之类的玩意儿

@@Leo
梨子大大,我的签名档拿去不要客气

lsz7575
简单明了...第二章应该是讲 注册,监听,,或者就是 spigotdoc类用法

拉普达
我想做1.9的插件,用的是1.9的API,但编译出来1.9不能用,1.8能用。

喵喵人
学习一下
然后你的头像变了
你的人也变了

freshlingz
哇,这个帖子很详细哎,收藏一下。

神の手
难道只有我盯着屏幕盯了好久才理解CV大法师Ctrl+C和Ctrl+V?

当时我还奇怪?CV是什么?声优吗?

defoliation_h
要我说,教程已经有很多了,但是bukkit的汉化什么好啊.

不过对于我已经入门的人来说这些教程确实简单易懂

914554688wyt
催更

Small_king
大角虫你好

黄总
这个帖子完结了吗?是不是没有第二章了?

andylizi
黄总 发表于 2016-8-6 14:34
这个帖子完结了吗?是不是没有第二章了?

第二章我在想应该怎么写。。头疼。

_DIM_
什么时候出第二章~

纯白剑姬
这个书号把我吓到了233
看来我的《从入门到弃坑》ISBN(978-7-302-22746-5)一定是盗版的!
不然我怎么还什么都不会!肯定是这个世界的错!

asdfg25855
今日无事,来搞一发锟斤拷

小0w0卡
梨子更新更新~
2个月啦还不更新{:10_498:}

Minecraftmoon
纯白剑姬 发表于 2016-8-24 21:38
这个书号把我吓到了233
看来我的《从入门到弃坑》ISBN(978-7-302-22746-5)一定是盗版的!
不然我怎么还什 ...

噗,为什么会有书叫这个名字

sofa
神の手 发表于 2016-7-22 17:43
难道只有我盯着屏幕盯了好久才理解CV大法师Ctrl+C和Ctrl+V?

当时我还奇怪?CV是什么?声优吗? ...

CV是什么?航母吗?(笑)

小0w0卡
梨子出来。。
为什么我extends JavaPlugin后package那里就出错。。
用bukkit 1.8/1.8.8都是这样,而我用paperspigot1.8.8的就没事。。

andylizi
小0w0卡 发表于 2016-9-25 07:40
梨子出来。。
为什么我extends JavaPlugin后package那里就出错。。
用bukkit 1.8/1.8.8都是这样,而我用pap ...

请给出截图

小0w0卡


另外,你这个帖子改更新了0w0

小0w0卡
小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。。。

Tales
請問这教學是以 1.10 為基础的嗎?

andylizi
Tales 发表于 2016-9-25 16:28
請問这教學是以 1.10 為基础的嗎?

...目前为止本教程涉及的内容,是全版本通用——下至1.4.5,上至1.10。不过以后就说不定了。

小0w0卡
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。。。

Green_stone
很强势,不过我怎么喜欢写插件我喜欢命令方块,哪天可以用命令方块代替java就精彩了

Tales
andylizi 发表于 2016-9-25 16:54
...目前为止本教程涉及的内容,是全版本通用——下至1.4.5,上至1.10。不过以后就说不定了。 ...

好的~
順便想問一下問題! 因為我發不了貼= =
就是想做一個類似工業MOD裏的充電背包的話要怎樣做?
貼圖那邊我不知道需要怎樣畫
我只會把官方的裝備換顏色而已...

DGai
已经买了JAVA方面的书来学
不过好困难...仰望大佬

hanjun62
你会Java么?很厉害!

下一页 最后一页