1、Java程序执行过程
-
编写好的java源文件(也就是图中的.java文件)首先被javac.exe编译成为字节码文件(.class文件),再由java.exe对字节码文件进行运行。
-
编译型语言:Java、C、C++等
-
解释型语言:Python、JS等
-
java开发中常用的IDE(集成开发环境)有eclipse、IDEA等,其中eclipse本身也是由java写的。在开发的过程中,IDEA随时都在进行编译,不像CodeBlocks在编写C语言代码时,需要等整个编写过程结束之后进行统一集中编译。
2、Java的跨平台性
- 由于java是运行在JVM(Java Virtual Machine)虚拟机上的,只要在不同的操作系统上安装对应的JVM,我们的java程序便可以做到一次编写,多平台运行。JVM有效的帮我们屏蔽了不同操作系统之间的差异,因而JVM是java跨平台性的保障。
3、JDK、JRE
- JDK( Java Delelopment Kit)即java开发工具包,JRE( Java Runtime Environment )即java运行时环境,其中JDK中已经包含了JRE,如果只是想单纯的运行java程序,只需要下载JRE就可。两者的关系如图所示:
4、 标识符:(变量的命名)
- 类名使用 大驼峰(UpperCamelCase) 风格,必须遵从驼峰形式。方法名、参数名、成员变量、局部变量都统一使用 小驼峰(lowerCamelCase) 风格,必须遵从驼峰形式。
- 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束,也不能以数字开头。
- 常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。
- 抽象类命名使用 Abstract 或 Base 开头;异常类命名使用 Exception 结尾;测试类命名以它要测试的类的名称开始,以 Test 结尾。
- 为了达到代码自解释的目标,任何自定义编程元素在命名时,使用尽量完整的单词组合来表达其意。见名知意。
5、数据类型
- Java是强类型语言,对于每一种数据都定义了明确的具体数据类型,在内存中分配了不同大小的内存空间。
-
整数默认类型:int 小数默认类型:double
-
1个字节=8位
-
byte: 1个字节,不考虑负数能表示范围是:0255,考虑正负表示范围:-128127 (其中有0,所以为127)
-
short:2个字节,16位 65536 0~65535
-
int: 4个字节,考虑正负:-21亿~+21亿
-
long:8个字节
-
float: 4个字节
-
double:8个字节
-
char字符型:2个字节,采用的是Unicode编码每个字符在编码表里面都对应一个int整数
-
boolean: 只有true和false两种情况
6、数据类型转换
- 从小到大自动类型转换
- 从大到小需要强制类型转换,可能会丢失精度装水的杯子大小不一样
- 从小到大依次为:byte->short(char)->int->long->float->double
public void test01() {
char ch = 'a'; // 97
System.out.println(ch);
System.out.println(ch + 1); //一个char类型加上一个int类型,类型不一致不能进行相加,因此char类型会自动向上转型为int然后再相加
System.out.println((char) (ch + 2)); //(ch + 2)ch向上转型之后为整个结果为int型,此时向下转型需要强制转换
double a = 3.1415926;
int b = (int) a; // 向下转型会丢失精度
System.out.println(b);
}
7、运算符
1、+、-、*、/、%
- 其中%为求余操作符,经常用于判断一个数是否能被另一个数整除,如果余数为0则能整除
public void test0() {
System.out.println(8%2);
System.out.println(7%3);
int a = 16;
//判断16能否被2整除
if (a % 2 == 0) {
System.out.println(a + "能被2整除");
} else {
System.out.println(a + "不能被2整除");
}
}
2、 ++(自增1) --(自减1)
int i = 0;
i++; // i = i + 1;
i–; // i = i - 1;
++i; // i = i + 1
–i; // i = i - 1
-
单独使用的时候,++、–在前后是没有差别的
-
被使用的时候,在前后是有差别的
public void test03() {
int i = 4;
i++; // i = i + 1
System.out.println(i); // 5
System.out.println(i++); // 5
System.out.println(i); // 6
System.out.println(++i); // 7
}
3、 比较运算符:> < >= <= !=
- 比较之后的结果只有两种情况:true、false,所以比较运算的结果是boolean类型
4、 逻辑运算符:&& || ! 运算结果也是boolean类型
-
&&:两边的结果都是true,结果才是true
-
||:两边只要有一个是true,结果就是true
-
&&、||会存在短路状况
public void test04() {
int num1 = 3;
int num2 = 5;
// &&短路
System.out.println(num1 < 0 && num1++ < num2); //false, 左边的num1 < 0已经为假了,右边就没必要判断了(直接被短路屏蔽),所以num1++不会被执行
System.out.println(num1); // 3
System.out.println(num2); // 5
// ||短路
System.out.println(num1 > 0 || num1++ < num2); // true,左边num1 > 0已经为真,整个就为真,右边没必要在进行判断,所以num1++同样不会被执行
System.out.println(num1); // 3
System.out.println(num2); // 5
}
5、卫操作
public void test05() {
Scanner scanner = new Scanner(System.in);
int score = scanner.nextInt();
// 卫操作,将非法输入与合法输入区分开,非法输入直接在前面拦截
if (score < 0 || score > 100) {
System.out.println("输入成绩非法");
return;
}
// 合法输入
if (score >= 90 && score <= 100) {
System.out.println("优秀");
} else if (score >= 80 && score < 90) {
System.out.println("良好");
} else if (score >= 70 && score < 80) {
System.out.println("一般");
} else if (score >= 60 && score < 70) {
System.out.println("及格");
} else {
System.out.println("不及格");
}
}
6、三目运算
- 语法:boolean ? 数1 : 数2
- 执行过程:计算boolean的值 —>若为true:则整个结果为数1----> 若为false:则整个结果为数2
7、+号运算符
- 两边都是数字,则做的就是加法运算
- 若一边为字符串,则做的是字符串的拼接
8、练习:
- 1、计算某年是不是闰年
- 何为闰年? 能被4整除,但是不能被100整除 或者能被400整除
public void test06() {
int year = 0;
Scanner scanner = new Scanner(System.in);
while (true) {
year = scanner.nextInt();
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
System.out.println(year + "是闰年");
} else {
System.out.println(year + "不是闰年");
}
}
}
- 2、从控制台输入两个数,然后分别打印这两个数,然后交换这两个数的值
- 对于交换连个数的值,有两种常见的方案。一种是用一个额外变量做桥梁,如图所示的temp,另一种方式是采用异或运算的操作,相比较而言,位运算的表现更加优秀,因为其所花费的时间更短。
public void test07() {
//采用tmp作为桥梁
int num1 = 3;
int num2 = 5;
int tmp = 0;
tmp = num1;
num1 = num2;
num2 = tmp;
System.out.println("num1=" + num1);
System.out.println("num2=" + num2);
}
public void test07() {
//采用异或运算
int num1 = 3;
int num2 = 5;
num1 = num1 ^ num2;
num2 = num1 ^ num2; //此时num2 = num1
num1 = num1 ^ num2;
System.out.println("num1=" + num1);
System.out.println("num2=" + num2);
}
- 3、 (1) 编写一个收银台收款程序,if (2) 定义输入----单价、数量、用户输入金额 (3)定义输出----应收金额、找零 (4)使用double类型变量 scanner.nextDouble(); (5)当总价>=500时候打八折 (6)考虑程序出现异常的情况,如:收款金额小于应收金额 若收款金额大于等于应收金额,则计算找零后输出 若收款金额小于应收金额,输出错误信息。
public void test08() {
double price = 0.0;
double num = 0.0;
double inputPrice = 0.0;
double getPrice = 0.0;
double outputPrice = 0.0;
Scanner scanner = new Scanner(System.in);
for (int i = 0; ; i++){
price = scanner.nextDouble();
num = scanner.nextDouble();
inputPrice = scanner.nextDouble();
getPrice = price * num;
if (getPrice >= 500) {
getPrice *= 0.8;
}
// 卫操作,拦截非法输入
if (inputPrice < getPrice || inputPrice <= 0) {
System.out.println("输入金额非法!");
continue;
}
outputPrice = inputPrice - getPrice;
System.out.println("应收金额:" + getPrice);
System.out.println("找零:" + outputPrice);
}
}
8、whlie、for循环
-
任何复杂的程序逻辑都可以通过“顺序”、“分支”、“循环”这三种基本结构来实现。 -
-
循环的三要素: 1、循环条件的初始化 2、循环条件的控制 3、循环条件的改变
-
while、for循环主要是两类题目:
-
1、累加思想(1+2+3+… + 100)
public void test09() {
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}
System.out.println(sum);
}
- 2、 统计思想,数一下符合条件的有多少个(计算1-100以内7的倍数的个数)
public void test09() {
int sum = 0;
for (int i = 1; i <= 100; i++) {
if (i % 7 == 0) {
sum++;
System.out.print(i + " ");
}
}
System.out.println();
System.out.println(sum);
}
1、continue、break
- continue:跳出本次循环,继续下一次循环
public void test10() {
for (int i = 1; i <= 10; i++) {
if (i == 5) {
continue; //跳出i = 5 这次循环,集训从 i = 6开始
}
System.out.print(i + " ");
}
}
- break:跳出离他最近的整个那层循环
public void test11() {
for (int i = 1; i <= 10; i++) {
if (i == 5) {
break; // i=5的时候跳出整个循环,后面从i=6开始的循环不再执行
}
System.out.print(i + " ");
}
}
public void test12() {
for (int i = 1; i <= 10; i++) {
for (int j = 1; j <= 10; j++) {
if (j == 5) {
break; //跳出离它最近的那整层循环,也就是里面j的这一层循环
}
System.out.print(j + " ");
}
System.out.print(i + " ");
}
}
例题:
- 随机生成一个整数1-1000 , 用户输入一个整数,程序给出与存储的数字是“大”或者“小”,知道用户猜到这个数字位置。 如果中途用户希望程序退出,输入0可以退出。
public void test01() {
int random = (int) (1000 * Math.random() + 1);
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.print("请输入你猜的数:");
int num = scanner.nextInt();
if (num == 0) {
break;
}
if (random == num) {
System.out.println("恭喜你,猜对了");
} else if (random < num) {
System.out.println("太大了,继续猜吧");
} else {
System.out.println("太小了,继续猜吧");
}
}
}
9、 switch: 可以接受的值(int byte 整数类型,char,String)
switch(2) {
case 1:
…
break;
case 2:
…
break;
…
default:
… break;
}
- 输入月份、年份判断天数: 1、3、5、7、8、10、12 -------- 31天 4、6 、9、11--------------------30天 2----------------------------------28/29天
public void test02() {
int year = 0;
int month = 0;
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.print("请输入年份、月份:");
year = scanner.nextInt();
month = scanner.nextInt();
if (month < 1 || month > 12) {
System.out.println("输入不合法,请重新输入!");
}
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
System.out.println("31天");
break;
case 4:
case 6:
case 9:
case 11:
System.out.println("30天");
break;
case 2:
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
System.out.println("29天");
} else {
System.out.println("28天");
}
break;
default:
break;
}
}
}
public void test03() {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入成绩:");
while (true) {
int score = scanner.nextInt();
if (score < 0 || score > 100) {
System.out.println("输入成绩非法");
return;
}
switch (score / 10) {
case 9:
System.out.println("优秀");
break;
case 8:
System.out.println("良好");
break;
case 7:
System.out.println("一般");
break;
case 6:
System.out.println("及格");
break;
default:
System.out.println("不及格");
break;
}
}
}
public void test04() {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
System.out.print("*");
}
System.out.println();
}
}
-
public void test05() {
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}
}
public void test05() {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(j + "x" + i + "=" + (i * j));
System.out.print(" ");
}
System.out.println();
}
}
双重for循环:外层循环控制行数,数一下有几行就能确定外层循环
内层循环控制列数,这一行打印多少个,到底要打印多少个要找出和当前行之间的一个关系
- 1、输出以下结构:
public void test06() {
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(j);
}
System.out.println();
}
}
- 2、 打印正三角形和倒三角形 :
public void test07() {
int n = 6;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n - i; j++) {
System.out.print(" ");
}
for (int j = 1; j <= 2 * i - 1; j++) {
System.out.print("*");
}
System.out.println();
}
}
public void test08() {
int n = 6;
for (int i = n; i >= 0; i--)
{
for (int j = 0; j < n - i; j++)
{
System.out.print(" ");
}
for (int j = 2 * i - 1; j > 0; j--)
{
System.out.print("*");
}
System.out.println();
}
}
- 3、 计算1-100以内所有奇数的和以及所有偶数的和,分别打印出来。
public void test09() {
int sum1 = 0;
int sum2 = 0;
for (int i = 1; i <= 100; i++) {
if (i % 2 == 0) {
sum1 += i;
} else {
sum2 += i;
}
}
System.out.println("奇数和为:" + sum2);
System.out.println("偶数和为:" + sum1);
}
- 4、 用for循环输出1—1000之间能被5整除的数,且每行输出3个
public void test10() {
int sum = 0;
for (int i = 1; i <= 1000; i++) {
if (i % 5 ==0) {
System.out.print(i + " ");
sum++;
if (sum % 3 == 0) {
System.out.println();
}
}
}
}
- 5、 计算9的阶乘
public void test11() {
int sum = 1;
for (int i = 1; i <= 9; i++) {
sum *= i;
}
System.out.println("9的阶乘为:" + sum);
}
-
6、 使用循环打印100-200之间所有的素数(只能被1和自己整除的数叫素数)
- 方式一:
public void test12() { for (int i = 100; i <= 200; i++) { boolean flag = true; for (int j = 2; j <= i - 1; j++) { if (i % j == 0) { flag = false; break; } } if (flag) { System.out.print(i + " "); } } }
- 方式二:
public void test12() { for (int i = 100; i <= 200; i++) { boolean flag = true; for (int j = 2; j <= Math.sqrt(i); j++) { if (i % j == 0) { flag = false; break; } } if (flag) { System.out.print(i + " "); } } }