JavaSE回顾-基础语法

JavaSE 回顾-基础语法

1. Java语言的特性

1.1 简单性

  • java剔除了C++中许多很少使用、难以理解、易混淆的特性。尽可能的简单化。

1.2 面向对象

  • java是基于面向对象的程序设计技术设计的,将重点放在数据(即对象)和对象的接口上。

1.3 分布式

  • java有一个丰富的例程库,用于处理像HTTP和FTP之类的TCP/IP协议。
  • java 应用能通过URL打开和访问网络上的对象,其便捷程度就行访问本地文件一样。

1.4 健壮性

  • java程序具有多方面的可靠性,Java编译器能够检测许多在其他语言中仅在运行时才能够检测出来的问题。

1.5 安全性

  • Java适用于网络/分布式环境,为了达到这个目标,安全方面投入很大。使用java可以构建防病毒、防篡改的系统。
  • 不可信的代码在一个沙箱环境中执行,在这里不会影响主系统。Java代码不论来自哪里,都不会脱离沙箱。

1.6 体系结构中立

  • 编译器生成一个体系结构中立目标文件格式,这是一种编译过的代码,只要Java运行时系统,这些编译后的代码可以在许多处理器上运行。

  • Java编译器通过生成与特定的计算机体系结构无关字节码指令来实现这一特性。

  • 字节码文件可以容易的在任何机器上解释执行,而且还可以动态翻译成本地机器码

  • Java虚拟机可以将执行最频繁的字节码序列翻译成机器吗,该过程为即时编译

  • Java虚拟机可以检测指令序列,增强其安全性。

1.7 可移植性

  • 数据类型规定具有固定的大小。例如:Java中的int类型永远为32为的整数,不会随着操作系统或编译器不同而改变。
  • 二进制数据固定的格式进行存储和传输,消除了字节顺序的困扰。
  • 字符串是用标准的Unicode格式存储的。
  • 作为系统组成部分的类库,定义了可移植的接口。例如:有一个抽象的Window类,并给出了在UNIX、Windows和Macintosh环境下的不同实现。
  • 除了用户界面有关的部分外,所有其他Java库都能很好的支持平台独立性,不用操心底层的操作系统。
  • 不仅程序是可移植的,Java API 往往也比原生的API质量更高。

1.8 解释型

  • Java解释器可以在任何移植了解释器的机器上执行Java字节码

1.9 高性能

  • 字节码可以在运行时动态翻译对应运行这个应用的特定CPU机器码
  • 即时编译器可以监控经常执行哪些代码并优化这些代码以提高速度。

1.10 多线程

  • Java支持多线程和并发性,可以带来更好的交互响应和实时行为。

1.11 动态性

  • 适应不断发展的环境,在类库中可以自由的添加新方法和实例变量,而对客户端不产生任何影响

2. Java 基本语法注意点

2.1 类名

  • 关键字class 后面紧跟类名

  • 类名命名规则:

    • 必须以字母或下划线开头,后面可以跟字母和数字的任意组合
    • 注意:Java中的字母和数字的范围更大。字母包括'A'~'Z'、'a'~'z'、'_'、'$'或者在某种语言中表示字母的任何Unicode字符。
    • 长度基本上没限制。
    • 不能使用Java保留字作为类名。
    public class $Test1 {  //类名还可以是 _Test  以下划线开头
    public static void main(String[]  args) {
        int _a = 1;
        int $a = 1;
        System.err.println(_a);
        System.out.println($a);
    }
    }
  • 源代码的文件名必须与公共类名相同,并用.java作为拓展名。

  • 类名命名规范:

    • 类名以大写字母开头名词
    • 骆驼命名法。

2.2 main方法

  • Java语言规范,main 方法 必须声明为 public

  • Java SE 1.4及以后版本强制 main 方法一定是public修饰的。

  • main 方法 必须为 public static void main(String[] args) ,缺少publicstatic、以及String[] args 参数,都不能成为class 的入口,运行不了。

