0704,0705
基础语法(上)
JVM:Java虚拟机
JDK:Java开发工具包
JRE:Java运行环境
HelloWorld
新建源文件HelloWorld.java,并键入下面的内容。
public class HelloWorld{
public static void main(String[] args){
System.out.println("HelloWorld!");
}
}
在命令行切换到源代码目录,先用
javac HelloWorld.java
进行编译,
然后用
java HelloWorld
运行。
变量
变量都需要命名,叫做“变量名”。
变量需要声明(declare)才能使用。
可以在程序的任何位置声明变量。
1.声明变量的语法格式
数据类型 变量名称
int a = 1;
2.输出变量a的语句是
System.out.println(a);
常量
常量的值是不能被修改的。
在变量的前面添加关键字final即可声明一个常量。
在Java编码规范中,要求变量名必须大写。
1.声明常量的语法格式
final 数据类型 常量名 = 值
final double PI = 3.14
常量也可以先声明,再进行赋值,但只能赋值一次,比如:
final int FINAL_VARIABLE;
FINAL_VARIABLE = 100;
2.输出常量PI的语句是
System.out.println(PI);
数据类型
Java中共有八种基本数据类型,详见下表。
数据类型 | 默认值 | 存储格式 | 数据范围 | 包装类型 |
---|---|---|---|---|
short | 0 | 2个字节 | -32,768到32,767 | Short |
int | 0 | 4个字节 | -2,147,483,648到2,147,483,647 | Integer |
byte | 0 | 1个字节 | -128到127 | Byte |
char | 空 | 2个字节 | Unicode的字符范围:'\u0000'(即为0)到'\uffff'(即为65,535) | Character |
long | 0L或0l | 8个字节 | -9,223,372,036,854,775,808到9,223,372,036,854,775,807 | Long |
float | 0.0F或0.0f | 4个字节 | 32位IEEEE-754单精度范围 | Float |
double | 0.0或0.0D(d) | 8个字节 | 64位IEEE-754双精度范围 | Double |
boolean | false | 1位 | true或false | Boolean |
整数
byte、short、int、long四种基本数据类型表示整数,注意long类型,使用long修饰的变量需要在数值后面加上L或者l,比如
long num = 1L;
,一般使用大写L避免与1混淆。
浮点数
float和double类型表示浮点数,注意float类型的数值后面需要加上F或者f,否则会当成DOuble类型处理。double类型的数值可以加上D或者d,也可以不加。
char类型
char a = 'a';
char可以和整数类型互相转换,比如
char a = 97;
也可以用十六进制表示
char a = '\u0061';
boolean类型
boolean类型(布尔类型)用于表示真值true或者假值false,Java中布尔值不能和整数类型或者其它类型互相转换。
String
Java中使用String类来定义一个字符串,字符串是常量,它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。
1.String对象的初始化格式
String s0 = "abc";
或者
String s1 = new String("abc");
两种方法其实有很大的区别。前者会在栈中穿件一个对象引用变量s0,然后查看栈中是否存在"abc",如果没有,则将"abc"存放进栈,并令引用变量s0指向他;如果已经有"abc",则直接令s0指向它。
而后者是Java中标准的对象创建方式,其创建的对象将直接放置到堆中,每调用一次就会创建一个新的对象。
前者可能是一个陷阱,可能没有创建新的对象。
下述代码展示了二者的不同。
其中"=="比较的是两个对象在内存中存储的地址是否一样。
计算字符串长度
length()方法
public int length(){
}
调用方法:字符串标识符.length();返回一个int类型的整数(字符串中字符数,中文字符也是一个字符)。例如:
String s1 = "JoJo";
String s2 = "和Dio的奇妙冒险";
int len1 = s1.length();
int len2 = s2.length();
则变量len1的值是4,变量len2的值是9。
顺便提一下,如果想知道一个整型数组的长度,那么数组名.length即可,也就是去掉length后面的小括号。
字符串比较
equals()方法,该方法的作用是判断两个字符串对象的内容是否相同,相同则返回true,不同则返回false。
equals()方法比较是从第一个字符开始,一个字符一个字符一次比较。
如果想忽略大小写关系,则使用equalsIgnoreCase()方法即可,用法与equals相同。
String s1="JoJo";
String s2="JOJO";
System.out.println("用equals()比较,结果为"+s1.equals(s2));
System.out.println("用equalsIgnoreCase()比较,结果为"+s1.equalsIgnoreCase(s2));
结果为:
用equals()比较,结果为false
用equalsIgnoreCase()比较,结果为false
字符串连接
字符串连接有两种方法:
1.使用+
String s = "JoJo"+"的奇妙冒险";
使用+进行连接,不仅可以连接字符串,也可以连接其他类型。但是要求连接时至少有一个参与连接的内容是字符串类型。
2.使用String类的concat()方法
String s0 = new String("JoJo");
String s1 = new String("的奇妙冒险");
String s2 = s0.concat(s1);
charAt()方法
charAt()方法的作用是按照索引值(规定字符串中第一个字符的索引值是0,第二个字符的索引值是1,依次类推),获得字符串中的指定字符。
String s = "abc";
char c = s.charAt(1);
则c的值是'b'。
字符串常用提取方法
方法 | 返回值 | 功能描述 |
---|---|---|
indexOf(int ch) | int | 搜索字符ch第一次出现的索引 |
indexOf(String value) | int | 搜索字符串value第一次出现的索引 |
lastIndexOf(int ch) | int | 搜索字符ch最后一次出现的索引 |
lastIndexOf(String value) | int | 搜索字符串value最后一次出现的索引 |
substring(int index) | String | 提取从位置索引开始到结束的字符串 |
substring(int beginindex,int endindex) | String | 提取beginindex和endindex之间的字符串部分 |
trim() | String | 返回一个前后不含任何空格的调用字符串的副本 |
说明:子字符串包含beginindex的字符,但不包含endindex的字符。 |
练习:字符串处理
要求:
- 从控制台输入一行字符串
- 去除字符串中的所有空格
- 打印去除空格后的字符串
提示:
java.util.Scanner可以获取控制台输入。
我的代码:
import java.util.Scanner;
public class StringUtil{
public static void main(String[] args){
Scanner in =new Scanner(System.in);
String a=in.nextLine();
int i;
for(i=0;i<a.length();i++){
if(a.charAt(i)!=' '){
System.out.print(a.charAt(i));
}
}
}
}
注意,一定要有第一句import java.util.Scanner
,不然无法使用Scanner获取控制台输入。
练习:对比字符串
要求
- 从控制台输入字符串a和字符串b
- 比较字符串a和字符串b是否长度、内容等完全一致
- 如果完全一致,输出相同,如果不一致,输出不同。
- 禁止使用equals方法
我的代码:
import java.util.Scanner;
public class ContrastString{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
String a = in.nextLine();
String b = in.nextLine();
int flag = 1;
int i;
if(a.length()!=b.length()) flag=0;
for(i=0;i<a.length();i++){
if(a.charAt(i)!=b.charAt(i)) flag=0;
}
if(flag==1) System.out.println("相同");
else System.out.println("不同");
}
}
上面这个有Bug,如果第一个字符串的长度比第二个长,就会报下面的错误。
java ContrastString [15:25:55]
nihaoma
nihal
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 5
at java.lang.String.charAt(String.java:658)
at ContrastString.main(ContrastString.java:11)
那么学习了exit用法后,修改程序,下面这个就去除了Bug。
import java.util.Scanner;
public class ContrastString{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
String a = in.nextLine();
String b = in.nextLine();
int flag = 1;
int i;
if(a.length()!=b.length()){
System.out.println("不同");
System.exit(0);
}
for(i=0;i<a.length();i++){
if(a.charAt(i)!=b.charAt(i)){
System.out.println("不同");
System.exit(0);
}
}
System.out.println("相同");
}
}
运算符
运算符是一种符号,它是连接一个以上的操作符,实现某种功能的运算。
算数运算符
用于数学表达式。
"+","-","*","/","%","++","--"很简单,不列表说明了。前5个为双目运算符,后2个为单目运算符。
注意,若int a = 5
,则a++
=5,++a
=6。
而且即使把a++
放在System.out.println里,虽然这时输出的a的值没有变,但其实之后a的值就变了。
int a = 5;
System.out.println(a++);
System.out.println(++a);
输出结果为:
5
7
可见,a++
确实改变了a的值。
位运算符
位运算符应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。
位运算时先转换为二进制,再按位运算。
下面的表格中,变量a的值为60,变量b的值为13:
位运算符 | 名称 | 描述 | 举例 |
---|---|---|---|
& | 按位与 | 如果相对应位都是1,则结果为1,否则为0 | (a&b),得到12,即0000 1100 |
| | 按位或 | 如果相对应位都是0,则结果为0,否则为1 | (a|b),得到61,即0011 1101 |
^ | 按位异或 | 如果相对应位值相同,则结果为0,否则为1 | (a^b)得到49,即0011 0001 |
~ | 按位补 | 翻转操作数的每一位,即0变成1,1变成0 | (~a)得到-61,即1100 0011 |
<< | 按位左移 | 左操作数按位左移右操作数指定的位数 | a<<2得到240,即1111 0000 |
>> | 按位右移 | 左操作数按位右移右操作数指定的位数 | a>>2得到15即1111 |
<<< | 按位右移补零(无符号右移) | 左操作数指定的值按右操作数指定的位数右移,移动得到的空位以零补充 | a>>>2得到15即0000 1111 |
逻辑运算符
逻辑运算符是通过运算符将操作数或等式进行逻辑判断的语句。
"&&","||","!","^",只有最后一个异或有点难,不列表了。除了"!"都为双目运算符。
异或的用法:如果两个操作数逻辑相同,则结果为假,否则为真。
关系运算符
关系运算符生成一个boolean结果,它们计算的是操作数的值之间的关系。如果关系是真实的,结果为true,否则,结果为false。
"==","!=",">","<",">=","<="都很简单,不再列表。除了这些二元运算符,Java还有唯一的一个三目运算符?:
语法格式:布尔表达式?表达式1:表达式2
(相当于一种简单if else的代替)
- "=="和"!="适用于所有的基本数据类型,其他关系运算符不适用于boolean,因为boolean值只有true和false,比较没有任何意义。
- "=="和"!="也适用于所有对象,可以比较对象的引用是否相同。
引用:Java中一切都是对象,但操作的标识符实际是对象的一个引用。
运算符的优先级



}
在上面的语法说明中:
1.**访问修饰符:**代表方法允许被访问的权限范围,可以是public、protected、private或者省略(default),其中public表示该方法可以被其他任何代码调用。
2.**返回值类型:**方法返回值的类型,如果方法不返回任何返回值,则返回值类型指定为void(代表无类型);如果方法具有返回值,则需要制定返回值的类型,并且在方法体中使用return语句返回值。
Java的方法与C的函数很相似,不同的是,方法与对象有关,而函数与对象无关。方法的参数传递通常是隐式的,他可以直接操作类内部的数据。方法依赖于某个特定的对象,我们可以说“调用对象X的Y方法”,而不能说“调用Y方法”。
3.**方法名:**是方法的名字,必须使用合法的标识符。
>Java标识符由数字,字母和下划线(_),美元符号($)或人民币符号(¥)组成。在Java中是区分大小写的,而且还要求首位不能是数字。最重要的是,Java*关键字*不能当作Java标识符。
1.类和接口名。每个字的首字母大写,含有大小写。例如:MyClass,HelloWorld,Time等。
2.方法名。首字母小写,其余的首字母大写,含大小写,尽量少用下划线。例如,myName,setTime等驼峰式命名。
3.常量名。基本数据类型的常量名使用全部大写字母,字与字之间用下划线分隔。对象常量可大小混写。例如:SIZE_NAME。
4.变量名。可大小写混写,首字符小写,字间分隔符用字的首字母大写。不用下划线,少用美元符号。给变量命名是尽量做到见名知义。
4.**参数列表:**是传递给方法的参数列表,参数可以有多个,多个参数间以逗号隔开,每个参数由参数类型和参数名组成,以空格隔开。当方法被调用时,传递值给参数。这个值称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
5.**方法体:**方法体包含具体的语句,定义该方法的功能。
根据方法是否带参,是否带返回值,可将方法分为四类:
* 无参无返回值方法
* 无参带返回值方法
* 带参无返回值方法
* 带参带返回值方法
当方法定义好之后,需要调用才可以生效,我们可以通过main方法(main方法是Java程序的入口,所以需要用它来调用)来调用它。示例:
```java
public class MethoDemo{
public static void main(String[] args){
method();
}
public static void method(){
System.out.println("方法被调用");
}
}
参考
Java编程基础(实验楼)
Java中String初始化的两种方式
to be continued
总有一天,我会用高亮的代码段让这里焕然一新!这是我的宣言!