Java - JavaSE - 语言基础

语言基础

基本概念

关键字:51 个,可以参考 https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html

Here is a list of keywords in the Java programming language. You cannot use any of the following as identifiers in your programs. The keywords const and goto are reserved, even though they are not currently used. true, false, and null might seem like keywords, but they are actually literals; you cannot use them as identifiers in your programs.

标识符:英文,数字,下划线,美元符号;不能以数字开头;见名知意;能自己定义的就是标识符。

字面值:不能改变的值,和常量 private static final int var = 0; 区分;字面值有

  1. 字符
  2. 字符串
  3. 小数
  4. 整数
  5. 布尔值
  6. null

变量:和常量区分开,是一个指引;目的是重复利用字面值,节省内存空间;变量在同一作用域(同一个括号对)不能重复定义。

//这两个循环隶属不同括号对
for (int i = 0; i < 10; i++) {
}
for (int i = 0; i < 10; i++) { 
}

Java 数据类型

不同的数据类型,使计算机更好的分配内存。

基本数据类型

内存空间 数值范围 符号位 备注
整数
byte 1 个字节,8 位 -27 ~ 27-1
short 2 个字节,16 位 -215 ~ 215-1
int 4 个字节,32 位 -231 ~ 231-1
long 8 个字节,64 位 -263 ~ 263-1 程序会默认将整型的字面值当做 int 类型,此时需要加“L”
浮点 BigDecimal:数字精度高可用
float 4 个字节 程序会默认将小数的字面值当做 double 类型,此时需要加“F”
double 8 个字节
字符 'A'=65 'a'=97 '0'=48;有且只有一个字符,不能为空,用单引号
char 2 个字节 0~216-1 汉字占两个字节,所以刚好可以存储一个汉字
布尔 true 和 false,在 JVM 中用 int 的 0 和 1 代表
boolean 没有明确说明 Boolean 类型占多少字节

转换规则

  • 8 种基本数据类型除 boolean 类型之外都可以相互转换
  • 小容量向大容量转换叫做自动类型转换:byte < short(char) < int < long < float < double
    • byte,short,char 做混合运算的时候,各自都先转换成 int 再做运算
    • 多种数据类型做混合运算,先转换成容量最大的那种再做运算
  • 强制类型转换:
    • 大容量向小容量转换是,需要加强制转换符。编译虽然通过,运行期可能损失精度。谨慎使用
    • 另一种如其名,就为了强制将类型转换为某种自己要的类型
  • 如果整数 int 没有超出 byte,short,char 的取值范围(这个不是自动类型转换),可以直接将这个整数赋值给 byte,short,char
long l = 888; //系统还是识别为整型 int,赋值时候做了转换;证据就是超过 int 范围会报错
long longl = 2147483647;
long long2 = 2147483648; //此处报错

long longl = 2147483647;
long long2 = 2147483648L; //此处不报错

浮点数除 0:

double d1 = 1.0;
double d2 = 0.00;
double d3 = d1 / d2;
System.out.println(d3); //output: Infinity
//System.out.println(d3 instanceof Double); //Error,instanceof 不能比较基本数据类型
System.out.println(d1 / d2); //output: Infinity

Double d1 = 1.0;
Double d2 = 0.00;
Double d3 = d1 / d2;
System.out.println(d3); //output: Infinity
System.out.println(d3 instanceof Double); //true
System.out.println(d1 / d2); //output: Infinity

进制

二进制:以 0b 或 0B 开头。

八进制:以数字 0 开头。

十六进制:以 0x 或 0X 开头。

原码、反码和补码:计算机的数值存储都是以补码的形式。正数的原码、反码和补码相同;负数的反码除最高位外按原码取反,补码在反码上 +1。设计补码可以使符号位参与运算,将减去一个正数变成加上一个负数,将计算机的计算简化为只有加法。

编码

ASCII:西方常用的符号总数为 128 个,是一个字节能表示的范围内,所以将最高位定为 0,所有编码存储在计算机用 0xxx xxxx 一个字节表示。

Unicode:用多个字节存储世界的所有符号,原有的 ASCII 编码只需要一个字节,现在却需要用多个,会造成存储空间和传输数据的浪费。

UTF-8:可变长度的编码集。单个字节有标识作用,即一个字节最高位为0 0xxx xxxx ;多字节将第一个字节用 1 来表示该多字节的长度,即可以推测其形式为 11xx xxxx ,若有多字节编码为 1111 0000 ,说明该字节长度为 4;其余字节形式为 10xx xxxx ,可看出该字节和单个字节、多字节的第一个字节都有区分的地方,因此能正确编码。

算术运算符

注意:算法(第四版)中指出

+、-、*、/ 都是被重载过的

Java 语言规范规定,在逻辑运算符中,! 拥有最高的优先级,之后是 &&,接下来是 ||

+,三种:加法;正号;字符串的连接符

/ ,除法,两个整数相除,只保留整数部分;两个整数相除时,除数不能为 0,否则报 Exception in thread "main" java.lang.ArithmeticException: / by zero 异常;两个浮点数相除时,除数为 0 的话,结果是 Infinity

