Java笔记(一)基础

目录

一、Windows下安装JDK和配置环境变量

二、cmd运行Java程序

三、包装类的静态常量 

四、其他


一、Windows下安装JDK和配置环境变量

  • JDK,Java Development Kit :编写Java程序的程序员使用的软件✔
  • JRE,Java Runtime Environment:运行Java程序的用户使用的软件
  • JVM,Java Virtual Machine:Java虚拟机
  • JDK包含JRE,JRE包含JVM
  • JDK下载官网:https://www.oracle.com/technetwork/java/javase/downloads/index.html
  • 本次安装选择的是目前最新的版本:jdk-11.0.1_windows-x64_bin.exe
  • 按照提示安装即可,要记住安装的路径
  • 配置环境变量,右击“计算机”-》属性-》高级系统设置-》环境变量
  • 新建系统变量,变量名为JAVA_HOME,变量值为上一步JDK的安装路径
  • 在系统变量path中添加 %JAVA_HOME%\bin
  • 新建系统变量CLASSPATH,变量值为 .%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar

Java笔记(一)基础_第1张图片
Java笔记(一)基础_第2张图片
Java笔记(一)基础_第3张图片

  • 目的:为了在控制台的任何文件路径下,都可以调用jdk指定目录下的所有指令
  • CLASSPATH的作用:jdk1.4以前,执行Java程序时,JRE会根据CLASSPATH指定的路径寻找Java类,所以需要在CLASSPATH环境变量前面加上一个点,用来告诉JRE在当前路径下搜索Java类。jdk1.5及以上可以不用设置CLASSPATH,而且jdk11的lib目录已经没有dt.jar和tools.jar两个文件。当然也可以设置CLASSPATH用于加载第三方类库。

Java笔记(一)基础_第4张图片

  • 在cmd中输入命令java -version,可以看到当前JDK的版本信息,说明JDK安装成功,并且环境变量配置正确

Java笔记(一)基础_第5张图片

二、cmd运行Java程序

  • 编译命令javac -d destDir srcFile
  • 执行命令java classFile
javac -d . HelloWorld.java    // javac HelloWorld.java
java HelloWorld
  • cmd运行Java出现编码GBK的不可映射字符(0xB0):因为代码中含有中文字符(包括注释中的中文字符)。cmd运行Java程序时,系统默认的编码格式是gbk,而包含中文字符的代码一般是Unicode格式。
  • 解决方法一:先拷贝源代码,然后删除源代码,再将notepad++编码设置为“使用ANSN格式编码”,最后粘贴源代码
  • 解决方法二:用-encoding指令来为文件指定编码格式, javac -encoding UTF-8 XXX.java

 

  • 带包的类的编译:如果编译Java文件时没有使用-d选项,编译器不会为Java源文件生成相应的文件结构,而是将生成的.class文件直接放在当前路径。
  • 如果一个源文件中没有使用包声明,那么其中的类,函数,枚举,注释等将被放在一个无名的包(unnamed package)中。
  • package aaa.bbb.ccc 编译器就将该 .java 文件下的各个类生成到 ./aaa/bbb/ccc/ 这个目录
  • import语句应该位于包声明之后,类定义之前,可以有多个import语句。
package mypack;

public class PackageDemo{
	public static void main(String[]args){
		System.out.println("test");
	}
}
  • 错误用法一:

Java笔记(一)基础_第6张图片

  • 错误用法二:注意-d后面的点!

Java笔记(一)基础_第7张图片

  • 上面错在执行,应该加上类名之前应该加上包名

  • 可以看到当前目录下生成了mypack文件夹,里面存放了编译产生的字节码文件PackageDemo.class

Java笔记(一)基础_第8张图片

  • 进一步测试,在另一个源文件中导入mypack包的类
import mypack.PackageDemo;

public class PackageDemo1{
	public static void main(String[]args){
		PackageDemo a = new PackageDemo();
		a.show();
	}
}
  • 运行结果如下:

Java笔记(一)基础_第9张图片

  • 给PackageDemo1.java加上包mypack1,再做测试
package mypack1;
import mypack.PackageDemo;

public class PackageDemo1{
	public static void main(String[]args){
		PackageDemo a = new PackageDemo();
		a.show();
	}
}
  • 不能像上一步那样运行了

Java笔记(一)基础_第10张图片

  • 还是得先打包编译,运行时指定包名

Java笔记(一)基础_第11张图片

  • javac -d . *.java 指令可以给当前目录下的所有 java 文件根据程序中是否有包声明进行编译或打包编译。
  • 当类路径不在当前目录下时,需要用到 java -c

三、包装类的静态常量 

