java核心技术卷I

第三章:java的基本程序设计结构

文章目录

    • 第三章:java的基本程序设计结构
      • 3.2.注释
      • 3.3.数据类型
      • 3.4变量
        • 3.4.1初始化变量
        • 3.4.2常量
      • 3.5运算符
        • 3.5.1数学函数与常量
        • 3.5.2数值类型之间的转换
        • 3.5.3强制类型转换
        • 3.5.4结合赋值和运算符
        • 3.5.5自增与自减运算符
        • 3.5.6关系和boolean运算符
        • 3.5.7位运算符
        • 3.5.8括号与运算级别
        • 3.5.9枚举类型
      • 3.6字符串
        • 3.6.1子串
        • 3.6.2拼接
        • 3.6.3不可变字符串
        • 3.6.4检测字符串是否相等
        • 3.6.5空串与null串
        • 3.6.6码点与代码单元
        • 3.6.7String API
        • 3.9大数值
        • 3.10数组
          • 3.10.5数组排序
        • 4.2.3更改器方法和访问器方法
        • 4.3.6破坏封装性
        • 4.5方法参数
      • 5.7反射

3.2.注释

注释不会出现在可执行程序中

3.3.数据类型

  • 整形

    • int:四字节 -2147483648~2147483647
    • short:两字节 -32768~32767
    • long:八字节 -9223372036854775808~9223372036854775807
    • 在java中,整型的范围与运行java代码的机器无关。这就解决了软件从一个平台移植到另一个平台,或者在同一平台不同操作系统之间进行移植给程序员带来的诸多问题
    • long数值后有一个后缀L或l(建议L)。十六进制数值有一个前缀0x(如0xCAFE)。八进制前缀一个0,例如010对应八进制中的8。很显然,八进制表示法比较容易混淆,所以建议最好不要使用八进制常数
    • 从java7开始,加上前缀Ob就可以写二进制数,比如0b1001就是9。另外一种写法1_000_000(或者0b1111_0100_0010_0100_0000)标识100万这些下划线只是为了让人更容易读懂,java编译器会去除这些下划线
  • 浮点型

    • float:4字节
    • double:8字节
    • double比float精度的两倍。绝大部分应用程序都采用double,在很多情况下,float的精度很难满足要求。事实上很少有情况适合float,例如需要单精度数据的库,或者需要大量存储的数据。float后面加f。
  • char:表示unicode编码的字符单元的字符类型。部分字符需要两个char值。char类型的值可以表示十六进制,从\u0000到\Ufff。

  • \u005b+\u005D是[]

  • unicode和char类型:想要弄清楚char类型,就必须了解Unicode编码机制。unicode打破了传统的字符编码限制。在unicode之前,早已出现了许多不同的标准,美国的ascii,俄罗斯的KOI-8,西欧中的iso8859-8,中国的GB18030和BIG-5等。就产生了一下两个问题。一个任意给定的代码值,在两套标准中对应不同的字母。二是采用大字符集的语言其编码长度有可能不同。例如有些常见字符采用单字节编码,另外的采用两个或多个字节

  • 码点是指一个编码表中某个字符对应的代码值。在unicode标准中,码点采用16进制书写,并加上前缀U+。例如U+0041就是字母A的码点。unicode的码点可以分成17个代码级别。第一个代码级别称为基本的多语言级别,码点从u+0000~u+ffff;其余的16个级别的码点从u+10000到u+10ffff包括一些辅助字符。

  • UTF-16编码采用不同长度的编码表示所有的unicode码点。在基本的多语言级别中,每个字符用16位表示通常被称为代码单元。

  • 在java中char描述了一个UTF-16编码中的一个代码单元

  • 我们强烈建议不要在程序中使用char类型,除非的确需要处理UTF-16代码单元。最好将字符串作为抽象数据类型处理

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XrlhVcwU-1669378539987)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1635912665462.png)]

  • boolean:标识真假的布尔值

3.4变量

可以使用character的isJavaIdentifierStart来判断

3.4.1初始化变量

3.4.2常量

3.5运算符

  • 当参与/运算的两个数都为整数时,为整数除法,否则为浮点数除法。
  • 整数的求余操作有时称为取模
  • 整数不能除以0,浮点数/0会得到无穷大或者NaN的结果

可移植性是java语言的设计目标之一。无论在哪个虚拟机上运行,同一运算应该得到同样的结果。对于浮点数的算术运算,实现这样的可移植性是相当困难的。Double类型使用64位存储该一个数值,而有些处理器使用80位浮点寄存器。这些寄存器增加了中间过程的精度

3.5.1数学函数与常量

  • Math类中,包含了各种各样的方法

3.5.2数值类型之间的转换

3.5.3强制类型转换

3.5.4结合赋值和运算符

3.5.5自增与自减运算符

3.5.6关系和boolean运算符

3.5.7位运算符

3.5.8括号与运算级别

3.5.9枚举类型

有时候,变量的取值只在一个有限的集合内。例如披萨只有小中大和超大四种尺寸,可以将这些尺寸编码为1,2,3,4.但这样存在一定的隐患,变量中很有可能保存一个错误的值,比如0。针对这种情况,可以自定义枚举类型。

枚举类型的作用就是限制变量的范围

3.6字符串

从概念上讲,java字符就是Unicode字符序列。例如“java\u2122”是由五个Unicode字符组成:j,a,v,a,TM。java没有内置的字符串类型,而是在标准java类库提供了一个预定义类,很自然的叫做String。

