概述
课堂笔记
Java程序必须要有一个入口函数
java使用一个固定的方法作为程序的入口,也就是无论写了多少个类,多个方法。jvm一定是从这个固定的程序入口方法开始执行代码的,为了性能够让jvm很好的识别这个入口方法,这个方法的编写形式是固定的:
public static void main(String[] args){}//变形一,一般写法
static public void main(String[] args){}//变形二, static public互换位置
public static void main(String[] param){}//变形三 方法中参数变量可以自定义
public static void main(String... args){}// 变形四 跟[]效果一样
package
在程序中,要区分一些东西,一般会采用【命名空间】的设计方式,这是大多数语音都会采用的方式。在java中使用包来对同名类进行区分。
java中定义包的语法: package xxx; //放在类文件首
包名通常全小写
例如:
package zhangsan;
public class Hello{
}
package lisi;
public class Hello{
}
将类文件用package定义之后 在物理空间上类文件也应该放在对应的文件夹下。
例如:
package com.unvoid.day02
public class Hello{
System.out.println("helloworld!");
}
------
java com.unvoid.day02.Hello
编译时可以使用javac的-d参数来自动生成文件路径
javac -d . Hello.java
-d:自动生成路径命令
. :指定生成路径的地址 .为在当前目录下
java -cp 可以改变本次jvm寻址 默认为在CLASSPATH下寻找.class文件
jar
使用jar命令将文件打包成jar包形式
jar {ctxu}[vfm0M] [jar-文件] [manifest-文件] [-C 目录] 文件名 ...
-c 创建新的 JAR 文件包
-v 生成详细报告并打印到标准输出
-f 指定 JAR 文件名,通常这个参数是必须的
[jar-文件] 即需要生成、查看、更新或者解开的 JAR 文件包,它是 -f 参数的附属参数
[manifest-文件] 即 MANIFEST 清单文件,它是 -m 参数的附属参数
[-C 目录] 表示转到指定目录下去执行这个 jar 命令的操作。它相当于先使用 cd 命令转该目录下再执行不带 -C 参数的 jar 命令,它只能在创建和更新 JAR 文件包的时候可用。
文件名 ... 指定一个文件/目录列表,这些文件/目录就是要添加到 JAR 文件包中的文件/目录。如果指定了目录,那么 jar 命令打包的时候会自动把该目录中的所有文件和子目录打入包中。
jar cvf test.jar test
执行结果是在当前目录生成了 test.jar 文件
jar cvfm test.jar manifest.mf test.class
在manifest.mf中 声明主方法入口 便可生成可执行jar
MAIN-CLASS: SimpleTest
直接运行jar包
使用 java命令时 附带-jar 参数可以直接运行jar包
java -jar hello.jar
- 执行该命令时,会用到目录META-INFMANIFEST.MF文件,
- 在该文件中,有一个叫Main-Class的参数,它说明了java -jar命令执行的类
import
在引用其他包的方法时 需要使用import导入对应包 从而直接使用对应包中的方法。
import com.unvoid.test//导入包
java.lang 包是java中唯一不用导入的包
类加载机制
类的生命周期包括以下七个阶段:
-
加载(Loading)
-
验证(Verification)
-
准备(Preparation)
-
解析(Resolution)
-
初始化(Initialization)
-
使用(Using)
-
卸载(Unloading)
类加载过程
包含了加载、验证、准备、解析、初始化这5个阶段。
-
加载是类加载的一个阶段 加载过程完成以下三件事
- 通过一个类的全限定名来获取定义此类的二进制字节流
- 将这个字节流所代表的静态存储结构转化为方法区的运行时存储结构
- 在内存中生成一个代表这个类的Class对象,作为方法区这个类的各种数据的访问入口
-
验证 主要确保class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。
-
准备
- 类变量是被static修饰的变量,准备阶段为类变量分配内存并设置初始值,使用的是方法区的内存。
- 实例变量不会在这阶段分配内存,它将会在对象实例化时随着对象一起分配在Java堆中。
- 常量会按照表达式来进行初始化,而不是赋值为0。
-
解析
将常量池的符号引用替换为直接引用的过程
-
初始化
初始化阶段才真正开始执行类中的定义的Java程序代码。初始化阶段即虚拟机执行类构造器() 方法的过程。
在准备阶段,类变量已经赋过一次系统要求的初始值,而在初始化阶段,根据程序员通过程序制定的主观计划去初始化类变量和其它资源。
类加载器
负责把class文件加载到内存的就是是类加载器,实现类的加载动作。在java虚拟机外部实现,以便让应用程序自己决定如何去获取所需的类。
JVM启动后,默认会有几种类加载器:
-
启动类加载器 bootstrapClassLoader,非java语言实现
作用:加载指定路径中jar里面的class文件
路径1:C:Program FilesJavajdk1.8.0_74jrelib
路径2:C:Program FilesJavajdk1.8.0_74jreclasses ( 如果有这个目录的话)
例如:rt.jar
-
扩展类加载器ExtClassLoader,java实现,是ClassLoader类型的对象
作用:加载指定路径中jar里面的class文件( 只能是jar中存在的class)
路径:C:Program FilesJavajdk1.8.0_74jrelibext
例如:ext中默认存在的jar,或者用户放到ext目录下的jar包
-
应用类加载器 AppClassLoader,java语言实现,是ClassLoader类型的对象
作用:加载指定路径中class文件或者jar里面的class文件
路径:CLASSPATH中配置路径,这个是用户自己配置的
例如:.:bin:hello.ja
我们最常使用的就是应用类加载器,因为它可以通过CLASSPATH中的路径,去加载程序员自己编 写并编译的class文件到内存中。
我们也可以把自己最常用的jar包,放到ext目录中,让扩展类加载器去自动加载这个jar中的class文 件到内存中,这样我们的代码就可以直接使用到这个jar中的类了
但是其实,大多数情况下,即使我们需要用到其他jar中的代码,也一般会把jar所在的路径配置到 CLASSPATH中,让应用类加载器进行加载,这样会更加方便统一管理项目中使用的所有jar
关于启动类加载器,它不是java语言编写的,我们一般也不要去动它的路径或者jar,它是负责在 JVM启动的时候,把JRE环境中最重要的一些library加载到内存,一旦出问题,JVM就无法正常运 行。
额外的: 如果想要看到类加载的过程可以通过运行时添加verbose选项进行输出。例如 java -verbose com.briup.day01.FirstPackage
双亲委托机制
多个类加载器之间共同协作,然后把需要使用或运行的类加载到内存去执行,它们直接共同合作 的方式就是双亲委托机制。
例如:java com.briup.test.Hello 命令
- 现在要加载Hello.class文件中的类
- 首先加载任务就交给了AppClassLoader
- 然后AppClassLoader把这个任务委托给自己的父加载器,也就是ExtClassLoader
- 然后ExtClassLoader把这个任务委托给自己的父加载器,也就是bootstrapClassLoader
- 然后bootstrapClassLoader就尝试去加载Hello这个类,但是在指定路径下并没有找到
- 然后任务又交回给了ExtClassLoader,ExtClassLoader尝试加载Hello这个类,但是在指定路径中没找 到
- 然后任务又交回给了AppClassLoader
- 最后AppClassLoader从CLASSPATH中指定的路径里面找到并加载了这个Hello类,完成类加载的过程
注释详解
-
/* */ 多行注释 可以在方法中写 注释每个变量的作用等
-
// 单行注释
-
/** */作为文档注释 用来注释方法 类的作用
配合一些注解可以完成文档的快速生成
- @author 标记作者
- @since 表示文件当前创建的时间
- @version 标记当前版本
- @return 标记返回值的描述
- @value 用于标注在常量上,用于表示常量的值
完成之后 通过 javadoc 命令可以根据注释生成文档
标识符
java中可以自定义的名字都是标识符
#### 规则
- 以字母,_,$开头
- 后接任意字母,数字,下划线,$
- 严格区分大小写
- 没有长度限制
- 不能是java中的关键字或者保留字
推荐命名规则
1. 标识符名字表意性要强
2. 包名一般使用域名倒过来写法,全小写
3. 类名 首字母大写,多个单词组成每个单词首字母都大写
4. 变量名,方法名。首字母小写。之后每个单词的首字母大写
5. 常量:全大写。单词之间使用下划线(_)分割
最后
以上就是暴躁香水为你收集整理的coreJava 学习笔记第二天的全部内容,希望文章能够帮你解决coreJava 学习笔记第二天所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复