0%

Java - 类与对象(二)

接上文

参考资料

《Java核心技术 卷1(第十一版)》

《Java基础核心总结》

菜鸟教程


非访问修饰符

final

final修饰符用于修饰变量、方法和类。

final变量

被final修饰的变量只能被赋值一次;被final修饰的实例成员必须显式指定初始值(可以在类声明或者构造函数中指定);final常与static一起用于声明类常量,如:

1
private static final int X = 10;

final方法

父类中的 final 方法可以被子类继承,但是不能被子类重写。声明 final 方法的主要目的是防止该方法的内容被修改。

1
public final void A() {...}

final类

final类不能被其他类继承。

1
public final class A {...}

final修饰符适用于基本数据类型或者不可变类(包含的所有类方法都不会改变其对象的类,比如String类);对于可变的类,使用final修饰符可能引起混乱。

1
private final StringBuilder e;	//此处的对象变量e类似于C++中的const指针,指向的对象是唯一的,但是对象本身的内容可以改变

static

static修饰符用于修饰类方法和类变量。

静态变量

static 关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝,拷贝由此类所有实例共享。静态变量也被称为类变量/类字段。局部变量不能被声明为 static 变量。

静态常量

static和final一起使用用于修饰静态常量,由于其不可更改,所以公共常量也比较常见,比如Math类中的圆周率PI和输出流System.out。

1
2
3
4
5
public class Math 
{
...
public static final double PI = 3.14159265358979323846;
}

静态方法

与C++相同,类静态方法没有this参数,所以也不能访问非静态的实例变量成员,但是可以访问静态变量。静态方法可以使用 类名.xxx实例名.xxx 进行调用。工厂方法(工厂模式)是静态方法的应用之一。

main方法也是典型的静态方法。main方法也不对任何对象进行操作,但是在程序启动时会执行并构造程序所需要的对象;每个类都可以由一个main方法,通过执行 java ClassName 可以运行不同类的main方法。


abstract

abstract 修饰符用于创建抽象类和抽象方法。


volatile

volatile修饰符可用于修饰变量。主要用于线程的编程。

synchronized

synchronized修饰符用于修饰方法。主要用于线程的编程。

transient

transient用于修饰变量。


Java允许 包 (package) 将类组织在一个集合中。使用包的主要原因是确保类名的唯一性(通过增加限定的包名)。

包的作用有

  • 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
  • 如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。
  • 包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。

类的导入

一个类可以使用其所属包中的任何类,以及其他包中的公共类。

类的访问方式有以下几种

1
2
3
4
5
6
7
8
//使用完全限定名:直接在包名后面跟上类名
java.time.LocalDate today = java.time.LocalDate.now();

//import某个包中所有类
import java.time.*;

//import某个特定类
import java.time.LocalDate;

星号 “*” 只能导入一个包,比如不能使用 import java.*导入以java为前缀的所有包。

有时候使用星号进行省略时,可能会出现命名冲突。例如,java.utiljava.sql 包中都有Date类,如果程序导入了这两个包且使用了Date类的话,编译器会报错。此时建议明确写出要使用哪个包里的Date类,如 import java.util.Date;

#include 和 import的区别

由于C++编译器不能查看除了头文件中包含的文件以及正在编译的文件以外的文件内部,所以必须使用 #include 来加载外部特性的声明;Java编译器则可以查看其他文件的内部,通过 import 来告诉它查看哪些文件。

可以认为Java中的 package 和 import 语句类似于C++中的 namespace 和 using 指令。

静态导入

import 语句可以允许直接导入静态方法和静态属性。

1
2
3
4
import static java.lang.System.*;	//或者直接导入,如import static java.lang.System.out;
...
out.println("Hello World!"); //可以不带前缀直接使用System类中的静态属性out
exit(0);

在包中增加类

将包名放在源文件的开头,即可将源文件内的类添加进包中;如果没有package语句,则源文件中的类属于无名包(没有包名)。

同时将源文件放入与完整包名匹配的文件子目录中(注意:编译器在编译源文件的时候 检查目录结构)。


文档注释

JDK包含了一个实用工具 javadoc,它可以由源文件生成一个HTML文档。

文档注释的格式是 /** 注释 */。每个文档注释包含标记和随后跟着的你想写的注释,标记以符号@开始,如@since和@author。

在自由文本中可以使用HTML的修饰符,例如<em> </em><img ……>。当文档中有用到其他文件的链接,例如图像文件,就应该将这些文件放到包含源文件的目录下的一个子目录中,Java doc工具将从源目录将子目录及其内容拷贝到文档目录中,同时在链接中需要使用文件在该子目录下的路径。

书上没啥实例示范,在网上找了大牛们的博客学习一下

Java-文档注释

如何写Java文档注释

Java文档注释用法+JavaDoc的使用详解

类注释

类注释必须放在import语句之后,类定义之前。

方法注释

方法注释必须放在所描述的方法之前;除了通用标记外,方法注释还可以使用标记如:

  • @param (给当前方法的参数部分添加一个条目,该描述可以占据多行,可以使用HTML标记,一个方法的param标记必须放在一起);
  • @return (给当前方法添加“返回”部分,可以占据多行,可以使用HTML标记);
  • @throws (添加一个注释表示该方法有可能抛出异常)。

字段注释

默认情况下,javadoc只对公有(public)属性和受保护属性(protected)产生文档。所以只需要对公共字段(通常指静态常量)建立文档,写在变量之前。

通用注释

@since,@author,@version

标记@since text 会建立一个“始于”条目,text 可以是引入某些特性的描述。

标记@author产生一个“作者”条目,可以有多个@author标记,一个标记对应一个作者。

标记@version产生一个“版本条目”,用于描述当前版本信息。

标记 @see reference 会在 “see also”(参见)部分添加一个条目,可以用在类或者方法中。reference可以有几种情况

  • “包名.类名#变量名或方法名”:javadoc会在文档中插入一个超链接,连接到注释所指的某个包的某个类的变量或者方法。可以省略包名和类名,省略包名时,范围为当前包中;省略了包名类名,范围为当前类
  • <a href = “……”> label </a>:指定一个超链接,可以超链接到任何URL,可以指定任意标签(label)
  • 任意文本 “……”:该文本会显示在“see also”部分

可以为一个特性添加多个 @see 标记,但是必须把他们放在一起。

可以在文档任何位置放置指向其他类或方法的超链接,通过插入标记{@link package.class#feature label},该标记使用规则与 @see 第一种情况相同。

在 Java 9 中,还可以使用 {@index entry} 标记为搜索框添加一个条目。

包注释

要想产生包注释,需要在每个包目录中添加一个单独的文件,方法有两种

  1. 提供一个名为package-info.java的Java文件。这个文件必须包含一个初始的以/*/界定的Java doc注释,后跟一个 package + 包名 语句,除此之外不能包含更多的其他注释和代码。
  2. 提供一个名为 package.html 的HTML文件,会抽取标记 <body>……</body> 之间的所有文本。

👉 javadoc工具的联机文档

-------------本文结束感谢您的阅读-------------