java概述
1、java的三大特点
面向对象:
主要体现在两个基本概念:类、对象
以及三大特性:封装、继承、多态
健壮性:
吸收C/C++的优点,去掉了影响程序健壮性的部分(比如指针、内存申请以及释放等等)
跨平台性:
依赖于java虚拟机(JVM),可以在任何操作系统上运行java程序
2、java的两种核心机制
java虚拟机(即jvm)
对于不同的操作系统,有不同的虚拟机,只有提供了对应操作系统的虚拟机,才可以在此基础上运行java程序。
jvm有效的屏蔽了因不同操作系统所造成的底层平台的差别,使得编译后的java程序可以在任意平台上运行。
垃圾收集机制:
在 C 语言中,由于它是一门底层的编程语言,没有自动的垃圾回收机制,需要开发者手动进行内存管理。这也使得 C 语言程序更加高效,但同时也更容易出现内存泄漏、使用已经被释放的内存等问题。
java取消了开发者回收无用空间内存的责任:它提供一种系统级线程跟踪存储空间的分配情况。并在JVM空闲时,检查并释放那些可被释放的存储空间。
垃圾回收在Java程序运行过程中自动进行,程序员无法精确控制和干预。
【注:即便是这样,某些java程序依然存在着内存泄漏和内存溢出的问题。】
3、java环境搭建
明确jdk、jre、jvm之间的关系
java开发工具包(jdk):提供给开发人员使用的java开发工具,该开发工具自带jre部分,同时也包含了编译工具(javac.exe)、打包工具(jar.exe)等其它工具;
java运行环境(jre):包含了jvm和java程序运行所需要的核心库等等,如果只是想运行java程序,只需要安装jre即可;
java虚拟机(jvm)
以下是它们之间的包含关系:
4、java语言中的注释
单行注释:
System.out.println("Hello World!") ; // 单行注释
多行注释:
System.out.println("Hello World!") ;
/*
多行注释
*/
文档注释:
/**
@author 指定java程序作者
@version 指定java程序版本
*/
该注释内容可以被JDK提供的工具javadoc所解析,生成一套以网页文件形式体现的该程序的说明文档。
变量
1、标识符与变量
标识符:
Java 对各种变量、方法和类等要素命名时使用的字符序列称为标识符(凡是需要自己起名字的地方都叫标识符)
语法规则:
- 由26个英文字母大小写,0-9 ,_或$ 组成
- 数字不可以开头。
- 不可以使用关键字和保留字,但能包含关键字和保留字。
- Java中严格区分大小写,长度无限制。
- 标识符不能包含空格。
变量的声明与赋值:
int a; // 声明变量,只有声明后才能使用;
a = 10; //给变量赋值;
int b = 20; // 声明、赋值同时进行;
成员变量与局部变量:
在方法体外,类体内声明的变量称为成员变量。
在方法体内部声明的变量称为局部变量。
2、基本数据类型
整型:byte、short、int、long
java中整型常量默认为int型,如需声明long型常量,应该在后面加上‘l’或‘L’;
java程序中变量通常声明为int型,除非不足以表示较大的数,才使用long。
浮点型:float、double
java中的浮点型默认为double型,其精度为float的两倍,如需要声明float类型,需要在后面加上‘f’或‘F’。
字符型:char
char型用来表示通常意义上的字符,占用2个字节;
java中的所有字符都是用Unicode编码,因此char类型是可以进行运算的:
char c1 = ' a ';
char c2 = ' 中 ';
char c3 = ' 9 ';
System.out.println(10 + c2); // 20023
此外,char类型还可用于转义字符:
char c = ' \n ' ; // ' \n ' 表示换行符
其它常见的转义字符如下:
Unicode编码与UTF-8:
Unicode编码能够将世界上的所有符号都纳入其中,并且对每一个符号都给予一个独一无二的编码,使用Unicode编码不会造成乱码问题;
但是Unicode编码只是规定了一个符号的二进制编码,没有规定这个符号该如何进行存储。比如ASCII(用一个字节进行存储的编码方式)与Unicode无法进行区分,因为计算机不知道三个字节究竟是表示一个字符还是三个字符;再者,英文字母一般情况下仅用一个字节表示都足够了,如果强行规定用Unicode进行编码,每个字符都会占用3-4个字节,那么剩下的字节都是0,这对存储空间来说是巨大的浪费;
为了解决这个问题,UTF-8是互联网上最广泛使用的一种Unicode的实现方式,它是一种变长的编码方式,可以使用1-6个字节表示一个符号,并且通过其独特的编码规则,根据不同的符号而变化字节的长度。
布尔型:boolean
boolean类型只有两个值:true或者false,没有null这个值;
【注:不可以使用0或非 0 的整数替代false和true,这点和C语言不同】
【但是Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达所操作的boolean值,在编译之后都使用java虚拟机中的int数据类型来代替:true用1表示,false用0表示。】
3、基本数据类型转换
自动类型转换:容量小的类型会自动转换为容量大的类型;
强制类型转换:将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转换符:(),但可能造成精度降低或溢出,格外要注意;
int number1 = 10;
short num = (short)number1;
System.out.println("num = " + num); // num = 10
- byte、short、char之间不会相互计算,他们在进行计算时会统一转换为int型;
- boolean类型不参与其它数据类型之间的运算。
4、引用数据类型
5、字符串
String类不是基本数据类型,而是属于引用数据类型;
一个字符串可以串接另一个字符串,也可以直接串接其他类型的数据。
int no = 10;
String str = "abcdef";
String str1 = str + "xyz" + no; // string1 = "abcdefxyz10"
str1 = str1 + "123"; // string1 = "abcdefxyz10123"
char c = 'A';
double pi = 3.1416;
str1 = str1 + pi; // string1 = "abcdefxyz101233.1416"
boolean b = false;
str1 = str1 + b; // string1 = "abcdefxyz101233.1416false"
str1 = str1 + c; // string1 = "abcdefxyz101233.1416falseA"
运算符
1、二进制
二进制整数的三种形式:
原码:直接将一个数值换成二进制数。最高位是符号位;
负数的反码:是对原码按位取反,只是最高位(符号位)确定为1;
负数的补码:其反码加1;
计算机底层是以二进制补码的形式保存所有的整数,且正数的原码、反码、补码都相同,通过带入符号位进行计算,计算机只有加法而没有减法:
2、算数运算符
注意事项:
如果对负数取模,可以把模数负号忽略不记,如:5%-2=1。 但被模数是负数则不可忽略。此外,取模运算的结果不一定总是整数。
对于除号“/”,它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分。
int x = 3510;
x = x / 1000 * 1000; // x = 3000;
System.out.println(x);
System.out.println("5 + 5 =" + 5 + 5);
a++与++a的区别主要在于:前者的自加运算发生在使用a值之后,后者的自加运算发生在使用a值之前;
int i1 = 10;
int i2 = 20;
int i = i1++;
System.out.print("i="+i); // i=10
System.out.println("i1="+i1); // i1=11
i = ++i1;
System.out.print("i="+i); // i=12
System.out.println("i1="+i1); // i1=12
i = i2--;
System.out.print("i="+i); // i=20
System.out.println("i2="+i2); // i2=19
i = --i2;
System.out.print("i="+i); // i=18
System.out.println("i2="+i2); // i2=18
3、扩展赋值运算符
+=,-=,*=,/=,%= 这些符号自带强转的功能;
short s = 3;
s = (short)(s+2);
System.out.println(s); // 5
int i = 1;
i *= 0.1; // 等价于 (int)i = i * 0.1;
System.out.println(i); // 0
i++;
System.out.println(i); // 1
int m = 2;
int n = 3;
n *= m++; // 等价于(int) n = n * m++;
System.out.println("m=" + m); // m = 3
System.out.println("n=" + n); // n = 6
int j = 10;
j += (j++) + (++j); // 等价于 (int)j = j + (j++) + (++j);
System.out.println(j); // 32
4、比较运算符
比较运算符的结果都是boolean类型,要么是true,要么是false
5、逻辑运算符
短路与&&和短路或||
&&:如果左边为真,那么右边参与运算;如果左边为假,那么右边不参与运算;
||:如果左边为假,那么右边参与运算;如果左边为真,那么右边不参与运算;
int x = 1;
int y = 1;
if(x++==1 || ++y==1){ // 左边条件为真,右边不参与运算;
x =7;
}
System.out.println("x="+x+",y="+y); //x=7 ;y=1
boolean x=true;
boolean y=false;
short z=42;
if((z++==42)&&(y=true))z++; // 左边为真,右边参与运算
if((x=false) || (++z==45)) z++; // 左边为假,右边参与运算
System.out.println("z="+z); // z = 46
6、三元运算符
利用三元运算符获取三个数之中最大数:
int x = 8;
int y = 13;
int z = 5;
int temp = (x>y)?x:y;
int res = (temp>z)?temp:z;
System.out.println("res="+res);