Java基础语法及其特性
发展
Java是一种面向对象的编程语言,现归属于ORACLE公司
- JVM[Java virtual machine]:Java虚拟机,Java技术的核心,实现Java的跨平台,包含Java运行环境JRE,Java工具和Java基础类库.
- JDK[Java Development Kit]:Java的软件开发工具包,在JDK的安装目录下有一个jre目录,里面有两个文件夹bin和lib,可以理解为bin里的就是jvm,lib里的就是jvm工作所需的类库,而jvm和lib结合起来称为jre.
- JRE[Java Runtime Environment]:Java运行环境,包含JVM标准实现及Java核心类库(不是开发环境,不包含开发工具,例如编译器,调试器).
Java 编译:Java语言编写的源程序,先通过Java编译器,编译成与平台无关的’字节码程序’(.class文件,二进制程序)然后通过Java解释器 解释执行.
1 | javac hello.java #编译成字节码文件. |
运算符
算术运算符、
位运算符、
逻辑运算符、
关系运算符
位运算符 | 名称 | 描述 | 举例 |
---|---|---|---|
& | 按位与 | 如果相对应位都是 1,则结果为 1,否则为 0 | (a&b),得到 12,即 0000 1100 |
丨 | 按位或 | 如果相对应位都是 0,则结果为 0,否则为 1 | ( a 丨 b )得到 61,即 0011 1101 |
^ | 按位异或 | 如果相对应位值相同,则结果为 0,否则为 1 | (a^b)得到 49,即 0011 0001 |
~ | 按位补 | 翻转操作数的每一位,即 0 变成 1,1 变成 0 | (~a)得到 -61,即 1100 0011 |
<< | 按位左移 | 左操作数按位左移右操作数指定的位数 | a<<2 得到 240,即 1111 0000 |
>> | 按位右移 | 左操作数按位右移右操作数指定的位数 | a>>2 得到 15 即 1111 |
>>> | 按位右移补零 | 左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充 | a>>>2 得到 15 即 0000 1111 |
逻辑运算符 | 名称 | 描述 | 类型 | 举例 |
---|---|---|---|---|
&& 或 & | 与 | 当且仅当两个操作数都为真,条件才为真 | 双目运算符 | (a && b) 或 (a & b) 为假 |
|| 或 | | 或 | 两个操作数任何一个为真,条件为真 | 双目运算符 | (a || b) 或 (a | b) 为真 |
! | 非 | 用来反转操作数的逻辑状态。如果条件为真,则逻辑非运算符将得到假 | 单目运算符 | (!a)为假 |
^ | 异或 | 如果两个操作数逻辑相同,则结果为假,否则为真 | 双目运算符 | (a ^ b) 为真 |
运算符优先级: |
基本数据类型
基本数据类型是CPU可以直接进行运算的类型。Java定义了以下几种基本数据类型:
整数类型:byte,short,int,long
浮点数类型:float,double
字符类型:char
布尔类型:boolean
1 | 计算机内存的最小存储单元是字节(byte), |
1 | 内存单元从0开始编号,称为内存地址。 |
1 | 一个字节是1byte,1024字节是1K, |
不同的数据类型占用的字节数不一样。我们看一下Java基本数据类型占用的字节数:
1 | ┌───┐ |
对于整型类型,Java只定义了带符号的整型,因此,最高位的bit表示符号位(0表示正数,1表示负数)。各种整型能表示的最大范围如下:
- byte:-128 ~ 127
- short: -32768 ~ 32767
- int: -2147483648 ~ 2147483647
- long: -9223372036854775808 ~ 9223372036854775807
浮点型
浮点类型的数就是小数,因为小数用科学计数法表示的时候,小数点是可以“浮动”的,如1234.5可以表示成12.345x102,也可以表示成1.2345x103,所以称为浮点数。
下面是定义浮点数的例子:
1 | float f1 = 3.14f; |
对于float类型,需要加上f后缀。
浮点数可表示的范围非常大,float类型可最大表示3.4x1038,而double类型可最大表示1.79x10308。
布尔类型
布尔类型boolean只有true和false两个值,布尔类型总是关系运算的计算结果:
1 | boolean b1 = true; |
Java语言对布尔类型的存储并没有做规定,因为理论上存储布尔类型只需要1 bit,但是通常JVM内部会把boolean表示为4字节整数。
字符类型
字符类型char表示一个字符。Java的char类型除了可表示标准的ASCII外,还可以表示一个Unicode字符:
注意char类型使用单引号’,且仅有一个字符,要和双引号”的字符串类型区分开。
引用类型
除了上述基本类型的变量,剩下的都是引用类型。例如,引用类型最常用的就是String字符串:
String s = “hello”;
引用类型的变量类似于C语言的指针,它内部存储一个“地址”,指向某个对象在内存的位置,后续我们介绍类的概念时会详细讨论。
常量
定义变量的时候,如果加上final修饰符,这个变量就变成了常量:
1 | final double PI = 3.14; // PI是一个常量 |
常量在定义时进行初始化后就不可再次赋值,再次赋值会导致编译错误。
常量的作用是用有意义的变量名来避免魔术数字(Magic number),例如,不要在代码中到处写3.14,而是定义一个常量。如果将来需要提高计算精度,我们只需要在常量的定义处修改,例如,改成3.1416,而不必在所有地方替换3.14。
根据习惯,常量名通常全部大写。
var关键字
有些时候,类型的名字太长,写起来比较麻烦。例如:
StringBuilder sb = new StringBuilder();
这个时候,如果想省略变量类型,可以使用var关键字:
var sb = new StringBuilder();
编译器会根据赋值语句自动推断出变量sb的类型是StringBuilder。对编译器来说,语句:
var sb = new StringBuilder();
实际上会自动变成:
StringBuilder sb = new StringBuilder();
因此,使用var定义变量,仅仅是少写了变量类型而已。
命名规范
#####规范是为了可读性,不是强制措施。
1,项目名全部小写
2,包名全部小写,点分隔符之间有且仅有一个自然语义的英语单词,包名统一单数形式,但类名如果有复数含义,类名可以用复数形式
3,类名首字母大写,其余组成词首字母依次大写
4,变量名,参数名,方法名首字母小写,如果名称由多个单词组成,除首字母外的每个单词的首字母都要大写
5.常量名全部大写,单词间下划线隔开。
6,命名规范遵从以下原则:
- 名称只能由字母、下划线、数字、$符号组成。
- 不能以数字开头
- 名称不能使用Java中的关键字
- 不允许出现中文及拼音命名
7.抽象类名使用Abstract或Base开头,异常类命名使用Exception结尾;测试类名要以测试的类的名称开始,以Test结尾。例:AbstractClass、CommonException、DemoTest.
8.枚举类名带上Enum后缀,枚举成员名称需要全大写,单词间用下划线隔开。
例:枚举名字为ProcessStatusEnum的成员名称:SUCCESS 、 UNKNOWN_REASON
上转型
在继承关系中,会存在对象的上转型
关系,例如 父类People,子类Asian,
1 | People zhang= new People(); |
- 上转型对象不能操纵子类的新增成员,不能调用子类的新增方法
- 上转型对象可以访问子类继承或隐藏的成员变量,可以调用子类继承或重写的实例方法,
- 子类如果重写了父类的静态方法,那么子类对象的上转型对象不能调用子类重写的静态方法
,只能调用父类的静态方法 - 上转型对象可以被强制转化为子类对象,
抽象类
使用abstract修饰的类称为abstract类,
- abstract类不能用new运算符创建该类对象
- 非抽象类中不能有abstract方法
- abstract 类的子类
- 其子类为非abstract类,则必须重写父类的abstract方法,给出方法体,
若为abstract类,可以继承,也可以重写
使用abstract修饰的方法称为abstract方法,
- 其子类为非abstract类,则必须重写父类的abstract方法,给出方法体,
- 不允许使用final与abstract同时修饰一个类和方法,
- 不允许使用static修饰abstract方法,
- abstract方法必须是实例方法
- 方法类型前有static的为类方法,反之则为实例方法
- 实例方法在对象被创建后,被加载,
- 类方法在类文件加载到内存时就已经创建
- abstract方法,只允许声明,不允许实现
蓝桥杯 B组,求黄金分割率(0.618)精确到100位小数.Java中,提供的最大整形范围是64位 long
型整数
java中能处理大数的类有两个,位于java.math包中,导入语句import java.math.*;
高精度大整数: BigInteger.
内部用一个int[] 数组来模拟一个非常大的整数.BigInteger.ONE… ZERO.. TEN分别代表1,0,10,
赋值示例
1
2
3
4
5BigInteger b=new BigInteger("1234567890");
BigInteger c=new BigInteger.ONE;
BigInteger d=new BigInteger.ZERO;
BigInteger e=BigInteger.valueOf(2);
sysout(b.pow(5)); //此处简打输出函数对BigInteger做运算的时候,只能使用实例方法add,multiply,divide,mod,subtract,abs,pow,gcd,compareTo.不能使用算术运算符(如+,-,*)
1
2BigInteger a=c.add(b); // a=c+b
BigInteger f=d.multiply(b.add(BigInteger.valueOf(8))) //f=d*(b+8)和
long
型整数运算比,BigInteger
不会有范围限制,但缺点是速度比较慢。也可以把
BigInteger
转换成long
型:1
2
3BigInteger i = new BigInteger("123456789000");
System.out.println(i.longValue()); // 123456789000
System.out.println(i.multiply(i).longValueExact()); // java.lang.ArithmeticException: BigInteger out of long range使用
longValueExact()
方法时,如果超出了long
型的范围,会抛出ArithmeticException
。BigInteger
和Integer
、Long
一样,也是不可变类,并且也继承自Number
类。因为Number
定义了转换为基本类型的几个方法:- 转换为
byte
:byteValue()
- 转换为
short
:shortValue()
- 转换为
int
:intValue()
- 转换为
long
:longValue()
- 转换为
float
:floatValue()
- 转换为
double
:doubleValue()
因此,通过上述方法,可以把
BigInteger
转换成基本类型。如果BigInteger
表示的范围超过了基本类型的范围,转换时将丢失高位信息,即结果不一定是准确的。如果需要准确地转换成基本类型,可以使用intValueExact()
、longValueExact()
等方法,在转换时如果超出范围,将直接抛出ArithmeticException
异常。- 转换为
高精度浮点数: BigDecimal
BigDecimal用scale()表示小数位数,eg:
1
2
3
4BigDecimal d1=new BigDecimal("12345.67890")
BigDecimal d2=new BigDecimal("1234.5")
sysout(d1.scale())// 输出5
sysout(d2.scale())//输出1stripTrailingZeros()方法可以将一个BigDecimal格式化为一个相等的,但去掉了末尾0的BigDecimal;
1
2
3
4
5
6
7
8
9BigDecimal d1 = new BigDecimal("123.4500");
BigDecimal d2 = d1.stripTrailingZeros();
System.out.println(d1.scale()); // 4
System.out.println(d2.scale()); // 2,因为去掉了00
BigDecimal d3 = new BigDecimal("1234500");
BigDecimal d4 = d3.stripTrailingZeros();
System.out.println(d3.scale()); // 0
System.out.println(d4.scale()); // -2 例子转自廖雪峰如果一个BigDecimal的scale()返回负数,例如,-2,表示这个数是个整数,并且末尾有2个0
BigDecimal 设置小数位长度
BigDecimal.setScale()方法用于格式化小数点
setScale(1)表示保留一位小数,默认用四舍五入方式
setScale(1,BigDecimal.ROUND_DOWN) //直接删除多余的小数位,如1.23->1.2
setScale(1,BigDecimal.ROUND_UP) //进位处理,如1.23->1.2
setScale(1,BigDecimal.ROUND_HALF_UP) //四舍五入
setScale(1,BigDecimal.ROUND_HALF_DOWN) //四舍五入,小数位是5则是向下舍
Java 四舍五入:观察前一位奇偶性,奇数,5入;偶数,5舍
dividerAndRemainder()方法,返回数组包含两个BigDecimal,分别是商和余数
capareTo()比较两个BigDecimal的值是否相等,而不能使用equals();