2.3 注释

  • Java一共3种注释方式:

    • // xxxxx 单行注释

    • 多行注释 ,形成一个注释块

    /*
      xxxx
      xxx
     */

    注意: /* xxx*/ 注释不能嵌套使用。

    • 文档注释 可以用来自动地生成文档。
    /**
     * @version
     * @author hxh
     */

2.4 数据类型

Java是强类型语言。每一个变量声明一种类型。一共有8种基本类型。

  • 4种整型 int short long byte
  • 2种浮点类型 float double
  • 1种用于表示Unicode编码的字符单元类型 char
  • 1种用于表示真值 类型 boolean

注意: Java 有一个能够表示任意精度的算术包,通常被称为“大数值” (big number)。它只是一个Java对象,不是一个数据类型。

2.4.1 整型

整型用于表示没有小数部分的数值,它可以是负数据。

类型 字节数
int 4
short 2
long 8
byte 1
  • 整型的范围与运行Java代码的机器无关。
  • 长整型数值有一个后缀L或l,如:1111L
  • 十六进制数值有一个前缀0x或0X,如 0xCAFE
  • 八进制有一个前缀0
  • Java7开始,加上前缀0b或0B就可以写二进制数。如:0b1001就是9。
  • Java7开始,还可以为数字字面量加下划线。如 1_000_00(0b1111_0100_0010_0100_0000)表示一百万。注意:这些下划线只是为了让人易读,Java编译器自动去除这些下划线。

2.4.2 浮点类型

浮点类型用于表示有小数部分的数值。

类型 字节数
float 4
double 8
  • double类型数值精度是float类型的两倍,称为双精度数值。

  • float类型数值有一个后缀F或f(3.14f),没有后缀F的浮点数值(3.14)默认为double类型

  • 所有浮点数值计算都遵循IEEE 754规范。用于表示溢出或出错情况的三个特殊浮点数值:

    • 正无穷大
    • 负无穷大
    • NaN(不是一个数字)

    例如:

    一个正整数除以0的结果为正无穷大。

    计算0/0或者负数的平方根结果为NaN。

  • 浮点数值不适用无法接受舍入误差的金融计算中。

    • 例如: System.out.println(2.0-1.1); 结果为 0.8999999999999999 而不是正确结果0.9
    • 这种舍入误差原因是 浮点数值采用二进制系统表示,二进制系统中无法精确地表示分数1/10。就像十进制无法精确表示分数1/3一样。
    • 如果数值计算中不允许出现这种舍入误差,就应该采用BigDecimal类。

2.4.3 char类型

  • char占2字节,16位。可在存放汉字,只能放单个字符。

    char a='h';  //任意单个字符,加单引号。
    
    char a='中'; //任意单个中文字
    
    char a = 111; //整数。0~65535。十进制、八进制、十六进制均可。输出字符编码表中对应的字符。
  • char 类型原本用于表示单个字符。但是现在有所改变,有些Unicode字符可以用一个char值描述,另一些Unicode字符则需要两个char值。

  • char类型字面量值要用单引号括起来。

    • 例如:’A’是编码值为65所对应的字符常量。它和 “A” 不同,”A” 是包含一个字符A的字符串。
  • 对char类型字符运行时,直接当做ASCII表对应的整数来对待。

    char m='a';  //a。
    
    char m='a'+'b';  // Ã。  //char类型相加,提升为int类型,输出对应的字符。
    
    int m='a'+'b';   //195没有超出int范围,直接输出195。
    
    char m='a'+b;  //报错。 因为b是一个赋值的变量。
    
    char m=197;  //输出字符编码表中对应的字符。  ——Ã。
    
    char m='197;  //因为有单引号,表示是字符,只允许放单个字符。 ——报错。
    
    char m='a'+1;  //提升为int,计算结果98对应的字符是b。——b。
    
    char m=''+'';  // 42282。
    
    char m=''+''+''+'';  // 报错。int转char有损失。因为结果已经超出char类型的范围。
    
    int m=''+''+''+'';  //86820
    
    char m=''+1;  //1是int,结果提升为int,输出对应的字符。 ——丮。
    
    char m=''+"国";  // 报错。String无法转换为char。
    
    System.out.println(''+"国");  //没有变量附值的过程。String与任何字符用“+”相连,转换为String。——中国。
  • char+charchar+int , 类型均提升为int,赋值给char变量后,输出字符编码表中对应的字符(char h = 97 a)。

  • char类型的值可以表示为十六进制值,范围从\u0000\uffff

  • 除了转义序列\u之外,还有其他用于表示特殊字符的转义序列。

  • 所有转义序列都可以出现加引号的字符字面量或字符串中。例如: '\u2122' "hello\n"

  • 转义序列\u还可以出现在加引号的字符常量或者字符串之外其他转义序列不可以

  • Unicode转义序列会在解析代码之前得到处理。

    • 例如: "\u0022+\u0022"并不是一个由引号包围加号构成的字符串。实际上,\u0022会在解析之前转换为",这样就会得到""+"",也就是一个空串
  • 当心注释中的\u

    • // Look inside C:\users 会产生一个语法错误,因为\u后面并未跟着4个十六进制数。
    public class Test1 {
        public static void main(String[]  args) {
            System.err.println("1");// Look inside C:\users
        }
    }
    
    

    语法出错: 编译都通不过:

    Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
        Invalid unicode
  • 在Java中,char类型描述了UTF-16编码中的一个代码单元。建议不要在程序中使用char类型,除非缺失需要处理UTF-16代码单元。最好将字符串作为抽象画数据类型处理。

