Java技能树笔记

2022.08.13 周六 热

合抱之木,生于毫末;百丈之台,起于垒土;千里之行,始于足下。

目录

    • Java的运行过程
    • Java的跨平台的解释
    • 环境变量
    • Maven
    • java 的基本语法格式
    • Java关键字

Java的运行过程

Java程序运行时,必须经过编译和运行两个步骤。

  1. 使用javac xx.java 命令开启Java编译器并进行编译。编译结束后,会自动生成一个xx.class的字节码文件

  2. 使用java xx命令启动Java虚拟机运行程序,Java虚拟机首先将编译好的字节码文件加载到内存,这个过程被称为类加载,它是由类加载器完成的,然后虚拟机针对加载到内存中的Java类进行解释执行,便可看到运行结果。

Java的跨平台的解释

Java程序是由虚拟机负责解释执行的,而并非操作系统。
 这样做的好处实现跨平台性,也就是说针对不同的操作系统可以编写相同的程序,只需要安装不同版本的虚拟机即可。
不同的操作系统需要使用到不同版本的虚拟机:
 Java程序通过Java虚拟机可以达到跨平台特性,但Java虚拟机并不是跨平台的。

环境变量

  1. PATH环境变量
    目的:简化常用命令的语句,任何目录下不用加命令所在绝对路径,也可以运行命令
    原理:系统执行用户命令时,若用户未给出绝对路径(例如:d:\Java\jdk1.6.0_24\bin\java -version),则首先在当前目录下寻找相应的可执行文件、批处理文件(另外一种可以执行的文件)等。若找不到,再依次在PATH保存的这些路径中寻找相应的可执行的程序文件。系统就以第一次找到的为准;若搜寻完PATH保存的所有路径都未找到,则会显示错误信息。
  2. CLASSPATH变量
    javac编译器的一个环境变量。它的作用是指定类搜索路径,它与import、package关键字有关。
    目的:用到了其它的jar或类,但和主程序不在一个包下时,指定类搜索路径,
    原理:要使用已经编写好的类,前提当然是能够找到它们了,JVM就是通过CLASSPATH来寻找类的.class文件。我们需要把jdk安装目录下的lib子目录中的dt.jar和tools.jar设置到CLASSPATH中,当然,当前目录“.”也必须加入到该变量中。
    编译后c:\mylib\com\shinechina\MyClass.class
     怎么指定classpath呢
     常见毛病
      1、c:\mylib\com\shinechina
      2、c:\mylib\com
     正确
      1、c:\mylib
      2、c:\mylib

Maven

maven基础
Maven一款专门为 Java 项目提供构建依赖管理支持的工具。
Maven作为依赖管理工具,能够管理规模庞大jar包。使用Maven后,依赖对应的Jar包能够自动下载、方便、快捷且规范。

  • 构建
      构建指的是使用Java源码、图片、配置文件等生产一个可以在服务器上运行项目的过程。

构建的过程包含以下主要环节:
清理:删除上一次构建的结果,为下一次构建做好准备
编译:Java 源程序编译成 *.class 字节码文件
测试:运行提前准备好的测试程序
报告:针对刚才测试的结果生成一个全面的信息
打包 Java工程:jar包 Web工程:war包
安装:把一个 Maven工程经过打包操作生成的 jar 包或 war 包存入 Maven 仓库
部署:
  部署 jar 包:把一个 jar 包部署到 Nexus私服服务器上
 部署 war包 :借助相关 Maven 插件(例如 cargo),将 war 包部署到 Tomcat 服务器

  • 依赖
    如果 A 工程里面用到了 B 工程的类、接口、配置文件等等这样的资源,那么我们就可以说 A 依赖 B。

依赖管理中要解决的具体问题:
jar 包的下载:使用 Maven 之后,jar 包会从规范的远程仓库下载到本地
jar 包之间的依赖:通过依赖的传递性自动完成
jar 包之间的冲突:通过对依赖的配置进行调整,让某些jar包不会被导入

在Maven工程中编写代码和构建

清理操作:mvn clean 删除target目录
编译操作
 主程序编译:mvn compile 编译结果存放目录:target/classes
 测试程序编译:mvn test-compile 编译结果存放目录:target/test-classes
 测试操作:mvn test 测试的报告存放的目录:target/surefire-reports
