当前位置: 首页 > 科技观察

说说Java面向对象

时间:2023-03-20 20:47:42 科技观察

前言上一篇讲了面向的三大特性(封装、继承、多态)和面向对象设计的五原则(SRP、OCP、LSP、DIP、ISP)。另外,我们还讲了如何创建类,创建类后如何构造对象。然后还介绍了类中的属性和方法,也简单说明了构造方法和引用。有了上面的基础,今天我们继续学习面向对象的相关知识。主要内容预览如下:packageannotationjarfilecreationpackage假设现在有这样一种情况,诸葛亮、周瑜、曹操共同开发一个程序。其中,周瑜和曹操都在自己的代码模块中写了一个PublicUtil类。现在诸葛亮要调用周瑜和曹操模块中的代码,需要同时使用他们的PublicUtil类。使用PublicUtil类时,如何区分是呼叫周瑜还是呼叫曹操?针对这个问题,开发Java的前辈们当然想到了。于是,他们在Java中定义了一个命名空间,也就是我们今天要说的包:package。通过使用包机制,很容易区分类名的命名空间。假设曹操的PublicUtil类代码如下://声明包名packagecaocao;publicclassPublicUtil{……}周瑜的PublicUtil类代码如下://声明包名packagezhouyu;publicclassPublicUtil{……}这时候如果诸葛亮要在他们两个代码中同时使用PublicUtil类,这时候可以引入他们的包,然后通过包名.类名引用的方式来区分。packagezhougeliang;importcaocao;importzhouyu;publicclassUtil{//使用周瑜的代码zhouyu.PublicUtil.xxx();...//使用曹操的代码caocao.PublicUtil.xxx();...}importyouintheabovecode你可能在其他代码中看到过它,但你不知道它是干什么的。其实它就是为了包的使用而生的。如果我想使用别人的包裹,我该怎么办?其实很简单,只需要在程序中使用关键字import就可以完成包的导入。使用包可以达到以下效果:将具有相似或相关功能和接口的类和接口组织在同一个包中,方便类的查找和使用。像文件夹一样,包存储在树目录中。同一个包中的类名不同,不同包中的类名可以相同。当同时调用两个不同包中具有相同类名的类时,可以通过添加完整的包名来区分,从而避免类名冲突。同时,该包还限制了访问权限。只有具有包访问权限的类才能间接访问包中的类。注释所谓注释就是写在程序中对代码结尾进行说明的文字,方便自己和他人更快地查看和理解程序的含义。并且注释不影响程序的执行。我们编译Java源代码后,字节码文件不包含源代码中的注释。Java中通常支持三种注释,分别是://:单行注释/**/:多行注释/***/:文档注释单行注释单行注释用double标识斜线//,表示只注释当前行的内容,一般用在需要注释的内容较少的地方。以下是单行注释的示例。//第一个Java程序publicclassHelloWorld{publicstaticvoidmain(String[]args){System.out.println("HelloWorld!");}}多行注释通常我们把要注释的内容放在/*和*/之间,表示两者之间的内容就是我们的注释内容,下面是一个多行注释的例子。/**第一个Java程序*这是很多初学者都会写的程序*/publicclassHelloWorld{publicstaticvoidmain(String[]args){System.out.println("HelloWorld!");}}文档注释文档注释和多行注释很相似,就是在/**和*/之间包含我们需要注释的内容。文档注释与其他两种注释最大的区别在于,我们可以使用javadoc工具提取文档注释,然后生成一个HTML文档,类似于Java官网提供的API文档。以下是文档注释的示例。/***第一个Java程序*这是很多初学者写的程序*/publicclassHelloWorld{/***主函数*@paramargs主函数??参数列表*/publicstaticvoidmain(String[]args){System.out.println("你好,世界!");然后我们可以通过终端使用javadoc命令为上述文件生成一个HTML文档。与其他两种注释相比,javadocHelloWorld.java在文档注释中有更多值得注意的地方。让我们来看看需要注意的地方。1.常见文档评论的分类类评论顾名思义,所谓类评论就是对整个类的描述。它必须放在导入之后,但在类定义之前。下面是一个类注释的例子:/***Animal,animalclass*/publicclassAnimal{...}这里需要注意的是,/**和*/、*之间的其他行注释是可选的,不需要说起来,之所以加上它,是出于审美上的考虑。把上面的例子写成下面的样式也是合法的。/**Animal,animalclass*/publicclassAnimal{...}方法注解同样,方法注解是对类中方法的注解,必须放在所描述的方法之前。一般来说,除了说明方法的功能外,我们还经常使用下面的标签来对方法进行注解。标记描述@param变量描述用于介绍当前方法的参数,可以占据多行@return描述用于描述当前方法的返回值,可以跨越多行@throws类描述用于表示方法可能抛出的异常。下面是一个方法注释的例子:/***findhoftwonumbers*@paramnum1addend1*@paramnum2addend2@returnsumoftwonumbers*/publicintadd(intnum1,intnum2){returnnum1+num2;}字段注解字段注解,顾名思义,就是对类中字段的描述,用来描述字段的含义。以下是字段注释的示例。publicclassCuncyu{/***公众号*/publicStringwePublic;}当然,如果你不喜欢把一个字段的注释分成多行,也可以写成下面的格式。publicclassCuncyu{/**公众号*/publicStringwePublic;}这两种方法都可以,没有好坏之分,大家可以根据自己的风格来选择。但是在IntelliJIDEA等IDE中,如果对代码进行格式化,IDEA会将第二种方法格式化为第一种方法,需要注意。2.如何提取文档注释假设有下面一段代码,我们需要生成关于这段代码的文档。然后可以使用JDK中提供的javadoc命令提取代码的文档注释。/***第一个Java程序*这是一个初学者基本都会写的程序*@author村雨鼎*@version1.0*/publicclassHelloWorld{/***主函数:程序入口*@paramargs主函数??参数列表*/publicstaticvoidmain(String[]args){System.out.println("HelloWorld!");}}然后使用下面的命令来生成我们的文档注释。javadoc-dhelloworld-author-version-encodingUTF-8HelloWorld.java上面命令的意思是提取名为HelloWorld.java的文档注释,并将输出文件放在helloworld文件夹下,文档中包含作者程序的版本号,编码方式为UTF-8。生成的文件列表的详细信息如下图所示。打开index.html查看提取的文档评论。jar文件的创建其实就是讲这个的,我在上一篇文章中也有写到。但是,我使用IntelliJIDEA来打包代码。有兴趣的可以点击下方传送门看看。如何使用IntelliJIDEA创建Java入门应用程序[1]。但这是在工具的帮助下生成的。今天我们就来看看如何使用JDK提供的命令行工具制作一个可以打印出HelloWorld的jar包吧!同样,我们还需要准备一个可以输出HelloWorld的Java源码!并将其命名为HelloWorld.java。publicclassHelloWorld{publicstaticvoidmain(String[]args){System.out.println("HelloWorld!");}}接下来,使用javac命令编译该文件,然后生成HelloWorld.class字节码文件。javacHelloWorld.java然后用jar命令打包生成的字节码文件。jar-cvfhello.jarHelloWorld.class其中c表示创建一个新的jar包,v表示打印创建过程中的信息,f表示命名新生成的jar。最后使用如下命令运行jar包。java-jarhello.jar然而,我们想要的结果并不会顺利出现。这时候会报错,hello.jar中没有mainlist属性。这是因为我们没有在MENIFEST.MF文件中添加Main-Class属性。使用压缩软件打开新建的hello.jar。除了HelloWorld.class文件,里面还会有一个META-INF文件夹,里面还有一个MENIFEST.MF文件。这时候我们只需要用编辑器打开文件,在文件中添加如下代码即可。(记得在添加后在整个文件的末尾保留一个空行)。Main-Class:添加HelloWorld后,再次运行java-jarhello.jar,即可成功打印HelloWorld!在控制台上。参考[1]如何使用IntelliJIDEA创建Java入门应用:https://cunyu1943.github.io/JavaPark/dev-tools/idea/java-quick-start-with-idea。