一个叫James Gosling的大佬想要开发用于消费类电子产品的嵌入式芯片,但是发现C++不能胜任,于是基于c++和smalltalk设计出了java。
主要是两点:1.面向对象 2. 平台独立的
面向对象意味着所有代码都定义在类当中,而这些类的大多数可以实例化为对象。ok,怎样理解?
面向对象:类,是一种方法,是抽象的。实例,是具体的。类经过实例化后就成了对象。
平台独立:传统的编程中,在Windows编写和编译的代码只能在windows中运行,源代码直接编译成为可执行代码。而java是先把源代码编译为字节码,然后在java虚拟机上运行。
问题来了:怎么编译?用java编译器(一个叫javac的程序,在终端中使用javac命令可以检验环境变量是否配置成功)。
编译成字节码之后还需要java的运行环境(JRE)java runtime environment,哈哈,懂点英语很好记住缩写。
JRE是由JVM(java virtual machine)java虚拟机和java类库构成(JAVA API)。
还需要JDK(java development toolkit)java开发工具包用来编译和运行java程序。
public class Shangzhaoyun{
}
public static void main(String[]args){
}
public是访问修饰符,static说明是该方法的静态方法,void说明返回值是空。
System.out.println("1");
System.out.print("2");
System.out.print("3");
//输出为:
1
23
print()方法输出不换行。
210703_19901012_2415 // 表示一个身份证号
==注意:浮点数计算可能存在舍入误差,因此,浮点数不适合做财务计算,而财务计算中的舍入误差是不能接受的。==例如,下面语句的输出结果是0.8999999999999999,而不是所期望的0.9。
在Java中,基本数据类型的转换分为自动类型转换和强制类型转换两种。
自动类型转换也称加宽转换,它是指将具有较少位数的数据类型转换为具有较多位数的数据类型。例如:
byte b = 120;
int i = b; // 字节型数据b自动转换为整型
将位数较多的数据类型转换为位数较少的数据类型。
其语法是在圆括号中给出要转换的目标类型,随后是待转换的表达式。例如:
double d = 200.5;
byte b = (byte)d;
System.out.println(b); // 输出-56
表达式类型自动提升:
除了赋值可能发生类型转换外,在含有变量的表达式中也有类型转换的问题,如下所示:
byte a = 40;
byte b = 50;
byte c = a + b;
c = (byte)(a + b); // 正确
int i = a + b;
该案例通过使用类型转换实现四舍五入功能。比如,圆周率在Java中用Math.PI常量表示,默认情况下输出它的值是3.141592653589793。假设希望将该值四舍五入保留4位小数,可以通过下面程序实现。
CastDemo.java
package com.boda.xy;
public class CastDemo{
public static void main(String[] args){
System.out.println(Math.PI); // 输出PI
double pi = Math.PI;
pi = pi * 10000 + 0.5; // 保证四舍五入
pi = (int) pi; // 保留整数部分
pi = pi / 10000; // 得到结果
System.out.println(pi);
}
}
比较运算符(也称关系运算符)用来比较两个值的大小或是否相等。一般用来构成条件表达式,比较的结果返回true或false。假设定义了下面的变量。
int x = 99;
int y = 108;
下面的语句的输出是true。
System.out.println(x < y);
比较结果通常作为判断条件,如下所示。
if (n % 2 == 0)
System.out.println( n + “是偶数”);
赋值运算符用来为变量指定新值。
int x = 10;
int y = x + 20;
赋值运算必须是类型兼容的,即左边的变量必须能够接受右边的表达式的值,否则会产生编译错误。如下面的语句产生编译错误。
int pi = 3.14;
复合赋值运算符
用变量当前值与右侧表达式值进行运算,最后将运算结果赋给变量。例如,下面两行是等价的:
a += 3;
a = a + 3;
位运算有两类:位逻辑运算(bitwise)和移位运算(shift)。位逻辑运算符包括按位取反(~)、按位与(&)、按位或(|)和按位异或(^)4种。移位运算符包括左移(<<)、右移(>>)和无符号右移(>>>)3种。
课堂讲授 2.8.6 运算符的优先级
假设有下面一个表达式:
3 + 4 * 5 > (5 * (2 + 4) – 10)&& 8 – 4 > 5
首先计算括号中的表达式(如果有嵌套括号,先计算里层括号中的表达式)。当计算没有括号的表达式时,会按照运算符的优先级和结合性进行运算。
不必死记硬背运算符的优先级。必要时可以在表达式中使用圆括号,圆括号的优先级最高。圆括号还可以使表达式显得更加清晰。例如,考虑以下代码:
int x = 5;
int y = 5;
boolean z = x * 5 == y + 20;
因为“*”和“+”的优先级比“= =”高,比较运算之后,z的值是true。但是,这个表达式的可读性较差。使用圆括号把最后一行修改如下:
boolean z = (x * 5) == (y + 20);
案例学习:显示当前时间
CurrentTime.java
package com.boda.xy;
public class CurrentTime {
public static void main(String[] args) {
long t = System.currentTimeMillis();
long seconds = t / 1000; // 总秒数
long s = seconds % 60;
long minutes = seconds / 60; // 总分钟数
long m = minutes % 60;
long hours = minutes / 60; // 总小时数
long h = hours % 24;
System.out.println(“当前时间:”+h +":" + m + “:” + s);
}
}
if(a > b){
int t = b;
b = a;
a = t;
}
if(year % 400 = = 0||(year % 4 == 0 && year % 100 != 0)){
System.out.println(year + " 年是闰年。") ;
}else{
System.out.println(year + " 年不是闰年。") ;
}
if(bmi < 18.5){
System.out.println("你的体重偏瘦。");
}else if(bmi < 25.0) {
System.out.println("你的体重正常。");
}else if(bmi < 30.0) {
System.out.println("你的体重超重。");
}else {
System.out.println("你的体重过胖。");
}
条件运算符
条件运算符(conditional operator)的格式如下:
for (条件 ? 表达式1 : 表达式2)
switch语句
如果需要从多个选项选择其中一个,可以使用switch语句。switch语句主要实现多分支结构,一般格式如下:
switch (表达式){
case 值1 -> 语句(组)1;
case 值2 -> 语句(组)2;
…
case 值n -> 语句(组)n;
[default -> 语句(组)n+1;]
}
在程序设计中,有时需要反复执行一段相同的代码,这时就需要使用循环结构来实现。Java语言提供了4种循环结构:while循环、do-while循环、for循环和增强的for循环。
一般情况下,一个循环结构包含四部分内容:
(1)初始化部分:设置循环开始时变量初值。
(2)循环条件:一般是一个布尔表达式,当表达式值为true时执行循环体,为false时退出循环。
(3)迭代部分:改变变量的状态。
(4)循环体:需要重复执行的代码。
while循环是Java最基本的循环结构,这种循环是在某个条件为true时,重复执行一个语句或语句块。它的一般格式如下:
while(条件){
// 循环体
[迭代部分]
}
使用while循环计算1到100之和。
int n = 1;
int sum = 0;
while(n <= 100){
sum = sum + n;
n = n + 1;
}
System.out.println("sum = " + sum); // 输出sum = 5050
do-while循环
do-while循环的一般格式如下:
[初始化部分]
do{
// 循环体
[迭代部分]
}while(条件);
用do-while循环计算1到100之和。
int n = 1;
int sum = 0;
do{
sum = sum + n;
n = n + 1;
}while(n <= 100);
System.out.println("sum = " + sum); // 输出sum = 5050
int sum = 0;
for(int n = 1; n <= 100; n++){
sum = sum + n;
}
System.out.println("sum = " + sum); // 输出sum = 5050
// n记录行数
for (int n = 1; n <= 8; n++) {
// 打印每行的前导空格
for (int k = 1; k <= (8 - n); k++) {
System.out.print(" ");
}
// 每行打印2*n-1个星号
for (int j = 1; j <= (2*n – 1); j++) {
System.out.print("*");
}
System.out.println(); // 换行
}
算术运算符包括:加(+)、减(-)、乘(*)、除(/)、求余(%)、自增(++)、自减(–),关系运算符包括:大于(>)、小于(<)、大于或等于(>=)、小于或等于(<=)、等于(==)、不等于(!=),
位运算符包括:按位取反(~)、按位与(&)、按位或(|)、按位异或(^)、左移(<<)、右移(>>)、无符号右移(>>>),位运算符只能应用在整型数据上,逻辑运算符包括:逻辑非(!)、短路与(&&)、 短路或(||)、逻辑与(&)、逻辑或(|)、逻辑异或( ^ ),赋值运算符包括(=)和扩展的赋值运算符(如+=、<<=等)
循环语句有四种:while循环、do-while循环、for循环和增强的for循环。循环中包含重复执行语句的部分称为循环体。
while循环首先检查循环继续条件,如果条件为true,则执行循环体;如果条件为false,则循环结束。
do-while循环与while循环类似,只是do-while循环先执行循环体,然后再检查循环继续条件,以确定是继续循环还是终止循环。
for循环控制由三部分组成。第一部分是初始操作,通常用于初始化控制变量。第二部分是循环继续条件,决定是否执行循环体。第三部分是每次迭代后执行的操作,经常用于调整控制变量。for循环一般用在循环体执行次数固定的情况。
在循环体中可以使用break和continue这两个关键字。break立即终止包含break的最内层循环。continue只是终止当前迭代。