在学习前先了解本篇的结构:
一、Java主类结构
1.1 类
(1) Java是面向对象的程序设计语言,在Java中一切都是对象。
(2) Java程序的基本组成单元是类。每一个应用程序必须包含一个main()方法 ,含有main()方法的类叫做主类。
- 所谓方法,其实与C++中的函数的含义相同。
- 通常将类的属性称为类的全局变量(成员变量),将方法中的属性称为局部变量。即全局变量申请在类体中,局部变量申请在方法体中。
举个例子:
public class hellojava {
static String a = "Hello ";
public static void main(String[] args) {
String b = "Java!";
System.out.println(a+b);
}
}
hellojava是主类的名字,它与文件名同名,大小写保持一致(Java严格区分大小写)
其中a为全局变量,b为局部变量(main()方法也是一种方法)
1.2 全局变量
(1) 在声明全局变量时,若没有对其初始化,Java会给它一个默认值,注意,这里仅仅只是对全局变量生效。
对应默认值如下:
基本类型 | 默认值 |
---|---|
boolean | false |
char | ‘\u0000’(NULL) |
byte | (byte)0 |
short | (short)0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
1.3 主方法
public | static | void | main | (String[]args) |
---|---|---|---|---|
权限修饰符 | 静态修饰符 | 返回值修饰符 | main()方法的参数 |
二、基本数据类型
Java的基本数据类型如下所示:
C++的数据类型如下:
2.1 整数类型
(1) 在Java中,整数类型有3种表示形式:十进制、八进制和十六进制。
(2) 根据所占内存不同,可分为 byte 、short、int 和 long 四种类型。
数据类型 | 内存空间 | 取值范围 |
---|---|---|
byte | 8位 | -128~127 |
short | 16位 | -32768~32767 |
int | 32位 | -2147483648~2147483647 |
long | 64位 | -9223372036854775808~9223372036854775807 |
值得一提的是,在Java中所有的值都分正负,所以不存在C++中unsigned这种类型。另外,也没有long long和long double。
(3) 在赋值时要注意变量的范围,如对于long型值,若要赋给它一个大于int的最大值的值或小于int最小值的值时,需要在数字后面加上L或l。
long i = 2147483650L;
(4) 区别于C++,在C++中布尔类型(bool)与int型是兼容的,所以以下代码可以在C++中使用:
int x = 1;
while(x)
{
//...
}
而在Java中不能这样做,但可以这样做:
boolean x = true;
while(x){
//...
}
(5) 基本类型都有对应包装类,如 int 对应的 Integer。基本类型和包装类的转换由自动装箱和自动拆箱完成。(编译器帮你完成)
Integer x = 2; //装箱
int y = x; //拆箱
关于装箱与拆箱,后期在包装类中介绍。
2.2 浮点类型
数据类型 | 内存空间 | 取值范围 |
---|---|---|
float | 32位 | 1.4E-45 ~ 3.4028235E38 |
double | 64位 | 4.9E-324 ~ 1.7976931348623157E308 |
(1) 默认情况下,浮点数被认为是double型,若要使用float型,需要在数值后面加f或F。
(2) 使用double型时,浮点数后的d或D可加可不加。
(3) 声明浮点数时必需在浮点数后加f或F,否则编译器认为这是double型而出错。
float f1 = 14.12f;
double f2 = 12.12d;
double f3 = 12.11;
2.3 字符型
(1) 字符型变量占用16位(2字节)的内存空间(因为Unicode编码占用2个字节)
char x = 'a';
//char x = 97
(2) Java采用Unicode的编码方式,字符a在Unicode表的位置是97,区别与C++ AscII码 中字符a的位置。
- 思考:字符型变量能否储存中文汉字?
答案是能,因为Unicode编码的字符集包含了汉字(排除某些特殊的汉字没有被包含在其中)。
(3) 转义字符,与C++中的转义序列是同一个道理。
字符名称 | 含义 |
---|---|
1~3位八进制所表示的字符,如\123 | \ddd |
4位十六位进制所表示的字符,如\u0052 | \uxxxx |
换行符 | \n |
水平制表符 | \t |
垂直制表符 | \v |
退格 | \b |
换页 | \f |
反斜杠 | \\ |
单引号 | \’ |
双引号 | \" |
2.4 布尔类型
(1) 关键字:boolean
(2) 含义:true 或false
三、变量与常量
3.1 标识符与关键字
(1) 标识符就是你取的名字,如类名、变量名、方法名、数组名、文件名等。
(2) 合法的标识符由字母、下划线( _ )、美元符号($)和数字组成,它们的顺序是任意的,但标识符开头不能是数字且标识符不能是关键字。
以下标识符是合法的:
name
$page
user_name
以下标识符是非法的:
4u
String
user name
(3) 关键字:Java语言已经使用过的名字,不能作标识符使用。
下面是Java的部分关键字
short | int | long | float | double | boolean |
---|---|---|---|---|---|
byte | if | else | continue | for | do |
break | case | switch | while | default | char |
goto | return | public | this | protected | static |
class | final | finally | import | package | private |
3.2 常量
(1) 常量即程序运行过程中不会改变的量,在Java中用final表示。
final double PI = 3.1415926;
(2) 若定义的final变量属于“成员变量”,则必须在定义的时候就赋初始值。
public class hellojava {
final static int a = 1; //成员变量
public static void main(String[] args) {
final int num;
num = 2;
//num = 3; 错误,只能赋值一次
}
}
3.3 变量的有效范围
(1) 成员变量在整个类中都是有效的,成员变量又可以分为静态变量与实例变量。
class var{
int x = 1; //实例变量
static int y = 2;//静态变量
}
- 静态变量与实例变量的区别?
- 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
- 在程序运行时的区别:
2.1 实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。
2.2 静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。
2.3 实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
(2) 局部变量只在当前代码块中有效,当局部变量与成员变量同名时,成员变量将会被隐藏,而使用局部变量。
public class hellojava {
static int a = 1;
public static void main(String[] args) {
int a = 2;
System.out.println("a的值为"+a);
}
}
如图,成员变量被隐藏:
四、运算符
4.1 运算符
(1)赋值运算符:=
(2)算数运算符:+ - * / %
(3)自增与自减运算符:"++" 与" --"
- 两者的操作对象必须是整型或浮点型的变量
- ++ 与 - - 有两种情况,一种是前++(- -),另一种是后++(- -)
- 区别何在?
int a = 1;
int b = a++;//先将a的值赋给5,然后a再加1
int a = 1;
int b = ++a;//a加1后再赋值给b
(4)比较运算符:> >= == <= < !=
(5)逻辑运算符:&& || !
(6)位运算符:
-
按位与 :&
-
按位或:|
-
按位取反:!
-
按位异或:~
-
移位操作:^
- << 左移
- >> 右移
- >>> 无符号右移
注:移位运算符适用于byte、short、char、int 和 long。
- 计算2 * 8的值,可以用 2 << 3 表示,这种方法通过位操作,效率高。
(6)三元运算符:各位为 表达式?值1:值2 ,若表达式的值为真,则返回值1,否则返回值2。
如以下表达式的值为false:
boolean a = 2>3?true:false;
4.2 优先级
运算符的优先级决定了一个表达式运算执行的先后顺序,有时候忽略了优先级会使表达式出现超乎预期的结果。
优先级 | 描述 | 运算符 |
---|---|---|
1 | 括号 | () |
2 | 正负号 | +、- |
3 | 一元运算符 | ++、- -、! |
4 | 乘除 | *、/ |
5 | 加减 | +、- |
6 | 移位运算 | >>、<<、>>> |
7 | 比较大小 | >、>=、<、<= |
8 | 比较是否相等 | == |
9 | 按位与运算 | & |
10 | 按位异或运算 | ^ |
11 | 按位或运算 | ∣ |
12 | 逻辑与运算 | && |
13 | 逻辑或运算 | ‖ |
14 | 三元运算符 | ?: |
15 | 赋值运算符 | = |
五、类型转换
低类型到高类型:byte < short < int < long < float < double , char < int < float
注意:
- byte不能隐式转化为char
- short和char之间不能相互转换
- float和long之间不能相互转换
5.1 隐式类型转换
系统自动执行的转换,转换的方向总是从低类型到高类型。
- 思考:
short a = 1;
a = a + 1;
与
short a = 1;
a += 1;
有什么区别
第一种方法钟a为short型,1为int型,所以a+1为int型,但原本a是short型,所以这样做编译器会显示错误。
第二种方法中的 “+=” 比较特殊,会对表达式进行特殊处理,故编译通过。
5.2 显式类型转换
与隐式类型转换相反,由程序员自己操作。当转换是从高精度到低精度时,必须使用显式类型转换。显式类型转换可能会有数据丢失甚至转换失败。
如:
int a = (int)12.12;
int b = (int)'d';
- 当赋值时变量超过范围时,必须使用显式类型转换。
byte a = (byte)130;
六、代码注释与编程规范
6.1 代码注释
Java中有三种注释方法:
- 单行注释
如:
int a = 1;//a是个整型变量,它的值为1
- 多行注释
如:
int a = 1;
/*
a是个整型变量,它的值为1
*/
- 文档注释
如:
/**
文档内容
*/
6.2 编程规范
以下仅供参考:
-
每条语句单独占一行,一条命令要以分号结束。
-
声明变量时尽量一行一个变量声明,并添加注释。对于局部变量应该在声明时就初始化。
-
对于关键的方法要多加注释。
-
为方便日后维护,不要使用技术高、难懂、易混淆判断的语句。