3.6.1子串

3.6.2拼接

3.6.3不可变字符串

java设计者认为共享带来的效率远远高过提取拼接字符串带来的低效率。

3.6.4检测字符串是否相等

3.6.5空串与null串

3.6.6码点与代码单元

3.6.7String API

  • char charAt(int index)//返回给定位置的代码单元。
  • int codePointAt(int index)返回从给定位置的码点
  • int offsetByCodePoints(int startIndex,int coCount)返回从startIndex代码开始,位移cpCount后的码点索引
  • int compareTo(String other)按照字典顺序,如果字符串位于Other之前,返回false;之后返回true;相等返回0
  • IntStream codePoints()将这个字符串的码点作为一个流返回。调用toArray将它们放到一个数组中
  • new String(int[] codePoints, int offset, int count) 用数组中从offset开始的count个码点构建一个字符串
  • boolean equals(Object other)如果字符串和other相同,返回true
  • boolean equalsIgnoreCase(other)忽略大小写
  • boolean startsWith(String prifx)
  • boolean endsWith(String suffix)
  • String replace()替换

3.9大数值

如果基本的整数和浮点数精度不能满足需求,可以使用java.math包中的BigInteger个BigDecimal

3.10数组

一旦创建了数组,就不能改变他的大小。数组长度可为0。

//当复制数组时,两个变量会引用一个数组
String[] aa = new String[]{"1","2","3"};
String[] bb = aa;
bb[1] = "9";
//将数组内的值复制到一个新数组中去
String[] aa = new String[]{"1","2","3"};
String[] bb = Arrays.copyOf(aa,aa.length*2);
3.10.5数组排序
//这个方法使用了优化的快速排序算法
Array.sort();
  • static String toString(type[]a)5.0
    返回包含a中数据元素的字符串,这些数据元素被放在括号内,并用逗号分隔。
    参数:a 类型为int、long、short、char、byte、boolean、float或double的数组。

  • static type copyOf(type[]a,int length)6

  • static type copyOfRange(type[]a,int start,int end)6
    返回与a类型相同的一个数组,其长度为length或者end-start,数组元素为a的值。
    参数:a 类型为int、long、short、char、byte、boolean、float或double的数组。
    start 起始下标(包含这个值)。
    end 终止下标(不包含这个值)。这个值可能大于a.length。在这种情况下,结果为0或false。

  • length 拷贝的数据元素长度。如果length值大于a.length,结果为0或false;否则,数组中只有前面length个数据元素的拷贝值。

  • static void sort(type[]a)
    采用优化的快速排序算法对数组进行排序。
    参数:a 类型为int、long、short、char、byte、boolean、float或double的数组。

  • static int binarySearch(type[]a,type v)

  • static int binarySearch(type[]a,int start,int end,type v)6
    采用二分搜索算法查找值v。如果查找成功,则返回相应的下标值;否则,返回一个负数值r。-r-1是为保持a有序v应插入的位置。
    参数:a 类型为int、long、short、char、byte、boolean、float或double的有序数组。
    start 起始下标(包含这个值)。
    end 终止下标(不包含这个值)。
    v 同a的数据元素类型相同的值。

  • static void fill(type[]a,type v)
    将数组的所有数据元素值设置为v。
    参数:a 类型为int、long、short、char、byte、boolean、float或double的数组。
    v 与a数据元素类型相同的一个值。

  • static boolean equals(type[]a,type[]b)
    如果两个数组大小相同,并且下标相同的元素都对应相等,返回true。
    参数:a、b 类型为int、long、short、char、byte、boolean、float或double的两个数组。

4.2.3更改器方法和访问器方法

更改器方法会修改对象,只访问对象不去修改被称为访问器方法

4.3.6破坏封装性

employee employee = new employee(new Date());
Date date = employee.getDate();
date.setTime(date.getTime()+(1000*60*60*24));
System.out.println(employee.getDate());

date和employee.getdate()引用同一个状态,对d更改器方法就可以自动修改这个对象的私有状态。如果需要返回一个可变对象的引用,应首先对它进行clone

public Date getDate() {
        return (Date) date.clone();
}

4.5方法参数

java总是采用按值调用。也就是说,方法得到的所有参数值的一个拷贝,特别的是,方法不能修改传递给他的任何参数变量内容

public  static void add(int num){
        num = num*6;
}
public static void main(String[] args) {
        int num = 10;
        Employee.add(10);
        System.out.println("num = " + num);
}

一个方法不能修改一个基本数据类型参数,而对象引用作为参数是可以修改的

public static void main(String[] args) {
    Employee harry = new Employee();
    add(harry);
}

public static void add(Employee harry){
    harry.add(200);
    System.out.println(harry.getSalary());
}

具体的执行过程为:

  1. x被初始化为harry的拷贝,这里是一个对象的引用
  2. 方法应用于这个harry的引用。x和harry同时引用于那个Employee对象的工资提高了200
  3. 方法结束后,参数变量x不再使用。harry继续引用那个工资提高200的Employee对象

5.7反射

反射库提供了一个非常丰富且精心设计的工具集,以便编写能够动态操纵java代码的程序。这项功能被大量的应用于javabean中,它是Java体系中的组件结构。

能够分析类能力的程序成为反射,反射机制的功能极其强大,他可以用来:

  • 在运行时分析类的能力
  • 在运行时查看对象,例如编写一个toString方法供所有类使用
  • 实现通用的数组代码操作

你可能感兴趣的:(java,开发语言,jvm)