[关闭]
@Sakura-W 2016-07-14T03:10:02.000000Z 字数 6739 阅读 1881

Java基础(一)之基础语法知识

Java

---参考于《Java核心技术卷》

一、基本知识

1.Java对大小写敏感。

2.Java程序中的全部内容都包含在类中,这里将类看做一个加载程序逻辑的容器,程序逻辑定义了应用程序的行为。

3.源代码的文件名必须与公共类的名字相同,并用.java作为扩展名。

4.根据Java语言规范,main方法必须声明为public。并且main方法必须是静态的,关键字void表示这个方法没有返回值,所不同的是main方法没有给操作系统返回"退出代码"。

5.Java中所有函数都属于某个类的方法。标准术语将其称为方法,而不是成员函数。

二、注释

1.行注释//
1)说明:注释内容从//开始到本行结尾
2)例子:

System.out.print("Hello World");//say hello

2.长篇注释/*....*/
用来将一段比较长的注释括起来,可以跨行。/**/注释不能嵌套,也就是说如果代码本身包括了一个*/,就不能用/**/将注释括起来

3.生成自动文档/**....*/

三、数据类型

1.8种数据类型

4种整型:byte、short、int、long
2种浮点型:float、double
1种字符类型:char
1种布尔类型:boolean

2.整型

byte类型   1字节
short类型  2字节
int类型    4字节
long类型   8字节//长整型后面有个L,如400000000000L

在Java中,整型的范围与运行Java代码的机器无关。也就是说,在任意一台电脑上,int的长度都是4字节(不同于C/C++)。Java中没有任何无符号类型(unsigned)

3.浮点类型
浮点类型用于表示有小数部分的数值。

float   4字节//有一个后缀F,如3.14F
double  8字节

绝大部分应用程序使用double类型,很多情况下float类型的精度很难满足需求。
Java中表示溢出和出错的情况的三个特殊的浮点数值:

正无穷大//正整数除以0的结果为正无穷大
负无穷大
NaN(不是一个数字)//计算0/0或者负数的平方根的结果为NaN

Double.NaN不等于自身
浮点数采用二进制系统表示,而二进制系统中无法精确表示分数1/10,所以浮点数不适用与精度计算中。如果需要在数值计算中不含任何舍入误差,就应该使用BigDecimal类。

4.char类型
char类型用于表示单个字符。通常用来表示字符常量。
在Java中,char类型采用UTF-16编码描述一个代码单元。
强烈建议不要在程序中使用char类型!!。最好将处理的字符串用抽象数据类型表示。

5.boolean类型
boolean类型有两个值:true和false。整型值和布尔值之间不能进行相互转换。(不同于C/C++)

四、变量

在Java中,每一个变量属于一种类型。

1.变量声明

double salary;//变量所属类型位于变量名之前

2.变量初始化
声明一个变量之后,必须用赋值语句对变量进行显式初始化。

double salary = 10.0;

在Java中,变量的声明尽可能靠近变量第一次使用的地方。Java中不区分变量的声明与定义。

3.常量
在Java中,用final关键字指示常量。

public static void main(String[] args){
    public final DC = 1;
}

关键字final表示这个变量只能被赋值一次。一旦被赋值之后,就不能再次更改了。习惯上常量名使用全大写。

类常量:在Java中,经常希望某个常量可以在一个类中多个方法中使用,通常将这些常量称为类常量,使用static final设置。

public class Test{
    public static final int DDD = 1;
}

五、运算符

1.基本运算符

+  表示加
-  表示减
*  表示乘
/  表示除//在Java中,两个整数相除得到整数,否则得到浮点数。
   整数被0除将会产生一个异常,浮点数被0除得到无穷大或者NaN

2.自增运算符和自减运算符

n++  ++n//自增运算符只能改变变量的值,不能改变数值的值。
n--  --n
4++//错误!!

3.关系运算符与boolean运算符

==   使用两个等号检测是否相等,返回布尔值:true或false
!=   检测两个值是否不相等
&&   逻辑"与"//逻辑运算符&&和||都按照"短路方式"求值
||   逻辑"或"
!    逻辑"非"
x < y ? x : y;//Java支持三元操作符

4.位运算符
在处理整型数值时,可以直接对组成整型数值的各个位进行操作,这意味着可以使用屏蔽技术获得整数中的各个位

&   按位与:两个位都为1,结果为1
|   按位或:两个位都为0,结果为0
^   按位异或:两个位相同为0,不同为1
~   按位非:1变0,0变1
<<  左移操作:各二进位全部左移若干位,高位丢弃,低位补0
>>  右移操作:各二进位全部右移若干位,无符号数高位补0,有符号数高位用符号位填充
>>> 无符号右移操作:各二进位全部右移若干位,无论是否是有(无)符号,高位补0

