Java核心技术
Java术语
JDK:Java开发工具包,编写Java程序的程序员使用的软件,JDK包含了JRE,同时还包含了编译java源码的编译器javac。
JRE:Java运行时环境,包含了java虚拟机,java基础类库。是使用java语言编写的程序运行所需要的软件环境。
Server JRE:在服务器上运行的Java程序的软件。
Standard Edition(EE):用于桌面或简单服务器应用的Java平台
标准的命名规范:骆驼命名法,如果名字由多个单词组成,每个单词的第一个字母都应该大写(FirstSample),如果源代码没有任何问题,在编译这段源码之后会得到一个包含这个类字节码文件.class。
Java使用的通用语法:Object.method(parrameters)
Systein.out.println("We will not use 'Hello, World!'");
使用了 System.out 对象并调用了它的 println 方法。注意, 点号( • )用于调用方法。
Java数据类型
一共有8种基本类型(primitive type),其中4种整型、2种浮点类型、1种用于表示Unicode编码的字符单元的字符类型char,和boolean类型。
整型
类型 | 存储需要 | 取值范围 |
---|---|---|
int | 4字节 | |
short | 2字节 | |
long | 8字节 | |
byte | 1字节 | -128 ~ 127 |
注意:长整型数值有一个后缀 L 或 1 ( 如 4000000000L。) 十六进制数值有一个前缀 Ox 或 0X (如 OxCAFEL 八进制有一个前缀 0
浮点类型
类型 | 存储需求 | 取值范围 |
---|---|---|
float | 4字节 | |
double | 8字节 |
注意:char类型的字面值要用单引号括起来,例如’A’是编码值为65所对应的字符常量,它与 “A” 不同,“A” 是包含一个字符 A 的字符串, char 类型的值可以表示为十六进制值,其 范围从 \u0000 到 \Uffff。
Unicode和char类型
Unicode出现的目的为了解决多个编码方式引起的错误问题,如中国GN18030 美国ASCII解析问题。
char类型描述了UTF-16编码中的一共代码单元。
数组类型之间的转换
实心箭头表示无信息丢失的转换,三个虚箭头表示可能有精度损失的转换。
•如果两个操作数中有一个是 double 类型, 另一个操作数就会转换为 double 类型。
•否则,如果其中一个操作数是 float 类型,另一个操作数将会转换为 float 类型。
•否则, 如果其中一个操作数是 long 类型, 另一个操作数将会转换为 long 类型。
•否则, 两个操作数都将被转换为 int 类型。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gpH0umNE-1640585611146)(E:\Typroa笔记\Java核心技术.assets\image-20210920211901332.png)]
强制类型转换
强制类型转换的语法格式是在圆括号中给出想要转换的目标类型,后面紧跟待转换的变量名
int nx = (int) Math.round(x);
位运算符
& (“and”) | (“or”) A (“xor”) ~ (“not”)
int fourthBitFromRight = (n & 0bl000) / 0bl000;
注意:应用在布尔值上时, & 和丨运算符也会得到一个布尔值。这些运算符与 && 和丨丨运 算符很类似,不过 & 和丨运算符不采用“ 短路” 方式来求值, 也就是说,得到计算结果之前两个操作数都需要计算
枚举类型
枚举类的使用:类的对象只有有限个,确定的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-56JlHn5O-1640585611149)(E:\Typroa笔记\Java核心技术.assets\image-20210920214641873.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kAeKh8S8-1640585611151)(E:\Typroa笔记\Java核心技术.assets\image-20210920222108760.png)]
枚举的7种用法:
- 常量定义为枚举类
- 枚举可以用在switch种
- 枚举中增加方法,让枚举具备更多的特性
- 覆盖枚举方法
- 实现接口:枚举可以用来实现接口,但不能用于继承类
- 在接口中组织枚举类:可以很好的实现”多态“
- 使用枚举集合
字符串
从概念上讲,Java字符串就是Unicode字符序列。
String类的substring方法可以从一个较大的字符串提取出一个字串。
拼接:Java语言允许使用+号连接(拼接)两个字符串(字符串与非字符串拼接,后者会被转换为字符串)。
equals():检查字符串是否相等,不区分大小写可以使用equalsIgnoreCase()方法。
str1 == str2:判断的是两个字符串是否放在同一位置。
空串与null串
空串:是一个Java对象,有自己的串长度(0)和内容(空),
if(str.length()==0) || if(str.equals(" "))
Null串:检查字符串是否为null,使用: if(str==null)
判断字符串不空也不null: if(str != null || str.length()!=0)
码点与代码单元
Java字符串由char值序列组成,char类型是一个采用UTF-16编码表示Unicode码点的代码单元。大多数的常用Unicode字符串使用一个代码单元就可以表示,而辅助字符需要一对代码单元表示。
码点数量:int cpCount = str.codePointCount(0, str.length());
str.charAt( index): 返回index位置的代码单元 char helloStr=str.charAt(0) ; // 返回"h"
String API(部分)
char charAt (int index):返回给定位置的代码单元,,使用较少。
int codePointAt(int index):返回给定位置开始的码点
int offsetByCodePoints(int startIndex,int cpCount):返回从startIndex代码点开始,位移cpCount后的码点索引
int comparaTo( String other):按照字典顺序,如果字符串位于other之前,返回负数;字符串位于otehr之后,返回正数;如果两个字符串相等,返回0
IntStream codePoints():将这个字符串的码点作为一个流返回。调用toArray将他们放在一个数组中
new String(int[] codePoints,int offset,int count):用数组从offset开始的count个码点构造一个字符串。
boolean equals(Object otehr):如果字符串与otehr相等返回true
boolean eaualsIgnoreCase(String other):忽略大小写与other比较
boolean startsWith(String prefix):
boolean endsWith(String suffix):如果字符串以prefix或suffix结尾返回 true
int indexOf(String str);
int indexOf(String str,int fromIndex);
int indexOf(int cp);
int indexOf(int cp,int fromIndex);
返回与字符串str或代码点cp匹配的第一个子串的开始位置,这个位置从索引0或fromIndex开始计算,如果在原始串中不存在str,返回-1;
int lastIndexOf(String str);
int lastIndexOf(String str,int fromIndex);
int lastIndexOf(int cp);
int lastIndexOf(int cp,int fromIndex);
返回与字符串str或代码点cp匹配的最后一个子串的开始位置。这个位置从原始串尾端或fromIndex开始计算;
int length():返回字符串长度;
int codePointCount(int startIndex,int endIndex):返回 startlndex 和 endlndex-1之间的代码点数量。没有配成对的代用字符将计入代码点。
String replace(CharSequence oldString,CharSequence newString);返回一个新字符串,这个字符可以用newString替换所有oldString,CharSequence可以是String或StringBuilder对象;
String substring(int beginIdenx);
String substring(int beginIndex, int endIndex):
返回一个新字符串,这个字符串包含原始字符串中从beginIndex到串尾endIndex-1的所有代码单元;
String toLowerCase();
String toUpperCase();
返回一个新字符串,统一大写或小写;
String trim():返回一个新字符串,这个字符串将删除了原始字符串头部和尾部的空格;
String join(CharSequence delimiter, CharSequence … elements);用给定定界符连接所有的元素。
构建字符串
StrinfBuilder():构造一个空的字符串构造器
int length(); 返回构造器或缓冲器中的代码单元数量
StringBuilder append(String str):追加字符串并返回this
StringBuilder append(char c);追加一个代码单元并返回this
StringBuilder appendCodePoint(int cp);追加一个代码点,并将其转换为一个或者两个代码单元并返回this
void setCharAt(int i,int char);将第i个代码单元设置为c
StringBuilder insert(int offset,String str);在offset位置插入一个字符串并返回this
Stringbuilder isnert(int offset,Char c);在offset位置插入一个代码单元并返回this
StringBuilder delete(int startIndex,int endIndex);删除偏移量之内的代码单元并返回this
输入输出
标准输入流:System.in
Scanner (InputStream in);用给定的输入流创建一个Scanner对象
String nextLine();读取输入的下一行内容;
String next();读取输入的下一个单词(以空格作为分隔符)
int nextInt();
double nextDouble();
读取并转换下一个表示整数或浮点数的字符序列
boolean hasNext();检测输入中是否还有其他单词
boolean hasNextInt();
boolean hasNextDouble():
检测是否还有表示整数或浮点数的下一个字符序列
Scanner
Scanner(File file):构造一个从给定文件读取数据的Scanner
Scanner(String data):构造一个从给定字符串读取数据的Scanner
PrintWriter
PrintWriter(String fileName);构造一个将数据写入文件的PrintWriter,文件名由参数指定
static Path get(String pathname):根据指定的路径名构建一个Path
大数值
如果基本的整数和浮点数精度不能满足需求,可以使用java.math包下的两个类:BigInterger和BigDecimal,这两个类可以处理包含任意长度数字序列的数值。BigInterger类实现了任意精度的整数运算, BigDecimal 实现了任意精度的浮点数运算。
static BigInteger valueOf(long num);返回等于num的大整数
BigInteger
BigInteger add(BigInteger otehr):
BigInteger subtrace(BigInteger other);
BigInteger multiply(BigInteger other);
BigInteger divide(BigInteger otehr);
BigInteger mod(BigInteger other);
返回这个大整数和另一个大整数otehr的和、差、积、商、以及余数
int compareTo(BigInteger otehr):如果这个大整数与另一个大整数 other 相等, 返回 0; 如果这个大整数小于另一个大整数 other, 返回负数; 否则, 返回正数。
数组
数组是一种数据结构,用来存储同一类型值的集合。一旦创建了数组就不能改变他的大小。如果需要在运行的过程中扩展数组的大小就使用另一种数据结构–数组列表(array list)。
数组拷贝:在Java中,允许将一个数组变量拷贝给另一个数组变量,此时这两个变量将引用同一个数组
int[] luckyNumbers=smallPrimes;[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cw20NwIv-1640585611153)(E:\Typroa笔记\Java核心技术.assets\image-20210925170659329.png)]
如果希望将一个数组的所有值拷贝到一个新的数组中去,就要使用Arrays类的copyOf()方法;
数组排序Arryas
要想对数值型数组进行排序,可以使用Arrays类中的sort方法:这个方法 使用了优化的快速排序算法。
快速排序法:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JnBl6Sxb-1640585611154)(E:\Typroa笔记\Java核心技术.assets\image-20210925214624623.png)]
通过设置i为基准数,然后和j进行比较,比较规则,首先j左移和i进行比较相等不变,如果j小于i,i与j互换然后i向左移动一次与j比较,依次类推。
static String toString(type[] a):返回包含a中数据元素的字符串,这些数据元素被放在括号内,并用逗号隔开。
static type copyOf(type[] a, int length):
static type copyOfRange(type[] a, int start,int end):
返回与 a 类型相同的一个数组, 其长度为 length 或者 end-start, 数组元素为 a 的值。
参数:a 类型为 int、 long、 short、 char、 byte、boolean、 float 或 double 的数组。
start 起始下标(包含这个值)0 end 终止下标(不包含这个值)。这个值可能大于 a.length。 在这种情况 下,结果为 0 或 false。 length拷贝的数据元素长度,如果 length 值大于 a.length, 结果为 0 或 false ; 否则, 数组中只有前面 length 个数据元素的拷贝值。
static void sort(type[] a):采用优化的快速排序算法对数组进行排序;
staic int binarySearch(type[] a,type v):
staic int binarySearch(type[] a,int start,int endn,type v):采用二分法搜索算法查找值v,如果查找成功,则返回相应的下标值:否则返回一个负数r。-r-1是为保持a有序v应插入的位置。
v :同a的数据元素类型相同的值。
static void fill(type[] a,type v):将数组的所有元素值设置为v
static boolean equals(type[] a,type[] b):如果两个数组大小相同,并且下标相同的元素都对应相等,返回true
对象与类
对象和对象变量:要想使用对象,就必须首先构造对象,并指定器初始状态。一般使用构造器(constructor)构造新实例,构造是一种特殊的方法,用来构造并初始化对象。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OMqEGdDY-1640585611155)(E:\Typroa笔记\Java核心技术.assets\image-20210925221924709.png)]
注意:一个对象变量并没有实际包含一个对象,而仅仅引用一个对象。在Java中,任何对象变量的值都是对存储在另一个地方的一个对象的引用。new操作符的返回值也是一个引用。
LocalDate类(日历)
不要使用构造器来构造LocalDate类的对象,应该使用静态工厂的方法(factory method)代表你调用构造器。
LocalDate.now();会构造一个新对象,表示构造这个对象时的日期;
实例:LocalDate newYearsEve = Local Date.of(1999, 12, 31);存储到一个对象变量中
一旦有 了一个 LocalDate 对象, 可以用方法 getYear、 getMonthValue 和 getDayOfMonth 得到年、月和日:、
static LocalTime now();构造一个表示当前日期的对象
static LocalTime of(int year,int month,int day):构造一个表示给定日期的对象
int getYear()
int getMonthValue()
int getDayOfMonth();
得到当前日期的年、月、日
DayOfWeek getDayOfWeek :得到当前日期是星期几,作为DayOfWeek类的一个实例返回,调用getValue来得到1~7之间的一个数,表示这是星期几。
LocalDate plusDays(int n):
LocalDate minusDays(int n):
生成当前日期之后或之前n天的日期
构造器与其他的方法有一个重要的不同,构造器总是伴随着new操作符的执行被调用,而不能对一个已经存在的对象调用构造器来达到重新设置实例域的目的
构造器的特点:
构造器与类同名
每个类可以有一个以上的构造器
构造器可以有0个、1个或多个参数
构造器没有返回值
构造器总是伴随着new操作一起调用
final实例域
可以将实例域定义为 final。 构建对象时必须初始化这样的域。也就是说, 必须确保在每一个构造器执行之后,这个域的值被设置, 并且在后面的操作中, 不能够再对它进行修改。final关键字只是表示存储在这个变量中的对象可以进行修改。
静态域与静态方法
class Employee{
private static int nextId=1; //此处是静态,谁调用都会++
private int id
}
public void setId(){
this.id=nextId;
nextId++;
}
Java中方法参数的使用情况:
一个方法不能修改一个基本数据类型的参数(即数值型或布尔型)
一个方法可以改变一个对象参数的状态
一个方法不能让对象参数引用一个新的对象
对象的构造
重载:有些类有多个构造器,如果多个方法有相同的名字、不同的参数,便产生了重载。它通过用找各个方法给出的参数类型与特定方法调用所使用的值类型进行匹配来挑选出想对应的方法。如 果编译器找不到匹配的参数, 就会产生编译时错误,因为根本不存在匹配, 或者没有一个比 其他的更好。(这个过程被称为重载解析(overloading resolution)。)
如果在编写一个类时没有编写构造器,那么系统会提供一个无参构造器,这个构造器将所有的实例域设置为默认值。但是,如果类中提供了至少一个构造器,却没有提供无参数的构造器,则在构造对象时遇到无参数就会视为不合法。
类的导入(两种方式)
java.tiie.LocalDate today = java.tine.Local Date.now();
mport java.util .*
静态导入
例如,如果在源文件的顶部, 添加一条指令:
import static java.lang.System.*;就可以使用System类的静态方法和静态域,而不必加类名前缀
文档注释
类注释
类注释必须放在import语句之后,类定义之前
/** 对类的描述 */
方法注释
每一个方法注释必须放在所描述的方法之前。除了通用标记之外,还可以使用下面的标记:
@param 变量描述
@return 返回部分的描述
@throws 类描述:用于表述这个方法可能抛出的异常
@author 姓名
@version 文本,当前版本的描述
/** * 描述这个方法 * @param byPrecent 描述这个参数 * @return result 返回值是什么 */ public double raiseSaraly(double byPrecent){ }
域注释
只需要对公有域(通常指的是静态常量)建立文档
/** * The "Heart" card suit */ public static final int HEARTS = 1;
继承
利用继承,人们可以基于已存在的类构造一个新类。继承已存在的类就是复用(继承)这些类的域和方法,在此基础上,还可以添加一些新的方法和域。关键字extends表示继承
关键字 extends 表明正在构造的新类派生于一个已存在的类。 已存在的类称为超类 ( superclass)、 基类( base class) 或父类(parent class); 新类称为子类(subclass、) 派生类 ( derived class) 或孩子类(child class)。
调用父类Employee中的getSalary方法,使用特定的关键字super进行调用
super.getSalary();
注意:super与this引用不是类似的概念,这是因为super不是一个对象的引用,不能将super赋给另一个对象变量,它指示一个指示编译器调用超类方法的特殊关键字。
多态
“is-a”规则:可以用来判断是否应该设计为继承关系。雇员和经理(每个经理都是雇员,反之,并不是雇员都是经理)。
“is-a”规则的另一种表述法是置换法则。它表明重程序中出现超类对象的任何地方都可以用一个子类对象置换。
Employee e:
e = new Employee(); //Employee object expected 父类
e = new Manager(); //OK,Manager can be used as well 子类
在Java程序设计语言中,对象变量是多态的,一个Employee变量即可以引用一个Employee类对象,也可以引用一个Employee类的任何一个子类对象
组织继承:final类和方法
将方法或类声明为final主要目的是:确保它们不会再子类中改变语义。
强制类转换
将一个类型强制转换为另一个类型的过程被称为类型转换。有时候需要将某个类的对象引用转换为另一个类的对象引用 .
只能在基础层次内进行类型转换
在将超类转换为子类之前,应该使用instancof 进行检查
子类可以引用为超类变量,编译器是允许的,但将超类的引用赋值为子类变量,必须进行类型转换
//在运行之前检查一下能否类型转换,否则会报ClassCastException
if(staff[1] instanceof Manager){
Manager boss=(Manager) staff[0]
}
抽象类
抽象类不能被实例化,将一个类声明为abstract,就不能创建这个类的对象。但是可以创建一个具体子类的对象。
169
象,也可以引用一个Employee类的任何一个子类对象
组织继承:final类和方法
将方法或类声明为final主要目的是:确保它们不会再子类中改变语义。
强制类转换
将一个类型强制转换为另一个类型的过程被称为类型转换。有时候需要将某个类的对象引用转换为另一个类的对象引用 .
只能在基础层次内进行类型转换
在将超类转换为子类之前,应该使用instancof 进行检查
子类可以引用为超类变量,编译器是允许的,但将超类的引用赋值为子类变量,必须进行类型转换
//在运行之前检查一下能否类型转换,否则会报ClassCastException
if(staff[1] instanceof Manager){
Manager boss=(Manager) staff[0]
}
抽象类
抽象类不能被实例化,将一个类声明为abstract,就不能创建这个类的对象。但是可以创建一个具体子类的对象。
169