2.4.4 boolean类型

  • 只有两个值: flasetrue
  • 用来判断逻辑条件
  • 整型值布尔值之间无法相互转换

2.5 变量

2.5.1 变量命名规定

  • 变量名必须是一个以字母、下划线、$符号开头并由字母或数字构成的序列。一般来说,在Java中,下划线和$均属于字母。π 、 其他国家的字母 也可以。
  • 不能出现 其他符号 例如 +@ 这样的符号 以及 空格 不能出现在变量名中。
  • 大小写敏感
  • 长度基本没有限制
  • 尽管$是一个合法的Java字符,但是最好不要出现在自己的代码中使用这个字符。它只用在Java编译器或者其他工具生成的名字中。
  • 不能使用Java保留字
int _a = 1;
int $a = 1;
System.err.println(_a);
System.out.println($a);

2.5.2 变量初始化

  • 声明后的一个变量,不能直接使用未初始化的变量必须使用赋值语句对变量进行显式初始化

2.6 常量

  • 利用关键字final 指示常量。
  • final修饰的变量只能被赋值一次,一旦赋值一次后,不能再更改。
  • 习惯上常量名使用全大写
  • 若某个常量经常被一个类中的多个方法中使用,通常称该常量为类常量。可以使用static final 设置一个类常量。定义在main方法的外部。

2.7 运算符

  • 当参与/运算的两个操作数都是整数时,表示整数除法;否则表示浮点除法
    • 例如 : 15.0/2 等于 7.515/2 等于 7
  • 整数被0除将会产生一个异常,而浮点数被0除将会得到一个无穷大或NaN结果

2.8 数值类型之间的转换

  • 小字节类型转换成大字节类型无信息丢失转换,相反,可能会有精度损失。

  • 下图中,6个实心箭头表示无信息丢失的转化,3个虚线箭头表示可能有精度损失。

    这里写图片描述

  • 二元运算时,注意:先将两个操作数转换为同一种类型,然后再进行计算。

    • 若 两个中有一个是double类型,另一个将会转换为double类型;
    • 否则,若 两个中有一个是float类型,另一个将会转换成float类型;
    • 否则,若 两个中有一个是long类型,另一个将会转换成long类型;
    • 否则,两个都将会转换成int类型

2.9 强制类型转换

  • 强制类型转换通过截断小数部分浮点值转换成整型

  • 如果想对浮点数进行舍入运算,就需要用Math.round()方法,该方法返回值为long类型,所以只有使用显式的强制转换才能将long类型转换成int类型

    double x = 9.999;
    System.err.println((int)x);//9
    
    Long hh = Math.round(x);
    System.err.println(hh);//10
    
    int h = (int) Math.round(x);
    System.err.println(h); //10
  • 需要注意目标类型的表示范围

    • 如果试图将一个数值从一种类型强制转换成为另一种类型,而又超出了目标类型的表示范围,结果就会截断成一个完全不同的值。例如:(byte)300 实际值 却只为 44。
    int a  = 300;
    System.out.println((byte)a); //44