5.数学函数与常量
1)数学函数:

Math.sqrt(9);//求一个数的平方根
Math.pow(x,a);//求x的a次幂。pow方法有两个double类型的参数,返回值也是double
Math.round(x);//对一个数四舍五入
Math.random();//随机产生一个0-1之间的浮点数

2)数学常量:

Math.PI//表示π
Math.E//表示常数e

6.数值类型之间的转换
1)合法转换:
image_1an7jj3de1f9n1fbf1tuvuc2ml09.png-23.9kB

实心箭头表示转换无信息丢失,虚箭头表示有精度损失。

2)进行二元操作时的转换

如果一个数是double,则另一个数就会转换成double类型
否则如果一个数是float,则另一个数就会转换为float
否则如果一个数是long,则另一个数就会转换成long
否则,两个数都会转换成int

优先级:double > float > long > int

3)强制类型转换
语法:在圆括号中给出想要转换的目标类型,后面紧跟待转换的变量名

double x = 9.98;
int y = (int)x;

这种转换一般都会有精度丢失,因为转换方式就是截断小数部分。

7.枚举类型
变量的取值只在一个有限的集合内,这种情况下就可以声明一个枚举类型。

enum Size{
    SMALL,MEDIUM,LARGE,EXTRA_LARGE//后面没有分号
};//这里有分号

声明一个枚举类型的变量

Size s = Size.MEDIUM;//Size类型的变量只能存储这个类型声明中给定的某个枚举值。

六、字符串

从概念上讲,Java字符串就是Unicode字符序列。Java中没有内置的字符串类型,而是在标准Java类库中提供了一个预定义的类,叫做String。

String greet = "Hello";//每个用双引号括起来的字符串都是String类的一个实例

1.子串
String类的substring()方法可以从一个较大的字符串中提取较小的字符串。

String greet = "Hello";
String s = greet.substring(0,3);//第一个参数是开始复制的位置,第二个参数是结束复制的位置(不包括该位置)

2.拼接
Java语言允许使用加号"+"对字符串进行拼接。

String s = "Hello" + "World";

当将一个字符串与一个非字符串的值进行拼接的时候,后者被转换成字符串。

String s = "Hello" + 13;//s为Hello13

3.不可变字符串
String类对象称为不可变字符串,即字符串"Hello"永远包含字符H、e、l、l、o,而不能修改其中任何一个字符。但可以修改字符串变量greet,使它引用另一个字符串。

greet = greet.substring(0,3) + "p!";//这样greet的内容就是"Help!"

4.检测字符串是否相等
1)检测两个字符串内容是否相等,采用equals()方法

String s = "Hello";
String r = "Hello";
r.equals(s);//返回true

忽略大小写,采用equalsIgnoreCase()方法

"Hello".采用equalsIgnoreCase("hello");//返回true

2)检测两个字符串是否是同一个字符串,即处在内存中同一位置

String s = "Hello";
String r = "Hello";
System.out.print(s == r);//返回false,因为这两个字符串内存位置不同

5.空串和Null串
1)空串:长度为0的字符串""。调用字符串的length()方法确定字符串的长度

String s = "Hello";
s.length();//返回5

2)Null串,即一个字符串变量指向null。

s == null;//用此方法检测s是否是null

6.构建字符串
采用连接方式构建字符串,每次连接字符串都会构建一个新的String对象,而使用StringBuilder类就可以避免这个问题

StringBuilder builder = new StringBuilder();//构建空的字符串容器
builder.append(str);//使用append()方法添加字符串片段
String realStr = builder.toString();//转化成真正的字符串

7.String、StringBuffer、StringBuilder的区别与联系

1)String是字符串常量,但是它具有不可变性,就是一旦创建,对它进行的任何修改操作都会创建一个新的字符串对象。
2)StringBuffer是字符串可变量,是线程安全的,和StringBuilder类提供的方法完全相同。如果查看java的源代码(即java安装目录的src.zip文件),就会发现它和StringBuilder类的方法的区别就是,在每个方法前面添加了"synchronized",保证其是线程安全的。
3)StringBuilder 字符串可变量,是线程不安全的。在java API中指明:这个类是在JDK 5才开始加入的,是StringBuffer的单线程等价类。(其他两个String和StringBuffer类,都是JDK 1.0开始)

七、输入输出

1.读取输入

//首先引入Scanner类
import java.util.Scanner

//然后构造一个Scanner对象,并与标准输入流System.in关联
Scanner in = new Scanner(System.in);

//然后调用Scanner类的各种方法实现输入操作
int a = in.nextInt();//输入一个整数

next()方法和nextLine()方法

next()方法:读取字符串,已空格作为分隔符(结束点)
nextLine()方法:读取输入的下一行,可以包括空格

2.格式化输出
1)printf()方法

