本文是学习JavaEE开发的记录笔记
大纲
Java基础语法
1 | public class HelloWorld { |
通过上述程序,可以观察到JAVA的基础语法:
- 主方法入口:所有Java程序都是由public static void main(String[] args)开始执行
- 主类名:.java文件需要有一个且仅有一个与文件名相同的public类
Java类
类的变量类型:
- 局部变量:在类的方法中声明和初始化的变量,在方法结束后变量会自动销毁
- 成员变量:在类中但在类的方法外声明和初始化的变量,这种变量在类创建对象的时候实例化,成员变量可以被类的方法访问
- 类变量:在类中但在类的方法外被static修饰的变量,这种变量是所有类的实例化对象所共享的一个变量
类的构造方法:类的构造方法与类同名,一个类可以有多个构造方法(参数不同)
类的实例化和访问:通过声明+实例化(type name=new type())实例化对象,通过对象名+点运算符(name.var/name.method())访问对象变量或者方法
源文件声明规则:
- 源文件只能有一个和文件名相同的public主类
- 若类定义在某个包中,package语句放在源文件首行
- 导入类文件,import语句放在package和类定义之间
Java数据类型(内置+引用+常量)
内置数据类型:八种,6数字+2浮点+字符+布尔
- 6数字:byte(8位),short(16位),int(32位),long(64位)
- 2浮点:float(32位单精度),double(64位双精度)
- 字符:char(16位Unicode字符)
- 布尔:boolean(true/false)
- 包装类:数值取值以常量的形式定义在包装类(java.lang)中,如Byte、Integer、Float、Double、Character
引用数据类型:类似C++的指针,引用类型指向一个对象,变量一旦声明后类型就不能改变,如对象、数据都是引用类型,引用类型默认值为null
常量:在程序运行时不能修改的变量,使用final关键字修饰变量
类型转换:
- 自动类型转换:满足转换后的数据类型位数增大的规则,转换过程中可能导致溢出或损失精度,如浮点数到整数转换是舍弃小数而不是四舍五入
- 强制类型转换:使用格式(type)value进行转换
Java修饰符(访问控制+非访问控制)
访问控制修饰符:用来保护对类、接口、变量、方法的访问,default、public、private(不修饰类、接口)、protected(不修饰类、接口)
非访问控制修饰符:
- static:修饰类方法和类变量(静态)
- final:修饰类(不能继承)、方法(不能被集成类重新定义)、变量(常量不能修改)
- abstract:修饰抽象类和抽象方法
- synchronized:修饰方法在同一时间只能被一个线程访问
- transient:预处理类和变量,修饰的变量会被JVM跳过,不持久化
- volatile:修饰的变量被线程访问时都强制从共享内存中重新读取变量值,而且修饰的变量发生变化会强制线程将变化值写入共享内存
Java流程语句
循环结构:while(){},do{}while();,for(;;){},数组循环for(type item:arrayName){}
控制结构:break,continue
判断结构:if(){}else if(){}else{},switch(){case value:break;default:}
Number类
Java为每一个内置数据类型提供了对应包装类对象,所有包装类都是抽象类Number的子类,Number类属于java.lang包
Java中的自动装箱与拆箱:
- 当内置数据类型被当做对象使用的时候,Java编译器会自动将基本数据类型转换为包装器类型,这就是自动装箱。
- 当对象被当做内置数据类型使用的时候,Java编译器会自动将包装器类型转换为基本数据类型,这就是自动拆箱
1
2Integer i1 = 128; // 装箱,相当于 Integer.valueOf(128);
int t = i1; //拆箱,相当于 i1.intValue() 拆箱
Math类
Math类包含了用于执行基本数学运算的属性和方法,如初等指数、对数、平方根、三角函数等,Math的方法都被定义为static形式,通过Math类可以在主函数中直接调用
常用方法:
- ceil()向上取整,
- floor()向下取整,
- round()四舍五入,
- min()/max()返回最小/大值,
- exp(n)返回e^n,
- log(n)返回ln(n),
- pow(a,b)返回a^b,
- sqrt(n)返回根号n,
- random()返回[0.0,1.0]随机数
Character类
Character类是内置数据类型char的包装类,可通过装箱的形式创建。
常用方法:
- isLetter()/isDigit()/isWhitespace()/isUpperCase()/isLowerCase()判断字母/数字字符/空格/大写字母/小写字母,
- toUpperCase()/toLowerCase()/toString()转换字母大写/小写/字符串形式
String&StringBuffer&StringBuilder类
String字符串对象初始化之后是不可改变的,若需要修改则会创建新的String字符串对象,因此对于需要修改的字符串应该选用StringBuffer和StringBuilder类,StringBuilder是非线程安全但速度快,StringBuffer是线程安全但速度慢
String类常用方法:
- str.length()获取长度,
- str.concat(str)连接字符串,
- str.charAt(index)返回index处字符,
- str.replace(a,b)用字符b替换str中所有a字符,
- str.replaceAll(regex,b)用字符串b替换str中满足正则regex的字符串,
- str.split(regex,[limit])根据regex规则分割str成[limit]个字符串,
- str.toLowerCase()/toUpperCase()所有字符转换为小写/大写,
- str.trim()返回忽略前后空白的字符串副本
StringBuffer/StringBuilder类常用方法:
- str.append(s)将s追加到字符串str的结尾
- str.reverse()返回str反转形式
- str.delete(start,end)删除start下标到end下标中的字符
- str.insert(offset,s)将s插入到offset索引字符前边
- str.capacity()返回字符串容量(预处理预留容量会比length大)
Java数组与Arrays类(java.util.Arrays)
声明与创建数组:
- dataType[] arrayRefVar = new dataType[arraySize];
- dataType[] arrayRefVar = {value0, value1, …, valuek};
遍历数组:for(dataType value:arrayRefVar){//处理value}
Arrays类常用方法:
- fill(array,val)用val值填充数组array
- sort(array)对数组升序排序
- equals(array1,array2)比较数组12是否相等
- binarySearch(array,val)返回val在数组array中的位置
Date类和SimpleDateFormat类(java.util)
Java提供Data类封装时间和日期
创建和初始化Date对象:
- Date date = new Date(); //当前日期和时间初始化
- Date date = new Date(long millisec); //时间戳初始化
Date对象常用方法:
- date.getTime()返回date对象的时间戳
- date.setTime(long time)返回时间戳表示的date对象
- date.toString()返回date的字符串表示
SimpleDateFormat类:
- 将date对象转换成指定格式的string:如SimpleDateFormat ft = new SimpleDateFormat (“E yyyy.MM.dd hh:mm:ss a zzz”);
- 使用parse()将string根据指定格式解析成日期:如SimpleDateFormat ft = new SimpleDateFormat (“yyyy-MM-dd”);date=ft.parse(“1818-11-11”);System.out.println(t);
Thread.sleep(millisec):使当前线程进入阻塞状态millisec毫秒
Pattern类&Matcher类(java.util.regex)
正则表达式实例:
- 字符串匹配对应的字符串
- .(点号)匹配除”\r\n”之外的任何单个字符
- [\s\S]匹配任意字符
- ^定义开头
- $定义结尾
- +匹配前面字符一次或者多次
- *匹配前面字符零次或者多次
- ?匹配前面字符零次或者一次
- \d匹配数字,等效于[0-9]
- \s匹配空格
- \w匹配字类字符,等效于[A-Za-z0-9_]
- \b匹配字边界,即字与空格的位置
String中使用正则:
- 匹配:Str.matches(regex)返回str中是否有regex匹配的结果即true/false
- 替换:Str.replaceAll(regex,n)将str中的符合regex匹配的字符串替换成n
- 切割:Str.split(regex)返回Str以regex匹配到的字符分割的string数组
Pattern与Matcher对象:
- Pattern对象:是正则表达式的编译表示,调用公共静态编译方法(Pattern.compile)得到,如Pattern pt = Pattern.compile(regexStr);
- Matcher对象:是对输入字符串进行解释与匹配操作的引擎,调用Pattern对象的matcher方法得到,如Matcher match = pt.matcher(Str);
Match对象常用方法:
- matcher.find()返回下一个匹配对象
- 匹配组:将多个匹配规则以开括号形式写出,匹配时会自动对应分组
- matcher.group(int groupCount)返回对应匹配组的匹配结果
- matcher.groupCount()返回匹配组数量
- matcher.toMatchResult()将匹配结果以MatchResult形式返回
Java继承
使用关键字extends申明所继承的父类,子类拥有父类非private属性、方法,子类可以重写父类方法,Java的继承是单继承
接口:Java使用关键字implements继承接口,接口的继承可以是多继承
super:super关键字可以实现对父类成员的访问,用来引用当前对象的父类
this:this关键字是指向自己的引用
final:final类修饰的类不能被集成,final修饰的方法不能被子类重写
重写(Override):是子类对父类允许访问的方法进行重新编写,返回值和形参不能改变
重载(Overload):重载是在一个类中方法名相同,参数不同的方法,主要用于构造器的重载
Java多态
多态应用条件:子类继承父类+子类重写父类方法+父类引用指向子类对象
多态调用机制:多态调用一个类对象的方法时,首先检查父类中是否有该方法,若没有则编译错误(没有重写),若有则调用子类同名方法,若想调用父类中被重写的方法则需使用关键字super
虚方法:当父类引用指向子类对象,调用此引用的方法时,调用的是子类对象重写的方法
Java抽象类
使用关键字abstract定义抽象类,抽象类变量不能初始化值,抽象类方法只包含方法声明(修饰符+abstract+返回值+方法名+参数列表),继承的子类必须重写父抽象类所有抽象方法,否则该子类也必须声明为抽象类,不能实例化对象
Java接口
接口是一个抽象类型,是抽象方法的集合,通过关键字interface声明,类通过implements实现接口
接口与类不同:
- 接口不能实例化对象
- 接口没有构造方法
- 接口中所有方法都是抽象方法
- 接口中没有除了static/final外的成员变量
- 接口不被类继承(extends),而是被类实现(implements),实现接口的类要实现接口所有方法
- 接口支持多继承