第一章【安装、配置、编写、理解】
一、JDK
1、相关名词
SDK:软件开发包
JDK:java程序开发工具包
JRE:java程序运行环境
API:应用程序编程接口
API Documentation:API说明文档
2、jdk安装
3、oracle官方文档中提供的JDK结构图:
4、JDK目录
sun公司程序员--编写基础的代码-->*.java --压缩-- >src.zip --编译--> *.class --归档-->rt.jar
二、面向对象
1、OOP理念
面向对象编程(Object-Oriented Programming,OOP)
面向对象的特征:抽象、封装、继承、多态。
- 封装是一种对象功能内聚的表现形式,使模块之间耦合度变低,更具有维护性;
- 继承使子类能够继承父类,获得父类的部分属性和行为,使模块更有复用性;
- 多态使模块在复用性基础上更加有扩展性,使运行期更有想象空间
- 抽象是面向对象思想最基础的能力之一,正确而严谨的业务抽象和建模分析能力是后续的封装、继承、多态的基础,是软件大厦的基石。
Java 之父 Gosling 设计的 Object 类,是任何类的默认父类,是对万事万物的抽象。
三、JVM
四、垃圾回收器
java代码中,开辟要使用的内存空间,使用new关键字即可完成,使用完之后,对内存的释放,在JVM中,由垃圾回收器(Garbage Collection,GC)来完成。
五、字节码验证
一个class文件被加载到JVM内存之后,首先要经过字节码验证,主要包含:
-
检查当前class文件的版本和JVM的版本是否兼容
-
检查当前代码是会破坏系统的完整性
-
检查当前代码是否有栈溢出的情况
-
检查当前代码中的参数类型是否正确
-
检查当前代码中的类型转换操作是否正确
六、编写Java程序
1、书写Java文件的过程
vim Hello.java
2、程序中出现主方法
3、将Java文件编译成class文件
javac Hello.java
4、执行程序
java Hello
参数:
-cp:在【本次命令】中【临时指定】类加载器去哪个位置加载我们需要执行的程序
java -cp src Hello
-verbose:将JVM启动运行的时候加载的信息输出出来
java -verbose Hello
java -verbose Hello > a.txt
-d:指定放置生成的类文件的位置
javac -d bin Hello.java
【注意】在书写Java文件的时候的注意事项
1、源文件后缀名必须为.java
2、一个java源文件中可以包含很多个Java类,但是有且只有一个使用public修饰的类,并且使用public修饰的类的类名和源文件名保持一致。
3、一个类要想执行,需要在这个类中出现主函数,否则只能通过调用的方式执行main方法,与类是否使用public没有任何关系,只要想运行就添加public。
七、package
1、定义包结构,将编译过后的class文件需要放在指定的包结构下面
2、Java中定义的包结构实际上在计算机上是以文件夹的形式存在
3、package定义是可添也可不添。包名.类名
4、如果要添加包结构必须放在所有程序的第一行
5、包结构允许出现多层,使用.分割
package com.briup.day2;
public class Hello{}
类的全限定名:
com.briup.day2.Hello
6、自动生成包结构
javac -d . Dog.java
7、其他路径下执行程序
java -cp src com.sxu.day2.Dog
8、在src
下创建bin
目录,将编辑运行的class文件放在bin里面
八、jar
1、使用jar命令将字节码文件压缩成.jar
jar -cvf 打包名.jar *.class
jar -cvf Hello.jar Hello.class
jar -cvf Dog.jar com/sxu/day2/Dog.class
jar -cvf hello.jar -C bin .
2、 修改打包的jar包里面的文件META-INF的MANINFEST.MF,添加以下main方法所在的类
Main-Class: Hello
【注意:冒号后面有空格】
`Main-Class: com.sxu.day2.Dog`
或者vim Hello.jar
点进去MANINFEST.MF,添加 Main-Class: Hello
保存重新压缩,此时jar可用
3、执行压缩文件
java -jar Hello.jar
java -jar Dog.jar
完整版
-
在java文件下创建src、bin目录
mkdir src bin
-
进入src文件夹,编写Hello.java文件
vim Hello.java
编写代码,包含package
1 package com.sxu.day2; 2 3 public class Hello{ 4 public static void main(String[] args){ 5 System.out.println("hello world!"); 6 } 7 }
-
然后将Hello.java文件编译成Hello.class文件并保存在bin目录下
javac -d ../bin Hello.java
-
返回上级目录,运行程序
cd ..
java -cp bin com.sxu.day2.Hello
-
把当前目录下的bin文件夹里面的所有文件打到jar包中,但是【不包含】bin目录本身
jar -cvf hello.jar -C bin .
-
此时jar是一个普通的jar,不能直接java -jar的方式进行运行
【直接运行报错:hello.jar中没有主清单属性】
原因是因为没有在jar中指定哪一个类中有程序的入口,需要修改jar中的配置
方式一
保存,然后更新压缩包
方式二:
vim hello.jar
光标移动到MANINFEST.MF位置,回车,然后
i
输入,ESC
-->:wq!
,再次:q
退出 -
执行hello.jar包
java -jar hello.jar
九、import
1、一个类去引入其他类
若要引用的类在同包或java.lang包下面,那么类是可以直接使用;
若要使用的类不在同包也不再java.lang包下面,那么需要import导包。
例子1:同包
vim src/Stu.java 【含主方法,调用Tea】
vim src/Tea.java
javac -d bin src/Tea.java
javac -cp bin -d bin src/Stu.java
java -cp bin com.sxu.day3.Stu
例子2:不同包
vim src/Doc.java
package com.sxu.day3.test;
import com.sxu.day3.test.Doc;
直接将src下所有的java文件编译
javac -d bin src/*.java
十、类加载
- 启动类加载器 bootstrapClassLoader,非java语言实现 jre/lib/rt.jar
- 扩展类加载器 ExtClassLoader,java语言实现,是ClassLoader类型的对象 jre/lib/ext/xxx.jar
- 应用类加载器 AppClassLoader,java语言实现,是ClassLoader类型的对象 CLASSPATH指定
十一、双亲委托机制
例子:现在要加载Hello.class文件中的类
-
首先加载任务就交给了AppClassLoader
-
然后AppClassLoader把这个任务委托给自己的父加载器,也就是ExtClassLoader
-
然后ExtClassLoader把这个任务委托给自己的父加载器,也就是bootstrapClassLoader
-
然后bootstrapClassLoader就尝试去加载Hello这个类,但是在指定路径下并没有找到
-
然后任务又交回给了ExtClassLoader,ExtClassLoader尝试加载Hello这个类,但是在指定路径中没找到
-
然后任务又交回给了AppClassLoader
-
最后AppClassLoader从CLASSPATH中指定的路径里面找到并加载了这个Hello类,完成类加载的过程
把hello.jar移到/opt/jdk1.8.0_171/jre/lib/ext/
sudo mv hello.jar /opt/jdk1.8.0_171/jre/lib/ext/
在任意路径都可以执行Hello这个类
java com.sxu.day2.Hello