public class PrimitiveTypeDemo {
    public static void main(String[] args) {
        //包装类Integer Short Long Byte Double Float都是抽象类Number的子类
        System.out.println("基本类型 byte 二进制位数:" + Byte.SIZE);
        System.out.println("包装类:java.lang.Byte");
        System.out.println("最小值:Byte.MIN_VALUE=" + Byte.MIN_VALUE);
        System.out.println("最大值:Byte.MAX_VALUE=" + Byte.MAX_VALUE);
        System.out.println();

        System.out.println("基本类型 short 二进制位数:" + Short.SIZE);
        System.out.println("包装类:java.lang.Short");
        System.out.println("最小值:Short.MIN_VALUE=" + Short.MIN_VALUE);
        System.out.println("最大值:Short.MAX_VALUE=" + Short.MAX_VALUE);
        System.out.println();

        System.out.println("基本类型 int 二进制位数:" + Integer.SIZE);
        System.out.println("包装类:java.lang.Integer");
        System.out.println("最小值:Integer.MIN_VALUE=" + Integer.MIN_VALUE);
        System.out.println("最大值:Integer.MAX_VALUE=" + Integer.MAX_VALUE);
        System.out.println();

        System.out.println("基本类型 long 二进制位数:" + Long.SIZE);
        System.out.println("包装类:java.lang.Long");
        System.out.println("最小值:Long.MIN_VALUE=" + Long.MIN_VALUE);
        System.out.println("最大值:Long.MAX_VALUE=" + Long.MAX_VALUE);
        System.out.println();

        System.out.println("基本类型 float 二进制位数:" + Float.SIZE);
        System.out.println("包装类:java.lang.Float");
        System.out.println("最小值:Float.MIN_VALUE=" + Float.MIN_VALUE);
        System.out.println("最大值:Float.MAX_VALUE=" + Float.MAX_VALUE);
        System.out.println();

        System.out.println("基本类型 double 二进制位数:" + Double.SIZE);
        System.out.println("包装类:java.lang.Double");
        System.out.println("最小值:Double.MIN_VALUE=" + Double.MIN_VALUE);
        System.out.println("最大值:Double.MAX_VALUE=" + Double.MAX_VALUE);
        System.out.println();

        System.out.println("基本类型 char 二进制位数:" + Character.SIZE);
        System.out.println("包装类:java.lang.Character");
        //以数值形式而不是字符形式将Character.MIN_VALUE输出到控制台
        System.out.println("最小值:Character.MIN_VALUE=" + (int)Character.MIN_VALUE);
        //以数值形式而不是字符形式将Character.MAX_VALUE输出到控制台
        System.out.println("最大值:Character.MAX_VALUE=" + (int)Character.MAX_VALUE);
        System.out.println();
    }
}

 

四、其他

  • 浮点数的比较不能直接用==,要用Math.abs(a-b)<1e-9
  • instanceof,用于判断运算符左侧对象实例是否为运算符右侧特定类型(类类型/接口类型)
int num = 1024;
boolean res = num instanceof int;    // true

class Father{}
class Son extends Father{}

public class ClassDemo {
    public static void main(String[] args){
        // 实例变量的具体类型跟引用绑定的对象有关
        Father f1 = new Father();
        boolean res1 = f1 instanceof Father; // true
        boolean res2 = f1 instanceof Son; // false

        Son s1 = new Son();
        boolean res3 = s1 instanceof Son; // true
        boolean res4 = s1 instanceof Father; // false

        Father f2 = new Son(); // 父类引用指向子类对象
        boolean res5 = f2 instanceof Father; // true
        boolean res6 = f2 instanceof Son; // true

        // Son s2 = new Father(); // 子类引用不能指向父类对象

        Father f3 = (Father) s1; // s1本来是子类对象,这里强制类型转换无效,f3还是指向子类对象
        boolean res7 = f3 instanceof Father; // true
        boolean res8 = f3 instanceof Son; // true

        // Son s3 = (Son) f1; // f1本来指向的是父类对象,不能强转为子类类型
        Son s4 = (Son) f2; // f2本来指向的是子类对象,可以强转为子类类型
        boolean res9 = s4 instanceof Father; // true
        boolean res10 = s4 instanceof Son; // true
    }
}
  • 自定义对象重写hashCode和equals,遵循一定的原则:hashCode返回值一致时,equals()结果不要求为True;equals()结果为True时,hashCode返回值必须一致。
  • String 类的equals()比较的是hashcode,字符串的hashcode只跟字符串序列有关,只要序列一致,hash值就相同
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1.hashCode());    // 96354
System.out.println(str2.hashCode());    // 96354
System.out.println("重地".hashCode());    // 1179395
System.out.println("通话".hashCode());    // 1179395

参考书籍:《疯狂Java讲义》

参考文章:http://www.runoob.com/java/java-tutorial.html

你可能感兴趣的:(Java)