System.out.printf("%d",x);//与C语言的输出格式一致

2)使用DecimalFormat类

//引入DecimalFormat类
import java.text.DecimalFormat

//新建DecimalFormat对象
DecimalFormat df = new DecimalFormat();

//创建格式化字符串
String style = "0.00";//保留两位小数

//确定输出风格
df.applyPatter(style);

//格式化输出
System.out.print(df.format(1.2345));

也可以直接创建带有默认输出样式的DecimalFormat对象
DecimalFormat df = new DecimalFormat("0.00");

3.文件输入与输出
1)对文件进行读取,就需要用一个File对象构造一个Scanner对象。

Scanner in = new Scanner(Paths.get("myfile.txt"));

然后就可以用Scanner类的方法对文件进行读取了

2)要想写入文件,就需要构造一个PrintWriter对象。

PrintWriter out = new PrintWriter("myfile.txt");

如果文件不存在,就创建该文件,然后可以调用out对象的print()、printf()、println()方法进行输出了

八、控制流程

1.作用域
Java中有三种作用域:类作用域、方法作用域和块作用域。不能在同一级作用域中声明两个同名的变量。

2.条件语句

if...else...

3.循环语句

while(){...}
do{...}while(condition)
for()//确定循环

4.多重选择

switch(){
    case variables:
    ...
}
case标签可以是整型、枚举常量以及字符串字面量(Java SE7之后)

5.中断流程控制语句

break  跳出流程控制语句。后面可以加标签,相当于goto作用
continue  将控制转移到最内层循环的首部

九、大数值

如果基本的整数和浮点数精度不能满足要求,就可以使用Java.math包中的BigInteger和BigDecimal类。BigInteger类实现了任意精度的整数运算,BigDecimal类实现了任意精度的浮点数运算。

//将普通数值转换成大数值
BigInteger a = BigInteger.valueOf(100);

//相关操作(Java中没有重载运算符"+"和"*")
BigInteger c = a.add(b);//两个大数值相加
BigInteger d = c.mutiply(a);//两个大数值相乘
BigInteger e = d.subtract(a)//两个大数值相减
BigInteger f = e.divide(a)//两个大数值相除

十、数组

数组是一种数据结构,用来存储同一类型值的集合。
1.基本知识
数组声明

int[] a;
int a[];

数组的初始化

int[] a = new int[100];//数组长度不要求是常量,不同于C

创建一个数字数组时,所有元素都初始化为0.boolean数组的元素初始化为false。对象数组的元素则初始化为一个特殊值null。

获取数组中元素的个数

array.length//返回数组的长度

一旦创建了数组,就不能够再改变它的大小。如果需要动态数组,可以用ArrayList类。

2.for each循环

for(int element:a){
    System.out.print(element);//打印数组a中每一个元素
}

for each循环语句显得更加简洁、更不易出错(不必为下标的起始值和终止值操心)

打印数组中所有值的更简便的方法:Arrays.toString()方法

int[] a = {1,2,3,4,5};
System.out.print(Arrays.toString(a));//打印"[1,2,3,4,5]"

3.数组初始化及匿名数组
1)初始化方式:

可以通过循环,一个一个为数组中元素赋值
通过字面量的方式给数组赋值:int[] a = {1,2,3,4,5};

2)匿名数组:

new int[] {1,2,3,4,5}//创建一个匿名数组,返回数组的引用

在Java中数组的长度允许为0

4.数组拷贝
1)浅拷贝:
仅仅将一个数组变量拷贝给另一个数组变量,这时两个数组变量引用同一个数组

2)深拷贝:
采用Arrays.copyOf()方法。该方法有两个参数,第一个参数是被拷贝的数组,第二个参数是新数组的长度。

int[] copiedArray = Arrays.copyOf(preArray, preArral.length);

5.命令行参数
Java中main()方法接收一个String args[]参数,这个参数就是命令行参数。程序名并没有存储在args字符串数组中

6.数组排序
采用Array.sort()方法对一个数组排序。该方法使用了优化的快速排序算法。

7.多维数组
多维数组使用多个下标访问数组元素,它适用于表示表格或更加复杂的排列形式。

int[][] a;

for each循环不能自动处理二维数组的每一个元素,它是按照行,也就是一维数组处理的。可以采用两个嵌套的循环进行遍历:

for(int[] row : a){
    for(int x : row){
        ...
    }
}

8.不规则数组
Java实际没有多维数组,只有一维数组。多维数组被解释为"数组的数组"。
所以,可以单独地存取数组的某一行。也可以构造一个"不规则"数组,即数组的每一行有不同的长度。

//首先需要分配一个具有所含行数的数组
int[][] odd = new int[max][];
//接下来分配这些行
for(int n = 0; n < max; n++){
    odd[n] = new int[n];
}
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注