Java SE 第二章
第二章 基本程序设计
2.1 关键字和标识符
※ 关键字
Java关键字是电脑语言里事先定义的,有特别意义的标识符,有时又叫保留字,还有特别意义的变量。Java的关键字对Java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名、方法名、类名、包名和参数。
※标识符
Java语言中,对于变量,常量,函数,语句块也有名字,我们统统称之为Java标识符.
标识符是用来给类、对象、方法、变量、接口和自定义数据类型命名的。
2.2 注释和常量
※注释
对于Java注释我们主要了解三种:
1, // 注释一行
2, /* … / 注释若干行
3, /**……/文档注释
※常量
“常量”的广义概念是:‘不变化的量’
※进制
十进制转二进制
方法为:十进制数除2取余法,即十进制数除2,余数为权位上的数,得到的商值继续除2,依此步骤继续向下运算直到商为0为止。
(具体用法如下图)
二进制转十进制
方法为:把二进制数按权展开、相加即得十进制数。
(具体用法如下图)
二进制转八进制
方法为:3位二进制数按权展开相加得到1位八进制数。(注意事项,3位二进制转成八进制是从右到左开始转换,不足时补0)。
(具体用法如下图)
八进制转成二进制
方法为:八进制数通过除2取余法,得到二进制数,对每个八进制为3个二进制,不足时在最左边补零。
(具体用法如下图)
二进制转十六进制
方法为:与二进制转八进制方法近似,八进制是取三合一,十六进制是取四合一。(注意事项,4位二进制转成十六进制是从右到左开始转换,不足时补0)。
(具体用法如下图)
十六进制转二进制
方法为:十六进制数通过除2取余法,得到二进制数,对每个十六进制为4个二进制,不足时在最左边补零。
(具体用法如下图)
2.3 变量和数据类型
※变量
变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念。变量可以通过变量名访问。
※数据类型
数据类型在数据结构中的定义是一个值的集合以及定义在这个值集上的一组操作。
2.4输入和输出
※输入
通过new Scanner(System.in)创建一个Scanner,控制台会一直等待输入,直到敲回车键结束,把所输入的内容传给Scanner,作为扫描对象。
※输出
System.out.println() 输出结果进行换行
System.out.print() 输出结果进行不换行
2.5 数据类型转换
※数据类型转化
从上表可以看出java中各种数据类型所占空间的大小. 在java中整数的默认数据类型是int, 例如数字4, 小数的默认数字类型是double, 例如3.12. 当float a = 3.12时会报错, 因为3.12的默认数据类型是double, 我们需要使用如下的赋值方法:
2.5.1 第一种方法在3.12后面加了一个F, 告诉编译器这是一个float的数. 第二种方法对3.12进行了强制的类型转换. 接下来我们仔细分析一下java中的类型转换问题.
***2.5.2***基本数据类型中,布尔类型boolean占有一个字节,由于其本身所代码的特殊含义,boolean类型与其他基本类型不能进行类型的转换(既不能进行自动类型的提升,也不能强制类型转换), 否则,将编译出错。
⚪赋值和方法调用 转换规则:从低位类型到高位类型自动转换;从高位类型到低位类型需要强制类型转换:
(1)布尔型和其它基本数据类型之间不能相互转换;
(2)byte型可以转换为short、int、、long、float和double;
(3)short可转换为int、long、float和double;
(4)char可转换为int、long、float和double;
(5)int可转换为long、float和double;
(6)long可转换为float和double;
(7)float可转换为double;
b、算术运算 中的类型转换:1 基本就是先转换为高位数据类型,再参加运算,结果也是最高位的数据类型;2 byte short char运算会转换为Int;
(1)如操作数之一为double,则另一个操作数先被转化为double,再参与算术运算。
(2)如两操作数均不为double,当操作数之一为float,则另一操作数先被转换为float,再参与运算。
(3)如两操作数均不为double或float,当操作数之一为long,、则另一操作数先被转换为long,再参与算术运算。
(4)如两操作数均不为double、float或long,则两操作数先被转换为int,再参与运算。
特殊:
(1)如采用+=、*=等缩略形式的运算符,系统会自动强制将运算结果转换为目标变量的类型。
(2) 当运算符为自动递增运算符(++)或自动递减运算符(–)时,如果操作数为byte,short或char类型不发生改变;
2.6算术运算符
※算数运算符
加 +
减 -
乘 *
除 /
取余 %
自加 ++
自减 –
练习题:
public class Text1 {
public static void main(String[] args){
System.out.println("totalMilliseconds is:"+System.currentTimeMillis());
System.out.println("totalseconds is:"+System.currentTimeMillis()/1000);
System.out.println("Nowseconds is:"+(System.currentTimeMillis()/1000)%6);
System.out.println("totalminutes is:"+System.currentTimeMillis()/1000/60);
System.out.println("Nowminutes is:"+(System.currentTimeMillis()/1000/60)%60);
System.out.println("totalhours is:"+System.currentTimeMillis()/1000/60/60);
System.out.println("Nowhours is:"+(System.currentTimeMillis()/1000/60/60)%24);
System.out.println("现在的时间是:"+(System.currentTimeMillis()/1000/60/60)%24+"时"+""+(System.currentTimeMillis()/1000/60)%60+"分"+""+(System.currentTimeMillis()/1000)%60+"秒");
}
}
运行结果:
2.7 赋值运算符
※ 加等 +=
例如n+=2,意思为n=n+2
※ 减等 -=
例如n-=2,意思为n=n-2
※ 乘等 =
例如n=2,意思为n=n*2
※ 除等 /=
例如n/=2,意思为n=n/2
※ 模等 %=
例如n%=2,意思为n=n%2
2.8 位运算符
※ 位与&
参加运算的两个数据,按二进制位进行“与”运算。
运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;
即:两位同时为“1”,结果才为“1”,否则为0
例如:3&5 即 0000 0011 & 0000 0101 = 0000 0001 因此,3&5的值得1。
※ 位与|
参加运算的两个对象,按二进制位进行“或”运算。
运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;
即 :参加运算的两个对象只要有一个为1,其值为1。
例如:3|5 即 0000 0011 | 0000 0101 = 0000 0111 因此,3|5的值得7。
※ 位异或^
参加运算的两个数据,按二进制位进行“异或”运算。
运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;
即:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。
※ 位左移<<
将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。
例:a = a << 2 将a的二进制位左移2位,右补0,
左移1位后a = a * 2;
若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。
※ 位右移>>
将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。
操作数每右移一位,相当于该数除以2。
例如:a = a >> 2 将a的二进制位右移2位,
左补0 or 补1 得看被移数是正还是负。
2.9 常见的错误和陷阱
※未声明、未初始化的变量和未使用的变量
※整数溢出
※取整错误
※超出预期的整数除法
※冗余的输入对象
本章小结:
1.标识符是程序中用于命名诸如变量 、 常量、 方法 、 类、 包之类元素的名称。
2.标识符是由字母、 数字、 下划线( _ )和美元符号( $ ) 构成的字符序列。 标识符必须以字母或下 划线( _ ) 开头, 不能以数字开头.标识符不能是保留字。 标识符可以为任意长度。
3.变量用于存储程序中的数据。 声明变量就是告诉编译器变量可以存储何种数据类型。
4.有两种类型的 import 语句: 明确导入和通配符导入。 明确导人是在 import 语句中指定导入单个 类;通配符导入将包中所有的类导入。
5.在 Java 中, 等号( = ) 被用作賦值操作符。
6.方法中声明的变量必须在使用前被賦值 。
7.命名常量(或简称为常量) 表示从不改变的永久数据。
8.用关键字 final 声明命名常量。
9.Java 提供四种整数类型( byte、 short、 int、 long) 表示四种不同长度范围的整数。
10.Java 提供两种浮点类哲(float、 double) 表示两种不同精度的浮点数。
11.Java 提供操作符完成数值运算: 加号(+)、 减号(- )、 乘号( * )、 除号(/) 和求余符号(%)。
12.整数运算(/) 得到的结果是一个整数。
13.Java 表达式中的数值操作符和算术表达式中的使用方法是完全一致的。
14.Java 提供扩展陚值操作符 :+= (加法陚值 )、 -=(减法陚值)、 *=(乘法陚值)、 /=(除法陚值) 以 及 %=(求余陚值)。
15.自增操作符( ++) 和自减操作符(–) 分别对变量加1或减1。
16.当计算的表达式中有不同类型的值, Java 会自动地将操作数转换为恰当的类型。
17.可以使用(type)value 这样的表示法显式地将数值从一个类型转换到另一个类型。
18.将一个较小范围类型的变量转換为较大范围类型的变量称为拓宽类型。
19.将一个较大范围类型的变貴转換为较小范围类型的变量称为缩窄类型。
20.拓宽类型不需要显式转换, 可以自动完成。 缩窄类型必须显式完成。
21.在计算机科学中1970年1月1日午夜零点称为 UNIX 时间戮。
编程练习题
import java.util.Scanner;
public class Demo2_1 {//IPO Input Process Output
public static void main(String[] args) {
//1.获取用户输入的摄氏温度
Scanner scanner=new Scanner(System.in);
//提示信息
System.out.print("Enter a degree in Celsius:");
double celsius=scanner.nextDouble();
//2.将摄氏温度转换为华氏温度
double fahrenheit=(9.0/5)*celsius+32;
//3.将华氏温度输出
System.out.println(celsius+" Celsius is "+fahrenheit+" Fahrenheit");
}
}
import java.util.Scanner;
public class Demo2_2 {
//全局常量
public static final double PI=3.1415926;
public static void main(String[] args) {
//1.获取用户输入的半径和高
Scanner scanner=new Scanner(System.in);
//提示
System.out.print("Enter the radius and length of a cylinder:");
double radius=scanner.nextDouble();
double length=scanner.nextDouble();
//2.先计算底面积 后计算体积
double area=radius*radius*PI;
double volume=area*length;
//3.将体积输出
System.out.println("The area is "+area);
System.out.println("The volume is "+volume);
}
}
import java.util.Scanner;
public class Demo2_3 {
public static void main(String[] args) {
//1.获取用户输入的数字
Scanner scanner=new Scanner(System.in);
System.out.print("Enter a number betweem 0 and 1000:");
int number=scanner.nextInt();
//2.将数字进行分解
/*
987%10=7->a
987/10=98
98%10=8->b
98/10=9
9%10=9->c
a+b+c
98%10=8->a
98/10=9
9%10=9->b
9/10=0
0%10=0->c
*/
int a=number%10;
number/=10;
int b=number%10;
number/=10;
int c=number%10;
//3.将三个数字相加并输出
System.out.println("The sum of the digit is "+(a+b+c));
}
}
import java.util.Scanner;
public class Demo2_4 {
public static void main(String[] args) {
//1.获取用户输入的分钟数
Scanner scanner=new Scanner(System.in);
System.out.print("Enter the number of minutes:");
int mintues=scanner.nextInt();
//2.将从分钟数中转化处天数->年数
int days=mintues/60/24;
int years=days/365;
days=days%365;
//3.输出
System.out.println(mintues+" mintues is approximately "+years+" years and "+days+" days");
}
}
import java.util.Scanner;
public class Demo2_5 {
public static void main(String[] args) {
//获取从1970 1-1 00:00:00 到至今的毫秒数
Scanner scanner=new Scanner(System.in);
//获取偏移量
System.out.print("Enter the time zone offset to GMT:");
int offset=scanner.nextInt();
long millis=System.currentTimeMillis();
long seconds=millis/1000;
long minutes=seconds/60;
long hours=minutes/60;
//如何从经过的毫秒值里获取当前小时 总小时%24
System.out.print(hours%24+offset+":");//东八区+8
//...当前分钟
System.out.print(minutes%60+":");
//...当前秒
System.out.println(seconds%60);
}
}
import java.util.Scanner;
public class Demo2_6 {
public static void main(String[] args) {
//1.输入水的重量 初始温度 最终温度
Scanner scanner=new Scanner(System.in);
System.out.print("Enter the amount of water in kilograms:");
double weight=scanner.nextDouble();
System.out.print("Enter the inital temperature:");
double initalTemp=scanner.nextDouble();
System.out.print("Enter the final temperature:");
double finalTemp=scanner.nextDouble();
//2.根据公式 计算能量
double energy=weight*(finalTemp-initalTemp)*4184;
//3.输出能量值
System.out.println("The energy needed is "+energy);
}
}
public class Demo2_7 {
public static void main(String[] args) {
double money=100;//本金
double rate=5.0/100/12;//月利率
//第一个月
money=money*(1+rate);
money=(money+100)*(1+rate);
money=(money+100)*(1+rate);
money=(money+100)*(1+rate);
money=(money+100)*(1+rate);
money=(money+100)*(1+rate);
System.out.println(money);
}
}
import java.util.Scanner;
public class Demo2_8 {
public static void main(String[] args) {
//1.输入两个坐标
Scanner scanner=new Scanner(System.in);
System.out.print("Enter x1 and y1:");
double x1=scanner.nextDouble();
double y1=scanner.nextDouble();
System.out.print("Enter x2 and y2:");
double x2=scanner.nextDouble();
double y2=scanner.nextDouble();
//2.计算两个坐标之间的距离
double deltX=x2-x1;
double deltY=y2-y1;
//Math.pow(2,3) 2^3
//Math.pow(4,0.5) Math.sqrt()
double distance=Math.sqrt(Math.pow(deltX, 2)+Math.pow(deltY, 2));
//3.输出距离
System.out.println(distance);
}
}
import java.util.Scanner;
public class Demo2_9 {
public static void main(String[] args) {
//1.输入边长
Scanner scanner=new Scanner(System.in);
System.out.print("Enter the side:");
double side=scanner.nextDouble();
//2.计算面积
double area=3*Math.sqrt(3)/2*Math.pow(side, 2);
//3.输出面积
System.out.println(area);
}
}
import java.util.Scanner;
public class Demo2_10 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
//1.输入华氏温度、风速
System.out.print("Enter the temperature in Fahrenheit between -58°F and 41°F:");
double fahrenheit=scanner.nextDouble();
System.out.print("Enter the wind speed(>=2) in miles per hour:");
double speed=scanner.nextDouble();
//2.根据公式计算室外风寒温度
double windChill=35.74+0.6217*fahrenheit-35.75*Math.pow(speed, 0.16)+0.4275*fahrenheit*Math.pow(speed, 0.16);
System.out.println(windChill);
}
}
import java.util.Scanner;
public class Demo2_11 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
//1.输入三个坐标
System.out.print("Enter three points for a triangle:");
double x1=scanner.nextDouble();
double y1=scanner.nextDouble();
double x2=scanner.nextDouble();
double y2=scanner.nextDouble();
double x3=scanner.nextDouble();
double y3=scanner.nextDouble();
//2.根据坐标求三边
double sideA=Math.sqrt(Math.pow(x1-x2, 2)+Math.pow(y1-y2, 2));
double sideB=Math.sqrt(Math.pow(x1-x3, 2)+Math.pow(y1-y3, 2));
double sideC=Math.sqrt(Math.pow(x2-x3, 2)+Math.pow(y2-y3, 2));
//3.根据三边求面积
double s=(sideA+sideB+sideC)/2;
double area=Math.sqrt(s*(s-sideA)*(s-sideB)*(s-sideC));
System.out.println(area);
}
}