1.1认识java程序
我们可以用以下代码来了解一个简单的Java代码的基本语句:
public class FirstSample{
public static void main(String[] args){
System.out.println("Hello World!");
}
}
我们从上往下看;
首先是外部的一个class类。所有的java代码都必须写在class类的括号内;
其次是main方法。每一个Java应用程序都必须有main方法,可以理解为程序最后的出口
最后是中心的调用语句。在Java中,我们想要实现某个功能,需要调用该功能所在的方法等,这时就需要用到调用。通常Java程序以这种格式调用一个方法:
对象名.方法名(输入参数)
1.2注释以及代码格式
在写一段代码时,为了增加代码的可读性以及美观,通常我们会在代码中添加个人注释和刻意控制代码的格式来达到目的
以下为三种注释在代码中的书写方式:
public class FirstSample{ //我是单行注释
/*
* 我是多行注释
*/
public static void main(String[] args /*我是行内注释*/ )
System.out.println("Hello World!");
}
}
另外,代码的书写格式没有具体规定,书写代码者可以根据自己的喜好来决定代码的分布,只要确保代码整齐美观,清晰易读即可。
1.3数据类型
由于应用的需要,根据需要存储的数据大小以及格式,Java拥有相对应的不同数据类型。
数据类型 | 类型所占字节数(bit) | 存储数据内容 |
byte | 1 | -128~127 |
short | 2 | -32768~32767 |
int | 4 | -2147483648~2147483647 |
long | 8 | 更大范围整数 |
float | 4 | 浮点数(小数) |
double | 8 | 浮点数(精度比float更高) |
char | 2 | Ascall码 |
boolean | 1 | ture/false |
值得注意的是,在C语言中,boolean转化为int时会相应的变成0或者1。也就是说在C语 言中true/fase等价与1/0。这一点在Java中是不被承认的。
char类型
( 之后添加)
除了基本数据类型之外,Java还有一种类型,叫做引用数据类型。常见的有String
1.4变量
在Java程序中,每一个变量都有一个类型。
一个变量的名称必须有一个字母。一般来说,变量的名称由字母,下划线,数字三者组成,并且要符合排列顺序,字母必须在第一个。
下面是几个约定俗成的命名格式:
public class SecondSample{ //双单词类名一般使用双大写
double salary;
int vacationDays; //双单词变量名一般先小写后大写
long earthPopulation;
char ch1,ch2;
final CM_PER_INXH = 2.54 //常量一般使用全大写拼写
}
1.5操作及操作符
Java运算操作符
+ | 加 |
- | 减 |
* | 乘 |
/ | 除以 |
% | 取余 |
+= | a+=b等价a+b |
-= | 同上理 |
*= | 同上 |
/= | 同上 |
%= | 同上 |
++ i | 先运行,后自加1 |
-- i | 先运行,后自减1 |
i ++ | 先自加1,后运行 |
i -- | 先自减1,后运行 |
Math库
有时候在写一个Java程序时,我们需要相应的数学公式,这个时候就需要领用另外一种方法:调用Math库中的数学方法:
public class Sample{
public static void main(String[] args){
double x = 4;
double y = Math.sqrt(x);
/*
*此外,还有诸如sin,cos,log10,log等都可以这样调用
*/
System.out.println(y);
}
}
Tips:这里普及几个常用Math函数;
Math.round() : 四舍五入取整;
强制转换
当需要存储的数据不满足容器(变量)类型时,最直接的方法就是强制转换。
强制转换类型代码形式如下:
类型1 变量 = ( 类型2 )变量2;
double x = 9.997;
int nx = (int)x;
以上代码的输出结果nx值为9,由此可以看出强行转换对于小数的处理是直接截取小数部分,并不会考虑数据损耗。所以在具体应用强制转换时需要视情况而定。
Java关系操作符
== | 等于 |
!= | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
这些关系运算符最后返回的都是boolean类型的值
Tips:另外还有两个通常与以上关系运算符同时出现的运算符 || 和 && 分别代表与和或
|| 两边判断值一边是true返回值就是ture
&& 两边同时为ture返回值才是tureb
对了,还有Java中的非运算符!,他们均出现于boolean值的判断中
?:操作符
表达式1 ?表达式2 : 表达式3
该操作符作用是简化双选择块if语句的篇幅。例如:x<y ? x:y 语句,实际上就等价于以下代码:
if( x < y ){
return x;
}
else{
return y;
}
合理运用可以使得代码整体更加的精简。
操作符之间的优先级
运算符的优先级左右着一条表达式的运行顺序,了解这些优先级顺序也便于我们更加准确的读代码和写代码。
1.6 字符串String
字符与字符串
字符串(String)由一个或多个单一字符(char)组成。
在java表达式中,字符串用“ ”(双引号)来囊括,而字符则是' '(单引号)。
char c1 = 'x'; //字符与字符串
String c2 = "X";
Stirng c3 = ""; //双引号内为空,c3字符串长度为0
String c4 = " "; //双引号内为空格,c4字符串长度为1
注意,在创建一个String类型的变量时必须给其赋值,也就是必须初始化。基本类型不需要初始化是因为Java对基本类型都设有一个默认值。
每个类型的数据都必须初始化,否则将会报错。
Substring方法
在对String类型函数进行操作时,我们有时候需要对字符串中间一个或多个字符进行操作。
Java为了精简操作的流程,在String库内写好了相应的方法Substring(). 该函数的返回类型为String
变量名.substring(起始对象下标,取用长度)
public class Smaple4{
public static void main(Stirng[] args){
String greeting = "Hello";
String s = greeting.substring(0,3);
System.out.println(s);
}
}
上述代码输出结果为 "Hel"。值得注意的是,字符串的默认起始下标为0,这一点和数组一致。
字符串连结
在java中,我们运用 + 来连结两端字符串
int age = 13;
String firstName = "WANG";
String lastName = "WEI";
String A1 = firstName + age; //=>"WANG
String A2 = firstName +lastName //=>"WANGWEI"
值得注意的是,当int类型数据被 + 连结上一个String类型数据,那么int类型数据会被直接转换成String类型。
Equal方法——字符串之间的比较
当我们相比较两组数据大小是否一致时,通常会用到 == 。
但是,当我们执行以下操作时:
public class Smaple4{
public static void main(Stirng[] args){
String s1 = new String("Name");
String s2 = new String("Name");
System.out.println(s1==s2);
}
}
//返回: flase
为什么看似相同的s1,s2在==的判断下却不相同呢?
正如1.3所提到的,因为Stiring类型为引用数据类型,如果用 == 来比较,比较的数据是s1,s2所存储数据的存储地址,而非内容。
这时候,String类内部重写的equal方法就派上了用场。使用方法为:
s1.equals(s2)
空串与无效字符串
空串:如果一段字符串的字符长度为0,那么,我们说这个字符串是一个空串 ( “” )
无效字符串:无意义的字符串,其值为null
注意,空串不等于无效字符串
1.7输入与输出
输入
对于初学者而言,Java有三种输出方式:
Syatem.out.println(); //输出字符串并换行
System.out.print(); //输出字符串
System.out.prrintf() //按照所给类型输出
针对printf,以下做出详细说明:
System.out.printf(" 格式1 格式2 格式3”,字符串1,字符串2,字符串3);
每种类型对应后续的每个字符串。另外还有这些常用格式的类型:
- %s : 输出小写字符串
- %S:输出大写
- %d : 输出十进制整数
- %o : 输出八进制整数
- %x : 输出小写十六进制整数
- %X : 输出大写十六进制整数
- %f : 输出浮点数
- %e : 输出科学计数法表示的浮点数(小写e)
- %E : 输出科学计数法表示的浮点数(大写E)
- %.nf : 控制小数点后的位数,n为数字
- %b : 输出布尔值
- %c : 输出字符
- %n:换行符
输出
当我们需要输入时,Java需要从Scanner类中调用一个“操作员”来从操作台中进行读取。
Scanner in = new Scanner(System.in);
此时,in作为“操作员,即可进行调用Scanner中的种种读取方法
public class Smaple5{
public static void main(Stirng[] args){
Scanner in = new Scanner(System.in);
int s1 = in.nextInt(); //next后面跟首字母大写的类型名
double s2 = in.nextDouble(); //用于读取对应的数据转变成该类型存储
Stirng s3 = in.next(); //读取时碰见空格会自动终止
Stirng s4 = in.nextLine(); //可以读取全部操作台字符
}
}
但是!为了调用Scanner中的方法,我们需要引入头文件:
import java.util.*;
在java学习初期,这个头文件几乎包含了大部分所需要的方法,因此,为了方便(偷懒)可以在写代码时无脑加上QWQ。
从文件中输入(读取)输出
当我们需要从电脑中的文件里读取或输出一段文本,可以用以下语句:
Scanner in = new Scanner(Paths.get("文本地址") , "UTF-8");
PrintWriter out = new PrintWriter("文本地址" , "UTF-8");
其中,文本地址需要具体到如 ”c:\\mydirectory\\mufile.txt"
PS:UTF-8是一种编码格式,这里作用是将文本转换成这种格式给计算机储存。
1.8控制流程
条件判断语句
在Java中,条件判断语句有三种形式:
if (条件) 执行语句
if(条件) 执行语句1 else 执行语句2
if...else if.....
前两者称为行if语句,用于处理判断单条件是否满足;
第三个叫做块if语句,用于处理判断多条件
循环
同样也是三种,分别叫做while循环,do-while循环和for循环:
while(条件) 执行语句
do 执行语句 while(条件)
for(条件) 执行语句
之后会对三种循环的优劣进行详细的分析,这里就不再赘述。
多个条件——switch语句
当我们需要实现在多个同属性的选项中进行选择时,switch语句会帮我们清晰的完成排列:
switch(表达式){
case 条件1:
语句;
case 条件2:
语句;
......
default:
语句
}
break和continue
在循环中,有时候我们想在循环中途完成某个判断后就退出循环,或进行下一新欢,减少时间成本,这时候就会用到break和continue。
break : 跳出整个循环,不再继续;
continue : 跳出本次循环,直接进行下一个循环;
1.9数组
当我们需要存储一系列类型相同的数据时,数组是一个不错的选择。
类型1[ ] 变量名;
int [] a;
a = new int[100]; //该数组大小为100,即可存储100个该种类型数据
数组初始化
数组的初始化通常有三种形式:
int[] a1 = {2,3,4,5,6};
int[] a2 = new int[] {2,3,4,5,6};
int[] a3;
a3 = {2,3,4,5,6};
在java中,如果初始化时没有在[ ]中定义数组大小,程序会根据初始化时花括号内的元素个数自动设置数组的大小。
当我们没有对数组进行赋值,也就是当我们刚创建一个数组对象的时候,实际上就是创建了一个引用数组,并且每个引用都会自动被初始化为一个特定值,该值有自己的关键字null。一旦Java看到null,就知道这个引用还没有指向某个对象。该对于null的解释对于任何引用类型生效。
foreach循环
在数组遍历中,我们有一种更为简便的“for”循环:foreach循环。请看以下两组代码:
public class Smaple5{
public static void main(Stirng[] args){
int a = new int[100];
for(int element:a){
System.out.println(element);
}
int b = new int[100];
int t;
for(int i=0;i<100;i++){
t=b[i];
System.out.println(t);
}
}
}
在上述代码中,我们可以看到的是:element完成了t和i两个人的工作:遍历和存储。
数组复制
数组的复制分为两种:表复制和里复制。示例代码如下:
int [] a1 = {1,2,3,4};
int [] a2 = a1;
a2[2] = 12;
int a3 = Arrays.copyOf(0,a1.length); //(起始下标,复制长度)
运行代码可得知,a1a2实际上指的是同一个地址存储的数据。例如在a1初始化中,a1[2]中存储的数值是3,但是,经过对a2[2]的数据进行更改后,a1[2]的数据也被改成了12。
而a3才真正调用Array类中的方法复制出一个新的数组。该数组与a1独立,二者互不干扰。
多维数组
多维数组的初始化代码如下:
int [][] a1 = new int [2][3];
int [][] a2 = { {1,2,3}
{2,3,4}};
上述代码均创建了一个两行三列的二维数组。多维数组只要以此向外拓展即可。