Java学习笔记
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。