杰普04corejava02
一、上一节课复习
1、java三大技术体系:
- Java SE
- Java EE
- Java ME
2.java语言的特点:
1)跨平台
为什么能跨平台?
java程序运行在java虚拟机上,各系统对应着相应的虚拟机,虚拟机能把java源代码翻译成各系统的机器指令去执行,有了底层的虚拟机,java便可以跨平台了。
2)面向对象编程语言
java是第三代编程语言。
类:相同特征对象的集合,java中最小的单元。
对象:万物皆对象,可以是虚拟的,类的具体化,java中最小的存储单元
java编程:定义类及其属性行为,通过类的产生的对象相互作用达到想要的效果
3)不需要内存管理、指针管理
jvm自带垃圾回收器,垃圾回收器会自动回收系统中的垃圾
当对象不再被使用时就是垃圾,会被垃圾回收器回收
开发人员不能调用代码让垃圾回收,只能请求垃圾回收器回收(System.gc()😉
4)jdk、jvm、jre
jdk:java development kit java开发工具包/库
jre:java runtime environment java运行环境
jvm:java virtual machine java虚拟机
5)helloworld编写
源程序(.java)---编译-----》字节码文件(.class)
public class A{
public static void main(String[] args){
System.out.println("helloworld");
}
}
6)字节码文件怎么被执行
字节码验证
- 验证字节码文件的虚拟机版本是否兼容
- 检查当前代码是否会破会系统完整性
- 检查当前代码是否有栈溢出的情况
- 检查当前代码的参数类型是否正确
- 检查当前代码中的类型转换操作是否正确
字节码文件执行
交由HotSpot虚拟机机制执行
解释器:将字节码文件翻译成机器指令
即时解释器(JIT):JIT热点侦测,将热点代码直接翻译成机器指令
pc寄存器:存储下一个即将要执行的指令
二、理解java
理解Java中的一些问题
1)写java代码为啥要先建一个类?
Java语言规定:在大多数情况下,java执行的代码需要写到方法中 ,而方法需要写到类中,类是java中组织代码的基本单元.
2)为什么要有main方法?
Java规定:main方法是程序执行的入口,方法的编写形式是固定的。
3)System.out.println("hello world");这句代码是什么意思?
System是Java SE-API(应用程序编程接口)提供的一个类。
out是System类下的一个属性。
println是out属性下的一个方法。
通过调用System类下的out属性的println方法来打印出“hello world”这句话。
4)在A.java程序中为什么可以使用System类?
System类是java.lang包下的一个类,在java源码中已被编写(src.zip),并被编译成 .class 文件打包到rt.jar中,是启动类加载器加载的一个包,会被自动加载到jvm中,可以不用import直接使用。
5)系统如何找到A.java编译成的A.class字节码文件?
通过环境变量中配置的CLASSPATH来找到 .class 文件的目录。
JAVA_HOME=/home/briup/jdk/jdk1.8.0_152
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.
export JAVA_HOME PATH CLASSPATH
以上是 **Java环境变量在Linux中的配置内容 **,按照上边的环境变量配置, .class文件是生成在.java文件的同一级目录下 。
6) 如何看到类加载内容?
java -verbose A
7) 类名和文件名有啥关系?
java语言规定:每个 .java文件中只能有一个public类,而且public类的类名应该和文件名是一致的。
三、package java中包的引入
1.包的简介
package就是类的命名空间,用来区分相同类(唯一标识)。实质是一层一层的文件夹。
例:假如张三有一个类文件叫hello,李四也有一个类文件叫hello,那么他两的代码合并就会产生冲突,而如果给他两都加上包,(加上包,张三的hello文件在zhangsan的文件夹下,李四的文件在lisi的文件夹下)就能解决这个问题。
没有引入包是这样的(两个文件冲突,正常会被覆盖或文件被重命名图中为被覆盖情况):
引入包后是这样的:
2.包的命名规则
一般情况,公司、组织、社团等,他们包的命名就是把官网域名倒过来(域名全球唯一 )。
如:com.briup.Demo
个人的可以是:com.name.Demo(name是你的名字)
3.类名区分
简单类名:就直接一个类名,如:Hello
全限定名:包名加类,如:com.xiaocheng.Hello
3.使用包的一些注意事项
-
使用包的类,在编译后必须有和包名对应的文件夹,若文件夹没有存在,则运行时报错:找不到或无法加载主类
自动创建包名对应的目录结构:
java -d . Hello (该命令中.表示在当前目录下创建对应目录)
-
包和包之间用点( . )隔开
-
类一旦指定了包,运行时一定要带上包名
-
如果.class文件和.java文件不在同一个目录下,那么可以使用以下命令:
java -cp 指定临时classpath变量
如:java -cp ./bin com.briup.Hello
四、 jar
jar:将.class文件打包。
例:假设A.class文件路径: ./bin/com/briup/day2/A.class 文件包名是com.briup.day2
jar -cvf A.class -C bin 切换到bin目录下
注:jar打包需要在jar包中的META-INF文件夹下MANIFEST.MF文件中添加该包主类,加入内容为 :Main-Class: com.briup.day2.A 需要注意加入内容格式,在:后有空格,内容皆为英文输入,若输入错误报错内容如下:
五、类加载
1.什么是类加载
简单地说,类加载就是把类的数据从.class 文件以二进制的形式加载到内存中。
2.类加载器的种类有:
-
启动类加载器
加载路径:./jdk/jre/lib
-
扩展类加载器
加载路径:./jdk/jre/ext
-
应用类加载器
-
自定义加载器
-