System.out.println(-1 / 2);
System.out.println(1 / 2);

output:
0;
0;

%,结果的符号和被模数相同。

System.out.println(5 % -2); //1
System.out.println(-5 % 2); //-1
System.out.println(-5 % -2); //-1
System.out.println(5 % 2); //1

++,自增运算符,不会改变数据类型,++ 在前表示先自增变量再做运算,++ 在后表示先做运算再自增变量;-- 同理。

byte b1 = 127;
b1++;
System.out.println(b1); //-128

赋值运算符

扩展赋值运算符:+=,不会改变数据类型。不会出现 byte b = b1 + b2 的问题。其他同理:-=,*=,/=。

int i = 1;
i *= 0.1;
System.out.println(i); //0

比较运算符

又称关系运算符:

  • ==
  • !=
  • >=
  • >
  • <=
  • <

== 和 = 需要做区分:

int i = 10;
int j = 20;
System.out.println(i == j); //false
System.out.println(i = j); //20

String s = "chenbin113.top";
System.out.println(s == null); //false
System.out.println(s = null); //null

值得注意:i = j,是将 j 的值赋给 i,然后打印出 i 的值。因此,在后续的逻辑判断中,为了避免漏写一个 = 的问题,建议在判断 String 类型数据是否为 null 的语句写成:null == s ,因为 null = s 编译将报错。

逻辑运算符

又称布尔运算符。

名称 符号
逻辑与 &
逻辑或 |
逻辑异或 ^
逻辑非 !
短路与 &&
短路或 ||

&& 比 || 优先级高

System.out.println(false && true || true); //true
System.out.println(true || false && false); //true

位运算符

名称 符号
位与 &
位或 |
位异或 ^ 一个数据对另一个数据位异或 2 次,则这个数据本身不变:12 ^ 5 ^ 12 结果是 5
位非 ~
右移 >> 最高位是 0,左边补齐 0;最高为是 1,左边补齐 1
左移 << 左边最高位丢弃,右边补齐 0
无符号右移 >>> 无论最高位是 0 还是 1,左边补齐 0

注:位异或 ^

位运算符优先级和算术运算符优先级

//如果位运算符优先级比算术运算符优先级高,输出应该为 15
//如果位运算符优先级比算术运算符优先级低,输出应该为 8
int i = 1 << 4 - 1;
System.out.println(i);

output:8;
//结论:位运算符优先级比算术运算符优先级低

右移 >>:

/*
计算机中以补码存在
-1 原码是 1000 0001
   反码是 1111 1110
   补码是 1111 1111
右移 >> 2 应该先移动 1 再移动 1
最终结果仍然是 1111 1111
*/
System.out.println(-1 >> 2); //-1
System.out.println(1 >> 2); //0

位非:

System.out.println(~1); //-2

三目运算符

条件表达式(boolean) ? 表达式1 : 表达式2

程序流程控制

  • 顺序结构
  • 分支结构
  • 循环结构

分支结构

if - else

boolean male = true;
if (male) {
    System.out.println("是一个男人");
} else {
    System.out.println("是一个女人");
}

switch - case - default

  • 使用 break,防止 case 穿透
String s = scanner.next();
switch (s) {
    case "Spring":
        System.out.println("春天");
        break;
    case "Summer":
        System.out.println("夏天");
        break;
    case "Autumn":
        System.out.println("秋天");
        break;
    case "Winter":
        System.out.println("冬天");
        break;
    default:
        System.out.println("非四季");
}
  • 合理使用 case 穿透,打印季节
int month = scanner.nextInt();
switch (month) {
    case 3:
    case 4:
    case 5:
        System.out.println("春天");
        break;
    case 6:
    case 7:
    case 8:
        System.out.println("夏天");
        break;
    case 9:
    case 10:
    case 11:
        System.out.println("秋天");
        break;
    case 12:
    case 1:
    case 2:
        System.out.println("冬天");
        break;
    default:
        System.out.println("非四季");
}

循环结构

  • for

  • while

  • do ... while

  • JDK 1.5 新增 foreach 循环

while & for 循环:开发使用 for 循环比较多,变量可以从内存中较早的消失?

可以,这也是局部代码块的优点。

public class LoopTest01 {
    /*
    实验:for 和 while 循环
    验证:for 循环,变量可以从内存中较早的消失
    结果:循环结束时,i 变量仍存在,j 变量已消失,验证结论
    */
    public static void main(String[] args) {
        int i = 3;
        while (i > 0) {
            System.out.println(i--);
        }

        for (int j = 0; j < 3; j++) {
            System.out.println(j);
        }
    }
}

方法重载

Overload,三种因素:

  • 同一个类中;
  • 方法名相同;
  • 方法参数相同。

非影响因素:

  • 方法前修饰符;
  • 方法返回值。
posted @ 2019-11-10 23:35  学习趁早  阅读(200)  评论(0编辑  收藏  举报