第一个Java程序(示例)
public class NewStudy {
public static void main(String[] args) {
System.out.println("First Java: Hello World");
}
}
注释
写注释的目的很明确 就是让人能看懂这么一大串代码是干啥的,最起码能让自己看懂,因为说不准不知道时隔多久你在看到这段代码,你能一下明白他的意思。
写注释不仅是对效率的提升更多的也是对代码的一种负责吧
数据类型
Java是一种强类型语言。所以也就意味着每个每个变量都需要声明类型,一共有8种基本类型
整型
int | 4字节 |
-2 147 483 648 - 2 147 483 647
|
short | 2字节 | -32768 - 32767 |
long | 8字节 |
-9 223 372 036 854 775 808 - 9 223 372 036 854 775 807
|
byte | 1字节 | -128 - 127 |
- 通常情况下 int最常用
- 长整型数值有后缀L或l (如4000000L) 十六进制数值有前缀0x或0X
- 从Java7开始 加上前缀0b或0B就可以写二进制数。如0b1001 就是9
浮点型
float | 4字节 |
大约 ± 3.402 823 47E+38F (有效位数为 6 ~ 7 位)
|
double | 8字节 |
大约 ± 1.797 693 134 862 315 70E+308 (有效位数为 15 位>
|
- double的数值精度是float的2倍。绝大部分程序都采用double类型
- float类型的数值有一个后缀F或f。没有后缀的默认为double类型,当然也可以在浮点数值后面添加后缀D或d
- 所有的浮点型计算都遵从IEEE 754规范
- 浮点数值不适用于无法接受舍入误差的金融计算中
char类型
建议在程序中不要使用char类型,最好将字符串作为抽象数据类型处理
boolean类型
boolean类型有两个值: false和true,用来判断逻辑条件。
整型和布尔型之间不能相互进行转换
变量
- 每个变量都有一个类型。在声明变量的时候,变量类型位于变量名之前
-
声明一个变量之后,必须用赋值语句对变量进行显式初始化,不要使用未初始化的变量。变量的声明尽可能的靠近变量第一次使用的地方
-
用关键字final指示常量。关键字final表示这个变量只能被赋值一次,一旦赋值就不能更改了。习惯上,常量名使用全大写。例如:
final double PI = 3.14;
运算符
在JAVA中+、-、*、/分别代表加减乘除的运算符。其中当参与/的两个数都是整型时,表示整数除法,否则,表示浮点除法。整数除余用运算符%来表示
例如: 15/2 = 7 15%2 = 1 15.0/2 = 7.5
整数除0会得到一个异常,而浮点数将会得到无穷大或NaN的结果
数学函数与常量
各种各样的数学函数 包含在了Math类中 例如
- 想计算一个数的平方根,就可以用sqrt()方法
- 想进行幂运算就用pow()方法 double y = Math.pow(x,a) 即y的值为x的a次幂
数值类型之间的转换
当2个数值进行运算时,需要将两个数转换为同一数据类型后再进行运算(例如: n+f n为整数,f为浮点数)
- 如果两个操作数中有一个是 double 类型, 另一个操作数就会转换为 double 类型。
- 如果其中一个操作数是 float 类型,另一个操作数将会转换为 float 类型。
- 如果其中一个操作数是 long 类型, 另一个操作数将会转换为 long 类型。
- 如果不是,则两个操作数都将被转换为int 类型。
强制类型转换
上一张图可以看到,在必要的时候,int型将自动转换成double型。但是在某些时候也同样需要将doube类型转换成int型。而在JAVA中是允许这些转换的(可能丢失一些信息)
强制类型转换的语法格式是在圆括号中给出想要转换的目标类型,后面紧跟待转换的变 量名。例如:
double x = 9.997;
int nx = (int)x;
double x = 9.997;
int nx = (int)Math.round(x);
上面的类型转换后的结果为9,强制类型转换会通过截断小数部分将浮点型转换成整型。
因此为了得到最接近的整数,就会使用round()方法,此方法会把数字转化为long类型,因此同样需要int的强制转换
如果使用强制类型转换数值,而数值又超过了目标类型的表示范围,结果就会不同。例如 :(byte)300 = 44
自增自减运算符
在表达式中,前缀自增自减会先完成+1 而后缀自增自减会使用变量之前的值
int m = 7;
int n = 7;
int a = 2 * ++m; // a = 16, m = 8
int b = 2 * n++; // b = 14, n = 8
枚举
有时,变量的取值只在一个有限的集合里面。针对这种情况,可以自定义枚举类型
enum Size { SMALL, MEDIUM, LARGE, EXTRA.LARCE };
字符串
从概念上讲,Java字符串就是Unicode字符序列。Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义类,很自然的叫做String
String类没有提供用于修改字符串的方法
子串
String类的substring()方法可以从一个大的字符串中提取出一个子串
String a = "Hello";
String b = a.substring(0,3); // "Hel"
字符串a.substring(a,b)的长度为b-a。
拼接
JAVA允许使用+号连接两个字符串(+号按照给定的次序将两个字符串拼接起来)
当一个字符串与一个非字符串的值进行拼接时,后者将会被转换为字符串
检测字符串是否相等
可以使用equals方法检测两个字符串是否相等。对于表达式s.equals(t) 如果字符串s与字符串t相等就返回true否则就返回false
不要使用"=="来检测两个字符串是否相等。这个只能确定两个字符串是否放置在同一个位置上
阅读API文档
标准库中有几千个类,方法更多,靠人脑根本记不住,所以需要学会使用API文档,从这里面可以找到标准类库中的方法和类,API文档是JDK的一部分;HTML格式。让浏览器指向安装 JDK 的 docs/api/index.html 子目录
StringBuilder
在JDK5.0中引入了StringBuilder类,这个类的前身是StringBuffer,它的效率稍有些低,但是允许采用多线程的方式执行插入或删除字符串的操作。如果所有字符串都在一个单线程中编辑,则应该用StringBuffer替代它。两个类的API是相同的
输入输出
import java.util.Scanner;
public class SystemIn {
public static void main(String[] args) {
/*
1.首先 需要构建一个Scanner对象,并与标准输入流关联
2.nextLine方法 输入一行内容。如果仅仅只是一个单词,那么也可以用next方法
3.获取整数用nextInt方法。同理,浮点数则是用nextDouble方法
*/
Scanner scanner = new Scanner(System.in);
System.out.println("what is your name");
String name = scanner.nextLine();
System.out.println("how old are you");
int age = scanner.nextInt();
System.out.println("hello my name is "+name+" and my age is "+age);
}
}
因为Scanner输入是可见的,因此在JAVA SE 6特别引入了Console类
采用 Console 对象处理输入不如采用 Scanner 方便。每次只能读取一行输入, 而没有能够读取一个单词或一个数值的方法
块作用域
块(复合语句)是指由一对大括号包含起来的若干简单JAVA语句。块确定了变量的作用域。一个块可以嵌套在一个块中。但是不能在嵌套的两个块中声明同名的变量
数组
数组是一种数据结构,用来储存同一类型值的集合。通过一个整型下标可以访问数组的每一个值
创建一个数字数组的时候,所有元素都初始化为0。Boolean数组的元素全初始化为false。对象数组的元素初始化为一个特殊值NULL,这表示这些元素还没有存放任何对象。
注意点:
- 如果创建了一个大小为100的数组,那么如果访问超过这个大小之外的下标数组,则会引发"array index out of bounds"的异常而终止执行
- 一旦创建了数组,就不能再改变它的大小了
数组拷贝
使用Arrays类中的copyOf方法。其中第一个参数是原数组名,第二个参数是新数组的长度。如果数组元素是数值型,那么多余的元素将被赋值为0;如果数值是布尔型,将赋值为false。相反,如果长度小于原始数组的大小,则只拷贝最前面的数据元素。
int[] arrayOne = {1,2,3,4,5};
int[] arrayTwo = Arrays.copyOf(arrayOne,arrayOne.length);
数组排序
使用Arrays类中的sort方法就可以对数值型数组进行排序
//从n位观众中抽取m名幸运观众赠予奖品
import java.util.Arrays;
import java.util.Scanner;
/**
1.创建2个数组分别用于储存总观众的下标及幸运观众的下标
2.从n个观众中随机m名观众
3.必须确保不会重复抽到
4.将抽出的序号进行排序
* @author wangzhixiang
*/
public class LuckyGame {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("How many people your want?");
int n = scanner.nextInt();
System.out.println("How many people will be lucky?");
int m = scanner.nextInt();
int[] people = new int[n];
//将总人数一一赋值
for (int i = 0; i < people.length; i++) {
people[i] = i+1;
}
int[] lucky = new int[m];
for (int i = 0; i < lucky.length; i++) {
int r = (int) (Math.random()*n);
lucky[i] = people[r];
//确保不会再抽到那个值
people[r] = people[n-1];
n--;
}
Arrays.sort(lucky);
for(int r : lucky){
System.out.println(r);
}
}
}
参考文献 : 《JAVA核心技术 卷一》