实践Java

JDK-JRE-JavaSEApi

Java® Platform, Standard Edition & Java Development Kit Version 12 API Specification

从传统意义上讲,Java包含:

  • Java程序设计语言

  • Java虚拟机(JVM)

  • Class文件格式

  • Java API类库

  • 第三方Java类库

Java运行时环境(JRE)

Java开发工具包(JDK)

javac:编译

java:运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
$ java -h
用法: java [-options] class [args...]
           (执行类)
   或  java [-options] -jar jarfile [args...]
           (执行 jar 文件)
其中选项包括:
    -d32	  使用 32 位数据模型 (如果可用)
    -d64	  使用 64 位数据模型 (如果可用)
    -server	  选择 "server" VM
                  默认 VM 是 server,
                  因为您是在服务器类计算机上运行。


    -cp <目录和 zip/jar 文件的类搜索路径>
    -classpath <目录和 zip/jar 文件的类搜索路径>
                  用 : 分隔的目录, JAR 档案
                  和 ZIP 档案列表, 用于搜索类文件。
    -D<名称>=<值>
                  设置系统属性
    -verbose:[class|gc|jni]
                  启用详细输出
    -version      输出产品版本并退出
    -version:<值>
                  警告: 此功能已过时, 将在
                  未来发行版中删除。
                  需要指定的版本才能运行
    -showversion  输出产品版本并继续
    -jre-restrict-search | -no-jre-restrict-search
                  警告: 此功能已过时, 将在
                  未来发行版中删除。
                  在版本搜索中包括/排除用户专用 JRE
    -? -help      输出此帮助消息
    -X            输出非标准选项的帮助
    -ea[:<packagename>...|:<classname>]
    -enableassertions[:<packagename>...|:<classname>]
                  按指定的粒度启用断言
    -da[:<packagename>...|:<classname>]
    -disableassertions[:<packagename>...|:<classname>]
                  禁用具有指定粒度的断言
    -esa | -enablesystemassertions
                  启用系统断言
    -dsa | -disablesystemassertions
                  禁用系统断言
    -agentlib:<libname>[=<选项>]
                  加载本机代理库 <libname>, 例如 -agentlib:hprof
                  另请参阅 -agentlib:jdwp=help -agentlib:hprof=help
    -agentpath:<pathname>[=<选项>]
                  按完整路径名加载本机代理库
    -javaagent:<jarpath>[=<选项>]
                  加载 Java 编程语言代理, 请参阅 java.lang.instrument
    -splash:<imagepath>
                  使用指定的图像显示启动屏幕
有关详细信息, 请参阅 http://www.oracle.com/technetwork/java/javase/documentation/index.html。

可以传入命令行参数(空格分隔,从String args[]使用)

或者设定系统属性(-Dkey=value,通过System.getProperty(Key)使用)

或者JVM参数,比如:-Xmx4G等

主类:包含main方法,Java程序入口,可以接收参数(空格分隔),也是第一个被执行的方法。包含main方法的类成为Main Class(普通类而已,仅仅是多了main方法),也是运行类

1
2
3
public static void main(String args[]) {
    
}

源文件命名规则:如果包含多个类,那么最多只能有一个public类,则取public类的类名,如果没有public类,则可以取任何一个类的类名

-X

:主要用于对象和数组的内存分配(基本数据类型在栈中分配),堆由新生代和老年代组成,默认老年代与新生代的大小比为2:1,可以用过-XX:NewRatio调整,新生代由Eden区和两个Survivor区组成,默认Eden与Survivor的大小比为8:1,可以通过-XX:SurvivorRatio调整。

永久代:主要用于Class、方法和常量等内存分配;

-Xms:堆初始化大小,比如:-Xms4G;

-Xmx:堆最大值,比如:-Xmx4G;

-Xmn:设置新生代大小,比如:-Xmn2G

-XX:NewSize:设置新生代大小,比如:-XX:NewSize=2G

-XX:NewRatio:设置老年代与新生代的大小比,比如:-XX:NewRatio=2;

-XX:SurvivorRatio:设置Eden与Survivor的大小比,比如:-XX:SurvivorRatio=8;

-XX:PermSize:永久代初始大小,比如:-XX:PermSize=192m;

-XX:MaxPermSize:永久代最大值,比如:-XX:MaxPermSize=192m;

Java8中用MetaspaceSize取代了PermSize,Metaspace默认大小是20.8M

-XX:MetaspaceSize:Metaspace扩容时触发FullGC的初始化阈值

-XX:MaxMetaspaceSize:Metaspace最大容量

变量

field

成员变量(Member Variable)

property

对象的属性,对于JavaBean来说就是带getter/setter的field

修饰符

A类的实例变量或方法用Modifier修饰,对于在不同位置实例化的A类对A类中实例变量或方法的访问控制如下:

Modifier Class A Same package Different package
private yes no no
no modifier(package) yes yes no
protected yes yes no
public yes yes yes

A类的实例变量或方法用Modifier修饰,B类继承A类,B类对于A类中的实例变量或方法的继承控制如下:

Modifier Same package Different package
private no no
no modifier(package) yes no
protected yes yes
public yes yes

overload

重载,意即多样

override

重写,意即覆盖

参考

Thanking in Java 4th, Java 5/6

Core Java 8th, Java 6

Core Java 9th, Java 7

Core Java 10th, Java 8

Core Java SE 9 for the Impatient 2nd Edition, Java 9