2.10 空串与Null串

  • 空串是长度为0的字符串,是一个Java对象,有自己的串长度(0)和内容 (空)

  • String h = null; 表示一个Null串,目前没有任何对象与该变量关联,无引用

  • 检查一个字符串,要检查它既不是null也不为空串:if(str != null && str.length() != 0)

2.11 switch语句

  • switch语句将会从与选项值相匹配的case标签处开始执行直到遇到break语句,或者执行到switch语句的结束处为止。
  • 如果没有匹配case分支,而有default子句,就执行default子句
  • 很有可能触发多个分支:
    • 如果在case分支语句的末尾没有break语句,那么就会接着执行下一个case分支语句。
  • case标签可以是:
    • 类型为 char 、byte 、short 、 int 的常量表达式
    • 枚举常量
    • Java SE 7开始,case标签还可以是字符串字面量

2.12 大数值

如果基本的整数和浮点值精度不够,那么可以使用java.math包中的两个类:BigIntegerBigDecimal。这两个类可以处理包含任意长度数字序列的数值

  • BigInteger类实现了任意精度的整型运算
  • BigDecimal类实现了任意精度的浮点数运算
  • 使用静态的valueOf()方法可以将普通的数值转换成大数值。

2.12.1 BigDecimal

浮点数值不适用无法接受舍入误差的金融计算中。

  • 例如: System.out.println(2.0-1.1); 结果为 0.8999999999999999 而不是正确结果0.9

    System.out.println(1.01 + 2.02);//3.0300000000000002
    System.out.println(3.0 - 2.1);//0.8999999999999999
  • 这种舍入误差原因是 浮点数值采用二进制系统表示,二进制系统中无法精确地表示分数1/10。就像十进制无法精确表示分数1/3一样。

如果数值计算中不允许出现这种舍入误差,就应该采用BigDecimal类。用来对超过16位有效位的数进行精确的运算。

双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal

  • 创建BigDecimal对象主要有两种:

    BigDecimal b1= new BigDecimal("3.0");//new BigDecimal(Double.toString(3.0))
    BigDecimal b2 = BigDecimal.valueOf(2.1);
    • b1也可以写成new BigDecimal(Double.toString(3.0)),直接new BigDecimal(3.0),会出现精度问题。
    BigDecimal x1 = new BigDecimal(1.34);//1.3400000000000000799360577730112709105014801025390625
    BigDecimal x2 = new BigDecimal("1.34");//1.34
    • 除了这两种外,特殊的像0、1、10可以这样写
    BigDecimal zero = BigDecimal.ZERO;
    BigDecimal one = BigDecimal.ONE;
    BigDecimal ten = BigDecimal.TEN;
  • BigDecimal所创建的是对象,不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象

    public BigDecimal add(BigDecimal value);//加法
    public BigDecimal subtract(BigDecimal value);//减法 
    public BigDecimal multiply(BigDecimal value);//乘法
    public BigDecimal divide(BigDecimal value);//除法
  • BigDecimal的运算不对原值进行操作,而是返回一个新的BigDecimal对象

  • BigDecimal的比较用的是BigDecimal的compareTo方法,将此 BigDecimal 与指定的 BigDecimal 比较。

    • 注意:值相等但具有不同标度的两个BigDecimal对象(如,2.0 和 2.00)被认为是相等的。
    • BigDecimal 在数字上小于、等于或大于比较对象时,返回 -1、0 或 1
    BigDecimal a = BigDecimal.valueOf(1);
    BigDecimal b = BigDecimal.valueOf(20);
    BigDecimal c = a.add(b);
    int i1 = a.compareTo(b);//-1
    int i2 = b.compareTo(b);//0
    int i3 = c.compareTo(b);//1
    

猜你喜欢

转载自blog.csdn.net/hxhaaj/article/details/80929605