打包操作:mvn package 打包的结果——jar 包,存放的目录:target
安装操作:mvn install

java 的基本语法格式

 编写 Java 程序代码必须先声明一个,然后在类中编写实现需求的业务代码。类需要使用 class 关键字定义,在 class 前面可以有一些修饰符,其语法格式如下:
[修饰符] class 类名 {
程序代码
}

Java 中的程序可分为结构定义语句和功能执行语句。
结构定义语句用于声明一个类或方法
功能执行语句用于实现具体的功能。每条功能执行语句的结尾都必须用英文分号(;)结束。

定义标识符时要遵循以下几点规范

1.包名所有字母一律小写,例如 com.itheima. example01。

2.类名接口名每个单词的首字母都要大写,例如 ArrayList、Iterator。

3.常量名所有字母都大写,单词之间用下画线连接,例如 DAY_OF_MONTH。

4.变量名方法名的第一个单词首字母小写,从第二个单词开始每个单词首字母大写,例如 lineNumber、getLineNumber。

5.在程序中,应该尽量使用有意义的英文单词来定义标识符,使得程序便于阅读,例如,使用 userName 表示用户名,password 表示密码。

Java关键字

  • abstract
    修饰类
     abstract修饰类,这个类就是抽象类,抽象类中可以有非抽象变量和成员变量,也可以有普通方法、构造方法。但是不能实例化,只能被子类继承。
    如果子类不是抽象类,则必须重写父类的抽象方法。
    public abstract class AbstractList extends AbstractCollection implements List {

    }
    修饰方法:
     abstract修饰方法,这个方法就是抽象方法。抽象方法必须存在于抽象类中。抽象方法不能有具体实现。
    abstract public E get(int index);

  • enum
    enum表示枚举,用于限制变量值的类型,例如:
    public enum Alpha (implements 接口){
    (public static final)a,b,c,d
    }
    规定Color的实例只能为a,b,c,d其中之一。
    枚举类中可以有成员变量和方法。

  • extends
    extends表示继承。例如:
    class 子类 extends父类{}
    Java中的继承是单继承,即子类只能有一个直接父类。
    除了private,子类可以访问父类的方法和成员变量。

  • final
    修饰变量
    将变量变为常量,在初始化变量后不能再改变值。
    修饰方法
    被final修饰的方法不能被子类重写。
    修饰
    被final修饰的类不能被继承。

  • finally
    finally在try/catch语句块中处理一些后续的工作。例如关闭网络连接和输入输出流等。
    如果在try/catch中使用return,则finally会撤销这个return,无论如何都会执行finally中的语句。

  • instanceof
    instanceof用于判断类与对象的关系。例如:
    a instanceof b
    若a是b的一个实例(或子类对象),则整个表达式的结果是true,否则结果为false。

  • new
    new用于生成类的实例。
    Object a = new Object();

  • static
    static修饰的语句块存放在堆的方法区中。
    静态变量:依附在类中的变量,可以被类的所有的实例共用。
    static int a = 0;
    静态方法:依附在类中的方法。静态方法只能访问类中的静态变量和静态方法。
    publlic static void b(){

    }
    静态块:在类加载的时候执行块中的语句,块中不能访问非静态变量。
    static{

    }
    静态内部类:用static修饰内部类。

  • synchronized
    synchronized关键字用于保证线程安全。由这个关键字修饰的方法或者代码块保证了同一时刻只有一个线程执行该代码。
    synchronized(obj){…}
    当一个线程访问同步代码块时,检查obj是否有锁,如果有就挂起。如果没有就获得这个obj的锁,也就是把其他线程锁在了外面。当代码执行完毕时释放该锁,其他线程获得锁继续执行代码。

  • volatile
    volatile关键字修饰的变量在多线程中保持同步。相比synchronized效率要高,不会阻塞线程。但只能保证数据的可见性,不能保证数据的原子性。例如在处理i++的时候另外一个线程修改i的值,那么i的值将会发生错误,这是原子性导致的。
    volatile int a;

你可能感兴趣的:(笔记,java学习,experience,java,jvm,开发语言)