java学习笔记


Java学习笔记

封面pid:78790789

Java入门简介

java脱胎于C++,摒弃了C++中一些令人费解的特性,比如java没有指针。最初的java并不叫java,而是叫oak,但是后来发现oak的商标已经被注册了,于是改叫java。

java有三大版本,javaSE、javaME、javaEE,对应桌面端,移动端,服务端的开发。javaEE的应用最广泛,前景较好。

JDK Java Development Kit Java开发工具包,是提供给Java开发人员使用的,其中包含了java的开发工具集,也包括了java的运行环境JRE 。

JRE Java Runtime Environment Java运行环境,包括java虚拟机和Java程序所需的Java SE核心类库等。如果只想运行一个开发好的Java程序,只需安装JRE即可。

JVM Java virtual Machine Java虚拟机,它是一个虚构出来的计算机,Java虚拟机屏蔽具体平台信息,Java语言在Java虚拟机上运行目标字节码,解释成二级制数据。java通过jvm真正实现了一次编译到处使用。

开发的实际情况是:我们利用JDK(调用JAVA API)开发了属于我们自己的JAVA程序后,通过JDK中的编译程序(javac)将我们的文本java文件编译成JAVA字节码,在JRE上运行这些JAVA字节码,JVM解析这些字节码,映射到CPU指令集或OS的系统调用。

public class HelloWorld{
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

这是一个最简单的java程序,运行之后会在屏幕上输出Hello World!。此处创建了一个类(class)叫HelloWorld,这个类的名字应当和保存代码的文件名一致,否则会报错。java中的类必须首字母大写。最外层大括号里面的public static void main叫方法,java中将操纵数据的过程称为方法(method)。main()括号中的是参数,只不过这个程序没有使用参数。

目前编程语言有两种,解释型语言和编译型语言。

解释型语言是指它常用的执行机制是使用一个“解释器”来执行,解释器对于程序是一句一句“翻译”成机器语言来一句一句执行,例如shell脚本语言。

编译型语言是指它常用的执行机制是使用一个“编译器”来编译成机器语言,然后你就可以直接运行(执行)这个编译成的“可执行文件”。

不管是解释性语言还是编译型都可编译或解释,前提是有这样的编译器或解释器(比如你自己写一个),找不到这样的编译器你当然不能编译。对于语言本身来说,各种编程语言本质没什么不同。所谓的“解释性”和“编译”指的是执行机制上的不同。

随着技术的发展,二者的界限越来越模糊。java兼顾了编译型语言和解释型语言的特点,它先编译后解释。

Java基础语法

注释:java中的注释有三种,单行注释,多行注释和文档注释。

//这是一个单行注释

/*
这是一个多行注释
*/

/**
*文档注释,这是第一行
*这是第二行
*/

Java的类名,变量名以及方法名都叫标识符。

  • 标识符应当以字母,美元符号或下划线开头(注意不能以数字开头)
  • 首字符之后可以是字母,美元符号,下划线和数字
  • 不能使用关键字作为变量名或方法名
  • 标识符大小写敏感

Java是一种强类型语言,所有变量都必须先定义才能被使用。

Java中,创建变量必须声明其类型,java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。

Java的数据类型包括基本类型和引用类型。JAVA中的数值类型不存在无符号的,它们的取值范围是固定的,不会随着机器硬件环境或者操作系统的改变而改变。

  • byte:1字节(8位),最大存储数据量是255,存放的数据范围是-128~127之间。

  • short:2字节(16位),最大数据存储量是65536,数据范围是-32768~32767之间。

  • int:4字节(32位),最大数据存储容量是2的32次方减1,数据范围是负的2的31次方到正的2的31次方减1。

  • long:8字节(64位),最大数据存储容量是2的64次方减1,数据范围为负的2的63次方到正的2的63次方减1。一般定义长整型时会在后面加上一个L,例如long lnum=200L;,输出的时候L不会跟着输出。

  • float:4字节(32位),数据范围在3.4e-45~1.4e38,直接赋值时必须在数字后加上f或F,如果不加默认是double类型

  • double:8字节(64位),数据范围在4.9e-324~1.8e308,赋值时可以加d或D也可以不加。

  • boolean:只有true和false两个取值。具体大小没有明确规定,JVM会在编译时将boolen转换成int,用1表示true,用0表示false。JVM支持boolean数组,但是是通过读写byte数组实现。

  • char:2字节(16位),存储Unicode码,用单引号赋值。

要注意String不是一个关键字,而是一个类。

引用数据类型包括类,接口和数组。

Java中二进制数以0b开头,八进制以0开头,十六进制以0x开头。比如我们看以下代码:

public class Demo{
    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 010;//八进制的
        int num3 = 0x10;//十六进制
        System.out.println(num1);
        System.out.println(num2);
        System.out.println(num3);
    }
}

输出结果为:

10
8
16

为什么八进制是0开头呢?八进制英文是Octal,缩写OCT或O,O与0外形相近,不用O开头是因为可能造成歧义。举个例子,如果八进制用O开头,O123,可能是八进制的123,也可能是一个变量的名字叫O123。

浮点数值不适用于无法接受舍入误差的金融计算中。例如System.out.println(2.0-1.1);输出并不是0.9,而是0.8999999999999999。这是由于二进制无法准确表示1/10,这就好像十进制无法精确表示1/3一样。如果不允许有舍入误差,需要用BigDecimal类。

以上结论的另一个例子如下:

public class Demo{
    public static void main(String[] args) {
        float f=0.1f;
        double d=0.1;
        System.out.println(f==d);
        System.out.println(f+" "+d);
    }
}

结果为:

false
0.1 0.1

两个数明明输出都是0.1却不相等。因此最好完全避免使用浮点数进行比较

另外,强烈不建议在程序中使用char类型,除非确实需要处理UTF-16代码单元。最好将字符串作为抽象数据类型处理。

一定要当心注释中的\u,例如注释// \u00A0 is a newline会产生语法错误,因为\u00A0会被替换成一个换行符。

Java是强类型语言,在运算时有时候需要类型转换。在运算中,不同类型的数据先转换成同一类型再进行运算。

图中实箭头表示无信息丢失的转换,虚箭头表示可能有精度损失的转换。

运算时自动转换:

当一个二元运算符作用于两个数时,两个操作数首先被转换为同一类型,转换的原则如下

  • 如果两个操作数之中有一个为double类型,另一个转换为double类型;

  • 否则,如果两个操作数之中有一个为float类型,另一个被转换为float类型;

  • 否则,如果两个操作数之中有一个为long类型,另一个被转换为long类型;

  • 否则,两个操作数都被转换为int类型;

强制类型示例:(类型名)变量名

自动类型转换是从低到高,强制类型转换是从高到低。boolean类型数据与任一数值型数据之间不能相互转换,如果强制转换,会出现编译错误。

计算比较大的数要当心数据溢出问题。

public class Demo{
    public static void main(String[] args) {
        int num1=10_0000_0000;
        int num2=20;
        System.out.println(num1*num2);
    }
}

输出是-1474836480。注意num1的写法,从Java7开始可以在数字中加下划线使之更易读。以上int换为long即可正常计算。注意一般定义长整型时会在后面加上一个L


文章作者: eacryo
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 eacryo !
  目录