由于笔者具有c和c++基础,所以这里不展开部分基础内容,如数据类型、流程控制等等。
如果需要查阅,请参考:java菜鸟教程
编程规范
- 包名:小写字母序列 package com.example.demo;
- 类名:首字母大写
- 类实例:小写开头,后面首字母大写
- 常量:都大写
- import后空一行
- 最后一个变量定义和第一个方法定义之间,方法彼此之间最好空一行
区分多行注释与JavaDoc?
多行注释:
/*
* 这是多行注释
* 这也是多行注释
*/
文档注释:一般用在类、方法和变量上面,用来描述作用。
/**
* 文档注释
* 多行注释
*/
JDK/JRE/JVM关系
java通过JVM实现跨平台特性,但是JVM不是跨平台的。
Java和C/C++的不同
- C++ 支持指针,而 Java 没有指针的概念。
- C++ 支持多继承,而 Java 不支持多重继承,但允许一个类实现多个接口。
- Java 是完全面向对象的语言,并且还取消了 C/C++ 中的结构和联合,使编译程序更加简洁。
- Java 自动进行无用内存回收操作,不再需要程序员进行手动删除,而 C++ 中必须由程序释放内存资源,这就增加了程序员的负担。(当然程序员的控制权也变小了=。=)
- Java 不支持操作符重载,操作符重载则被认为是 C++ 的突出特征。
- Java 允许预处理,但不支持预处理器功能,所以为了实现预处理,它提供了引入语句(import),但它与 C++ 预处理器的功能类似。
- Java 不支持缺省参数函数,而 C++ 支持 。
- C 和 C++ 不支持字符串变量,在 C 和 C++ 程序中使用“Null”终止符代表字符串的结束。在 Java 中字符串是用类对象(String 和 StringBuffer)来实现的
- goto 语句是 C 和 C++ 的“遗物”,Java 不提供 goto 语句,虽然 Java 指定 goto 作为关键字,但不支持它的使用,这使程序更简洁易读。
- Java 不支持 C++ 中的自动强制类型转换,如果需要,必须由程序显式进行强制类型转换。
流程控制
带label的break
public static void main(String[] args) {
outerLabel: for (int x = 0; x < 10; x++) {
for (int y = 0; y < 8; y++) {
System.out.println(y);
if (y % 2 != 0) {
break outerLabel;
}
}
}
System.out.println("Game Over!");
}
// 就是跳出label所在的循环,所以输出是
0
1
Game Over!
带label的continue
public static void main(String[] args) {
label1: for (int x = 0; x < 5; x++) {
for (int y = 5; y > 0; y--) {
if (y == x) {
continue label1;
}
System.out.println(x+","+y);
}
}
System.out.println("Game Over!");
}
// 就是达到条件时,跳转到label处继续执行
// 有些源码会用,实际比较少用到
switch语句
switch(expression){
case value :
//语句
break; //可选
case value :
//语句
break; //可选
//你可以有任意数量的case语句
default : //可选
//语句
}
逻辑运算符
&&(短路与) 与 & 区别:如果 a 为 false,则不计算 b(因为不论 b 为何值,结果都为 false)
||(短路或) 与 | 区别:如果 a 为 true,则不计算 b(因为不论 b 为何值,结果都为 true)
短路的会更快,应该优先考虑。
字符串常量
Java 的字符型常量值是用单引号引起来的一个字符,如 ‘e’、E’。需要注意的是,Java 字符串常量值中的单引号和双引号不可混用。双引号用来表示字符串,像 “11”、“d” 等都是表示单个字符的字符串。常量名一般全大写。
public class HelloWorld {
// 静态常量
public static final double PI = 3.14;
// 声明成员常量
final int y = 10;
public static void main(String[] args) {
// 声明局部常量
final double x = 3.3;
}
}
关于字符串直接量有一点需要指出,当程序第一次使用某个字符串直接量时,Java 会使用常量池(constant pool)来缓存该字符串直接量,如果程序后面的部分需要用到该字符串直接量时,Java 会直接使用常量池(constantpool)中的字符串直接量。
常量池(constant pool)指的是在编译期被确定,并被保存在已编译的 .class 文件中的一些数据,它包括关于类、方法、接口中的常量,也包括字符串直接量。
==比较的是内存地址,这里输出都是true说明内存地址是一样的。
String s0 = "hello";
String s1 = "hello";
String s2 = "he" + "llo";
System.out.println(s0 == s1); // true
System.out.println(s0 == s2); // true
类型转换
在运算过程中,由于不同的数据类型会转换成同一种数据类型,所以整型、浮点型以及字符型都可以参与混合运算。自动转换的规则是从低级类型数据转换成高级类型数据。转换规则如下:
数值型数据的转换:byte→short→int→long→float→double。
字符型转换为整型:char→int。
byte b = 50;
b = (byte)(b*2); // 这里必须加转换是因为b*2已经提升到int了,int到byte是降级,不能自动转换的。
在 Java 语言中,布尔类型的值不能转换成任何数据类型,true 常量不等于 1,而 false 常量也不等于 0。这两个值只能赋给声明为 boolean 类型的变量,或者用于布尔运算表达式中。
引用数据类型建立在基本数据类型的基础上,包括数组、类和接口。引用数据类型是由用户自定义,用来限制其他数据的类型。另外,Java 语言中不支持 C++ 中的指针类型、结构类型、联合类型。
空引用(null)只能被转换成引用类型,不能转换成基本类型,因此不要把一个 null 值赋给基本数据类型的变量。