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
2
javac hello.java  #编译成字节码文件.
java hello #解释字节码.

运算符

算术运算符、
位运算符、
逻辑运算符、
关系运算符
位运算符 名称 描述 举例
& 按位与 如果相对应位都是 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
2
3
4
5
计算机内存的最小存储单元是字节(byte),
一个字节就是一个8位二进制数,即8个bit。
它的二进制表示范围从00000000~11111111,
换算成十进制是0~255,
换算成十六进制是00~ff。
1
2
3
4
5
6
7
内存单元从0开始编号,称为内存地址。
每个内存单元可以看作一间房间,内存地址就是门牌号。

0 1 2 3 4 5 6 ...
┌───┬───┬───┬───┬───┬───┬───┐
│ │ │ │ │ │ │ │...
└───┴───┴───┴───┴───┴───┴───┘
1
2
3
4
5
6
7
8
9
一个字节是1byte,1024字节是1K,
1024K是1M,1024M是1G,1024G是1T。
一个拥有4T内存的计算机的字节数量就是:

4T = 4 x 1024G
= 4 x 1024 x 1024M
= 4 x 1024 x 1024 x 1024K
= 4 x 1024 x 1024 x 1024 x 1024
= 4398046511104
不同的数据类型占用的字节数不一样。我们看一下Java基本数据类型占用的字节数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
       ┌───┐
byte │ │
└───┘
┌───┬───┐
short │ │ │
└───┴───┘
┌───┬───┬───┬───┐
int │ │ │ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┬───┬───┬───┬───┐
long │ │ │ │ │ │ │ │ │
└───┴───┴───┴───┴───┴───┴───┴───┘
┌───┬───┬───┬───┐
float │ │ │ │ │
└───┴───┴───┴───┘
┌───┬───┬───┬───┬───┬───┬───┬───┐
double │ │ │ │ │ │ │ │ │
└───┴───┴───┴───┴───┴───┴───┴───┘
┌───┬───┐
char │ │ │
└───┴───┘

byte恰好就是一个字节,而long和double需要8个字节。

对于整型类型,Java只定义了带符号的整型,因此,最高位的bit表示符号位(0表示正数,1表示负数)。各种整型能表示的最大范围如下:

  • byte:-128 ~ 127
  • short: -32768 ~ 32767
  • int: -2147483648 ~ 2147483647
  • long: -9223372036854775808 ~ 9223372036854775807
浮点型

浮点类型的数就是小数,因为小数用科学计数法表示的时候,小数点是可以“浮动”的,如1234.5可以表示成12.345x102,也可以表示成1.2345x103,所以称为浮点数。

下面是定义浮点数的例子:

1
2
3
4
5
float f1 = 3.14f;
float f2 = 3.14e38f; // 科学计数法表示的3.14x10^38
double d = 1.79e308;
double d2 = -1.79e308;
double d3 = 4.9e-324; // 科学计数法表示的4.9x10^-324

对于float类型,需要加上f后缀。

浮点数可表示的范围非常大,float类型可最大表示3.4x1038,而double类型可最大表示1.79x10308。

布尔类型

布尔类型boolean只有true和false两个值,布尔类型总是关系运算的计算结果:

1
2
3
4
5
boolean b1 = true;
boolean b2 = false;
boolean isGreater = 5 > 3; // 计算结果为true
int age = 12;
boolean isAdult = age >= 18; // 计算结果为false

Java语言对布尔类型的存储并没有做规定,因为理论上存储布尔类型只需要1 bit,但是通常JVM内部会把boolean表示为4字节整数。

字符类型

字符类型char表示一个字符。Java的char类型除了可表示标准的ASCII外,还可以表示一个Unicode字符:
注意char类型使用单引号’,且仅有一个字符,要和双引号”的字符串类型区分开。

引用类型

除了上述基本类型的变量,剩下的都是引用类型。例如,引用类型最常用的就是String字符串:

String s = “hello”;
引用类型的变量类似于C语言的指针,它内部存储一个“地址”,指向某个对象在内存的位置,后续我们介绍类的概念时会详细讨论。

常量

定义变量的时候,如果加上final修饰符,这个变量就变成了常量:

1
2
3
4
final double PI = 3.14; // PI是一个常量
double r = 5.0;
double area = PI * r * r;
PI = 300; // compile error!

常量在定义时进行初始化后就不可再次赋值,再次赋值会导致编译错误。

常量的作用是用有意义的变量名来避免魔术数字(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
2
3
People zhang= new People();
Asian li =new Asian();
zhang=li; //称对象zhang是对象li的上转型对象
  • 上转型对象不能操纵子类的新增成员,不能调用子类的新增方法
  • 上转型对象可以访问子类继承或隐藏的成员变量,可以调用子类继承或重写的实例方法,
  • 子类如果重写了父类的静态方法,那么子类对象的上转型对象不能调用子类重写的静态方法
    ,只能调用父类的静态方法
  • 上转型对象可以被强制转化为子类对象,

抽象类

使用abstract修饰的类称为abstract类,

  • abstract类不能用new运算符创建该类对象
  • 非抽象类中不能有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
    5
    BigInteger 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
    2
    BigInteger 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
    3
    BigInteger 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

    BigIntegerIntegerLong一样,也是不可变类,并且也继承自Number类。因为Number定义了转换为基本类型的几个方法:

    • 转换为bytebyteValue()
    • 转换为shortshortValue()
    • 转换为intintValue()
    • 转换为longlongValue()
    • 转换为floatfloatValue()
    • 转换为doubledoubleValue()

    因此,通过上述方法,可以把BigInteger转换成基本类型。如果BigInteger表示的范围超过了基本类型的范围,转换时将丢失高位信息,即结果不一定是准确的。如果需要准确地转换成基本类型,可以使用intValueExact()longValueExact()等方法,在转换时如果超出范围,将直接抛出ArithmeticException异常。

高精度浮点数: BigDecimal
  • BigDecimal用scale()表示小数位数,eg:

    1
    2
    3
    4
    BigDecimal d1=new BigDecimal("12345.67890")
    BigDecimal d2=new BigDecimal("1234.5")
    sysout(d1.scale())// 输出5
    sysout(d2.scale())//输出1
  • stripTrailingZeros()方法可以将一个BigDecimal格式化为一个相等的,但去掉了末尾0的BigDecimal;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    BigDecimal 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();


:D 一言句子获取中...