Java的基本程序设计
一个简单的Java程序
public class testcode
{
public static void main(String[] args)
{
System.out.println("Hello,Word!");
}
}
这就是一个简单的Hello,Word!
程序,所有的Java程序都是这个结构,所以先来仔细的分析一下这段代码
public
是访问修饰符,用于控制程序中其他部分对这部分代码的访问级别
class
表明Java程序的所有内容都包含在类中,可以理解为程序逻辑的一个容器
class
的后面紧跟着是类名,类名必须是字母开头,后面跟字母和数字的任意组合,长度不限但不能于保留字冲突
源代码的文件名必须与公共类名字相同,并且扩展名是.jaja
,如果没有编译错误,编译器会编译出包含这个类的字节码文件.class
Java虚拟机在执行一个类时总是从main
方法开始执行,所以类的源文件中必须包含一个main
方法,根据Java语言规范main
必须声明为public
Java中所谓方法,就是用来解决一类问题的代码的有序组合,是一个功能模块。
Java中也和c语言一样用{}
来划分程序的各个部分
对于这个方法,只有一条语句,我们使用了Systeam.out
对象并调用了他的方法println
,点号用于调用方法。Java的通用方法是
object.method(parameters)
这等价于函数调用
Java中的方法可以有一个或多个参数,也可以没有参数但括号不能省略
注释
Java中注释和c++相同,单行注释//
,多行注释/**/
数据类型
Java是强类型语言,即每个变量都有类型。
整形
类型 | 存储需求 | 取值范围 |
---|---|---|
int |
4B | [-2147483648,-2147483648] (刚刚20亿) |
short |
2B | [-32768,32767] |
long |
8B | [-9223372036854775808,9223372036854775807] |
byte |
1B | [-128,127] |
因为Java是在Java虚拟机上运行,所以取值范围与平台无关
注意Java没有任何无符号整型
普通的数字就是int
,long
有一个后缀l
或L
(如4000000000L
)
十六进制有前缀0x
或0X
,八进制有前缀0
Java7之后就有了,二进制前缀0b
或0B
,同时也可以在数字中插入下划线1_000_000_000
,编译时编译器会自动去掉
浮点型
类型 | 存储需求 | 取值范围 |
---|---|---|
float |
4B | 大约6到7位 |
double |
8B | 大约15位 |
同时有三个常数表示溢出或出错
- 正无穷大
Double.POSITIVE_INFINITY
- 负无穷大
Double.NEGATIVE_INFINITY
- 不是一个数
Double.NaN
char型
char
型用于表示单个字符,通常是占16位,当有些字符需要消耗两个char
char
采用的是Unicode
编码,Unicode
前128位于ASCll
相同
boolean型
boolean
布尔型只有两个值false
和true
,并且布尔型不能像c++中那样用0/1
表示,也不能于整型转换
变量与常量
声明变量
在Java中每一个变量都要有一个类型(type)
double a;
int b;
long c;
boolean d;
所有的Java语句都必须以分号结尾,而声明也是一个语句
Java的变量必须是以字母开头由字母和数字构成的序列,但是Java的字母不只是英文字母,Unicode中的字母都可以。保留字也不能作为变量名
int i , j;
Java也可以的一行多个变量
变量初始化
Java声明变量后必须以赋值语句对其初始化
int a;
a = 12;
同时写在一行中也是合法的
int a = 12;
Java的声明语句可以放在程序的任意位置,但是不能使用未初始化的变量
int a;
System.out.println(a);
这样的会被编译器当成是错误的语句
在Java 10之后,如果可以通过变量的初始值推断出变量类型可以不声明类型,用var即可
var a = 12; // a is an int
var b = "abc"; // b is a String
常量
在Java中定义常量只需要加上final
即可
final double PI = 3.1415926;
常量只能被赋值一次,且赋值后不能更改。习惯上常量名用全大写。
Java中如果希望某个常量在一个类的多个方法中使用可以声明类常量(class constant)
public class testcode{ static final double PI = 3.14159; public static final int a = 10; public static void main(String[] args) { double d = 10; System.out.println( PI * d ); }}
这里的PI
就是一个类常量,如果希望一个一个类可以在其他的类的方法中被使用,可以声明为public
如这里的a
尽管
const
是Java的是保留字,但是并没有被使用。想要声明常量只能用final
。
枚举类型
如果变量的取值在一个固定的范围中,例如衣服的尺码只有S,M,L,XL
四种。针对这种情况我们可以自定义枚举类型
enum Size { S , M , L , XL };
现在可以声明这种类型的变量
Size s = Size.M;
Size
类型的变量只能存储这个类型声明中给定的值或null
。null
表示没有设置任何值
运算符
算数运算符
Java中的算数运算符有+,-,*,/,%
,整体和c++类似,特别的对于/
两个数都是整型则为整型除法,否则均为浮点数除法
数学函数与常量
Math
类中包含了许多的函数,比如开方Math.sqrt(x)
和幂运算Math.pow(x,y)
还用常用的三角函数
Math.sin(x);Math.cos(x);Math.tan(x);math.atan(x);math.atan2(x);
还有指数函数,以自然对数为底、以十为底的对数函数
Math.exp(x);Math.log(x);Math.log10(x);
还用两个常量\(\pi\)和\(e\),注意这里只是与之最接近的近似值并非准确值
Math.PI;Math.E;
其实并不用每句话有加上Math.
,还可以采用静态导入的方法在程序的源文件顶部加上
import static java.lang.Math.*;
数值类型的转换
以下六个箭头代表无信息丢失的转换
以下三个箭头代表可能有精度丢失的转换
若没有箭头则无法进行转换
强制类型转换
当需要转换数据类型的时候可以进行强制类型转换,这点和c++
类似
double x = 9.997;int y = (int) x;
这样得到的y
值是的值就是9
但是有些时候我们还需要进行四舍五入,这样可以用
double x 9.997;int y = (int) Math.rand(x);
这样y
的值就是10
,当调用rand
方法时依然需要进行强制类型转换,因为rand
方法的返回值时lang
类型
无论如何都不要将
boolean
与其他类型进行强制类型转换,若确实需要可以用三目运算符b?1:0
组合赋值和运算符
x+=4
等价于x = x + 4
,如果左右的数据类型不同就会发生强制类型转换,如果x
是int
类型x += 3
等价于x = (int) (x + 3.5)
自增自减运算符
和c++
的运算符基本相同,既有前缀也有后缀两种
关系和boolean运算符
Java包含丰富的关系运算符,要检测相等可以用==
,同样不等也可以用!=
,整体上来说Java沿用了c++
的模式>,<,>=,<=
都相同
还有逻辑与$$
和逻辑或||
,有点不同的是逻辑运算符采用”短路“的模式,x!=0&&x>0
如果x
是非零数,那么前半部分就已经判断出答案为假就不在继续判断了
特别的以上几种运算符返回值全部是true
或false
最后一点,Java支持三元运算符,x?1:2
,其中x
成立返回1
否则返回2
位运算符
在Java中有四种位运算符
$
(and)|
(or)^
(xor)~
(not)
同时还有<<
左移、>>
右移,还有一种特殊的运算符是>>>
也是左移,与>>
不同的是他是用0
来填充高位,而>>
是用符号位来填充
优先级和括号
Java的优先级和c++
基本相同,也可以用()[]
来调整运算优先级,值得注意的是,
在java中不是运算符
字符串
Java中没有字符串,但是Java预制了字符串类,就是Unicode字符序列,字符串要用双引号括起来
String s = "Hello";
子串
字符串可以进行截取字符串,填入的是一个左闭右开的区间
String x = "Hello";String y = x.substring(0,3);// y is "Hel"
拼接
java语言也支持对字符串进行拼接,通常来说拼接可以用+
String a = "Hello";String b = "Word";String c = a+b;// c is "HelloWord"
这里拼接后两个单词之间是没有空格的
Java中也可以将非字符串和字符串进行拼接,拼接后还是字符串,Java中任何对象都可以转换成字符串
String a = "age is ";int b = 18;String c = a+b;// c is "age is 18"
如果要把多个字符串拼接并用界定符分隔可以用join
方法
String a = String.join( "/" , "S" , "M" , "L" , "XL");// a is "S/M/L/XL"
Java11之后还如果重复一个字符串还有repeat
String a = "Java".repeat(3);// a is "JavaJavaJava"
不可变字符串
在Java中字符串是无法进行修改的,如果确实需要修改可以先截取在拼接的方式
String a = "abcd";a = a.substring(0,2) + 'o' + a.substring(2,4);// a is "abocd"
判断相等
可以用equals
的方式来判断,例如a.equals(b)
,他的返回值是boolean
类型
如果忽略大小写可以用a.equalsIgnoreCase(b)
来判断
在Java中不能==
来判断,因为==
判断的是两个字符串放在同一个位置,因为Java中String
的实现是类似与c++中的char *
指针
构建字符串
如果需要用多个较短的字符串构建一个较长的字符串可以用字符串构建器
StringBuilder builder = new StringBuilder();builder.append('a');builder.append("bc");builder.append(12);String s = builder.toString();// s is "abc12"
输入与输出
读取输入
首先我们要引入Scanner类
import java.util.Scanner;
想要读取“标准输入流”,也就是从控制台读入,首先要新建一个与System.in关联的Scanner对象
Scanner in = new Scanner(System.in);
然后就可以进行读取了
String a = in.nextLine();//读入一行
String b = in.next();//读入一个字符串
int c = in.nextInt();//读入一个整型
double d = in.nextDouble();//读入一个浮点型
除了读入还有以下几个方法,他们的返回值是boolean
型用于判断后面还有没有数据
hasNext();hasNextInt();hasNextDouble();
格式化输出
正常情况下可以用System.out
类总的print
方法输出
从Java5之后沿用了c语言总的printf
方法可以进行格式化输出
double a = 123.45678;System.out.printf("%6.2f\n",a);// 123.46
用格式化输出也可同时输出多个常数
常用的转义字符有
d
十进制整数,x
十六进制整数,o
八进制整数,f
浮点数,e
指数浮点数,s
字符串,c
字符,b
布尔
同时嗨哟不同的标记符号
+
打印正负号,0
增加前导零,-
左对齐,(
将负数用括号括起来
同时也可以用String.format
创建格式化的字符串
String s = String.format("%6.2",a);
控制流程
条件语句
Java总的if
语句的应用基本和c语言总一致,既可以用{}
嵌套代码块,也可以只跟一个语句
if( a > 0 )
{
System.out.println("+");
}
else if( a < 0 )
{
System.out.println("-");
}
else System.out.println("0");
循环
循环语句也是很类似c语言,while(condition)statement
,do statement while(condition)
两种循环
确定循环
也就是c语言总的for循环,实际上用起来也是非常的类似
for( int i = 1 ; i <= 10 ; i ++ )
Systeam.out.println(i);
三个部分也分别是初始化、检查、更新
多重选择
其实就是switch语句,和c语言的基本没差别
switch (a)
{
case 1:
System.out.println(1);
break;
case 2:
System.out.println(2);
default:
System.out.println("other");
break;
}