Java特点:跨平台,面向对象,高级。
Java程序代码编译和运行过程:程序源代码——编译器——字节码——JVM(Java虚拟机)——机器码——计算机。
Java版本分类:Java SE标准版用于桌面应用程序的开发,Java EE企业版用于开发企业级分布式网络程序,Java ME用于嵌入式系统开发。
Java程序的基本组成单元是类,类体中又包含属性与方法两部分。
每一个应用程序都必须包含一个main()方法,含有main()方法的类称为主类。
代码文件名必须和类名同名。
Java区分大小写
声明在类中的称为全局变量(成员变量),声明在方法中的称为局部变量。
main()方法是类体中的主方法,Java中的main()方法必须声明为public static void。main()方法是程序开始执行的位置。
Java基本数据类型:数值型[分为整数类型(byte、short、int、long)和浮点类型(float、double)]、字符型、布尔型。共8种。
整数类型:3种表示形式,十进制、八进制(必须以0开头)和十六进制(必须以0X或0x开头)。byte(1字节8位,-128-127)、short(2字节)、int(4字节)、long(8字节)。
对于long型值,若赋给的值大于int型的最大值或小于int型的最小值,则需要在数字后加L,表示该数值为长整数。
浮点类型:单精度float(4字节)(小数后面需要添加F或f),双精度double(8字节)(小数后面的D或d可加可不加)。
字符类型:1.char型(2字节)存储单个字符;2.转义字符
布尔类型:逻辑类型,用关键字boolean定义,只有true和false。
系统内存大致分为3个区域:系统区(OS)、程序区(Program)和数据区(Data)。程序执行时,程序代码加载到内存中的程序区,数据暂存至数据区中。
声明常量:final 数据类型 常量名称[=值]
常量名称通常使用大写字母
当定义的final变量属于成员变量时,必须在定义时赋初值
成员变量在整个类中都有效。成员变量又可分为两种,静态变量(加关键字static,也称类变量)和实例变量。静态变量的有效范围可以跨类,能直接以“类名.静态变量”的方式在其他类中使用。
局部变量只在当前定义的方法内有效。
局部变量可与成员变量的名字相同,此时成员变量将被隐藏。
赋值运算符=
算术运算符+ - * / %
自增和自减运算符++ –
比较运算符
逻辑运算符&(&&) || !
&与&&区别:&属于“非短路”运算符(运算符两边表达式都执行),&&属于“短路”运算符(第一个表达式为false则不去判断第二个表达式)。
位运算符& | ~ ^ << >>(最高位为0/1,右移空的位就填0/1) >>>(右移空的位都填0)
三元运算符 条件式?值1:值2
包括隐式转换与显式转换
隐式转换:从低精度类型向高精度类型的转换,系统自动执行
显式转换:又称强制类型转换,高精度转低精度必须用
代码注释:在多行注释中可嵌套单行注释,但不可嵌套多行注释。
复合语句:又称块语句,由{}标记。为局部变量创建了一个作用域,在该作用域中创建的变量无法在作用域外使用。
条件语句
if条件语句:简单if条件语句、if…else语句(可使用三元运算符进行简化)、if…else if多分支语句
switch多分支语句:表达式的值必须是整型、字符型或字符串类型。
循环语句
while循环语句
do…while循环语句
for循环语句:for语句、foreach语句
foreach语句:
for(元素变量x : 遍历对象obj){
引用了x的Java语句;
}
//在遍历数组等方面很方便
循环控制:continue(执行下一次循环)和break(中断循环)(嵌套循环下break只会中断包含它的最内层循环)
若想让break跳出外层循环,可使用“标签”功能:
标签名: 循环体{
break 标签名;
}
continue也支持标签功能:
标签名: 循环体{
continue 标签名;
}
声明字符串:通过java.lang包中的String类。将字符串作为对象来管理。
String类的常用构造方法:
String(char a[])
String(char a[], int offset, int length)
String(char[] value)
连接多个字符串:使用“+”运算符可连接多个字符串并产生一个String对象。
连接其他数据类型:会将其他类型的数据直接转换成字符串。
获取长度:int size = str.length();
字符串查找:
str.indexOf(substr) (返回搜索的字符或字符串首次出现的位置)
str.lastIndexOf(substr) (返回搜索的字符或字符串最后一次出现的位置)
若没有查找到返回-1
获取指定索引处的字符:str. charAt(int index)
获取子字符串:str.substring(int beginIndex) str.substring(int beginIndex, int endIndex)
去除空格:str.trim() //返回副本,去除前导和尾部空格。
字符串替换:str.replace(char oldChar, char newChar)
判断字符串的开始与结尾: str.startsWith(String prefix) str.endsWith(String suffix) 返回boolean类型
判断字符串是否相等:
str.equals(String otherstr) //区分大小写
str.equalsIgnoreCase(String otherstr) //忽略大小写
按字典序比较两个字符串:str1.compareTo(String str2) //若1在前,返回一个负整数,若1在后,返回一个正整数,若想等返回0
字母大小写转换:str.toLowerCase() str.toUpperCase()
字符串分割:str.split(String sign) str.split(String sign, int limit)
格式化字符串:format()方法
正则表达式:含有一些具有特殊意义字符的字符串。特殊字符称为元字符。
字符串生成器:StringBuilder
要输出字符串结果:使用toString()方法
append(content) //向字符串生成器中追加内容
insert(int offset, arg) //向字符串生成器中的指定位置插入数据内容
delete(int start, int end) //移除子字符串中的字符
数组:具有相同数据类型的一组数据的集合。Java中同样将数组看作是一个对象。
创建一维数组的两种方法:
先声明,再用new运算符分配内存
数组元素类型 数组名字[]; //声明
数组元素类型[] 数组名字; //声明
数组名字 = new 数组元素类型[个数];
声明的同时为数组分配内存
数组元素类型 数组名[] = new 数组元素类型[元素的个数];
使用new分配内存时,整型数组的元素初始值都为0。
初始化一维数组:
int arr[] = new int[]{1,2,3};
int arr2[] = {4,5,6};
二维数组
遍历数组(可使用foreach语句)
填充替换数组元素:在java.util.Arrays包里。
Arrays.fill(int[] a,int value); //全部替换
Arrays.fill(int[] a, int fromIndex, int toIndex, int value); //替换从fromIndex(包括)到toIndex(不包括)。
对数组排序:Arrays.sort(object);
复制数组:
Arrays.copyOf(arr, int newlength); //复制数组至指定长度
Arrays.copyOfRange(arr, int fromIndex, int toIndex); //复制数组的指定长度
数组查询
Arrays.binarySearch(Object[] a, Object key); //使用二分搜索法,返回要搜索元素的索引值(未搜到返回-1或“-插入点”,插入点是第一个大于此值的元素索引)
查询前需要先对数组进行排序。
Arrays.binarySearch(Object[] a, int fromIndex, int toIndex, Object key); //在指定范围内检索
数组排序算法
冒泡排序
直接选择排序:每一趟从待排序的数据元素中选出最大(最小)的元素,放在已排好序的数据堆的最前,直到全部排完。
反转排序:把数组最后一个元素与第一个元素交换,依此类推。
面向对象设计:对现实世界中的对象进行建模操作。
对象:事物存在的实体。包括静态部分-属性,和动态部分-行为。
类:同一类事物的统称(具有相同属性和行为的一类事物)。是构造对象时所依赖的规范。
类是世间事物的抽象称呼,对象是这个事物相对应的实体。
类是封装对象属性和行为的载体,对象是类抽象出来的一个实例。
类中以成员变量的形式定义对象的属性,以方法的形式定义对象的行为。
面向对象程序设计特点:封装性、继承性、多态性。
封装性:将对象的属性和行为封装起来,为用户提供接口,对用户隐藏实现细节。
继承性:关联(类与类之间的关系)的一种。利用特定对象的共有属性,子类继承父类(超类)的属性和行为,再添加子类独有的属性和行为。
多态性:将父类对象应用于子类的特征。父类通常定义为抽象类,由抽象方法组成的集合就是接口。
类:使用class关键字来定义
成员方法:对应类对象的行为。
权限修饰符 返回值类型 方法名(参数类型 参数名){
…//方法体
return 返回值;
}
参数可以是对象,也可以是基本数据类型的变量。可有返回值和不返回任何值(用void关键字)。
类成员变量和成员方法可统称为类成员。
private public protected,控制着对类、类成员变量、成员方法的访问。
访问范围:private(仅本类) protected(本类+同包其他类或子类) public(本类+同包其他类或子类+其他包的类或子类)
不使用任何修饰符时,默认访问范围为同一个包中的类。
类的权限设定会约束类成员的权限设定。
局部变量在使用时必须进行赋值操作或被初始化,否则会编译错误。
局部变量的有效范围(作用域):从变量声明开始,到块结束为止。
this关键字:用于引用类的对象中的成员变量和方法(this.name=name)。还可以作为方法的返回值(return this;)。
类的构造方法:与类同名的方法。用于完成对象的创建。
构造方法没有返回值(不需用void)。名称必须与本类名称相同。
构造方法中可为成员变量赋值,从而将对象初始化。
若没有定义构造方法,编译器会自动创建不带参数的默认构造方法。
this还可以调用类中的构造方法。
被声明为static的变量、常量和方法被称为静态成员。可以在本类或其他类使用类名和“.”运算符调用静态成员。
静态成员的作用通常是为了提供共享数据或方法。
静态成员同样受权限修饰符约束。
在静态方法中不可使用this关键字。
在静态方法中不可直接调用非静态方法。
不能将局部变量声明为static的。
执行类时若希望先执行类的初始化动作,可用static定义一个静态区域。当代码被执行时,首先执行static块中的程序,并只会执行一次。
类的主方法:类的入口点
public static void main(String[] args){
//方法体
}
主方法是静态的,要在其中调用其他方法必须也是静态的。
主方法没有返回值。形参为数组。
对象
创建:用new操作符。并可以调用构造方法进行初始化。创建与初始化可同时。
访问:使用“对象.类成员”来获取对象的属性和行为。
对象的比较:
“==”运算符:比较两个对象引用的地址是否相等。
equals()方法:比较两个对象引用所指的内容是否相等。
对象的销毁:
被视为垃圾的对象:1、对象引用超过其作用范围。2、将对象赋值为null。
Java为每个基本类型都提供了包装类,便可把基本类型转换为对象来处理。
构造方法:Integer(int number)、Integer(String str) //要用数值型String
常用方法:byteValue() compareTo() equals() intValue()
常量:MAX_VALUE, MIN_VALUE, SIZE, TYPE
Long Short类与Integer基本相同
构造方法:Boolean(boolean value) Boolean(String str)
常用方法:booleanValue() equals() toString() valueOf()
常量:TRUE, FALSE, TYPE
构造方法:Byte(byte number)、Byte(String str) //要用数值型String
常用方法:byteValue() compareTo() equals() intValue()
常量:MAX_VALUE, MIN_VALUE, SIZE, TYPE
构造方法:Character(char value)
常用方法:toUpperCase() toLowerCase() isUpperCase() isLowerCase()
常量:UNASSIGNED等
构造方法:Double(double value) Double(String str)
常用方法:isNaN()等
常量:MAX_EXPONENT, MIN_EXPONENT, NEGATIVE_INFINITY, POSITIVE_INFINITY
Number类
数字类的父类
数字格式化:主要针对浮点型数据。使用DecimalFormat类。
两种方式:使用实例化对象设置格式化模式、使用applyPattern()方法对数字进行格式化。
数学运算
Math类:包括三角函数方法、指数函数方法、取整函数方法、取最大值最小值及绝对值函数方法
数学常量:Math.PI Math.E
随机数
两种生成方式:调用Math类的random()方法,调用Random类
调用Math类的random()方法:0<=Math.random()<1.0
生成任意两个字符之间的随机字符:
(char)(char1+Math.random()*(char2-char1+1));
Random类:Random r=new Random(seedValue)
大数字运算
BigInteger类,针对大整数
构造方法:public BigInteger(String val)
BigDecimal类,针对大小数
构造方法:public BigDecimal(double val) public BigDecimal(String val)
继承:子类基于某个父类进行扩展,可以继承父类原有的属性和方法,也可以增加新的属性和方法,或直接重写父类中的某些方法。
使用extends关键字来标识两个类的继承关系。
使用super关键字调用父类的构造方法和成员方法等。
子类没有权限调用父类中被修饰为private的方法。
重写(也称为覆盖):在子类中将父类的成员方法的名称保留,重写成员方法的实现内容,更改存储权限,或修改返回值类型(重写的返回值类型必须是父类中同一方法返回值类型的子类)。
重构:特殊的重写方式,只修改成员方法的实现内容,其他不变。
重写时,方法的权限范围只能从小范围改为大范围。
在实例化子类对象时,编译器会自动调用父类的无参构造方法,即父类对象也相应被实例化。(有参构造方法不能被自动调用,要使用super关键字显式地调用)
Object类:是所有类的父类,是最高层类。
Object类中的方法
getClass()方法:返回对象执行时的Class实例,getClass().getname();可以取得类的名称。
toString()方法:将一个对象返回为字符串形式。
对象类型的转换
向上转型:把子类对象赋值给父类类型的变量,可直接使用,总是安全的。
向下转型:将较抽象的类转换为较具体的类。需要使用显式类型转换,在父类对象前加上括号和子类类名。
myobject instanceof ExampleClass
判断某类的对象引用myobject是否属于ExampleClass类。返回布尔值。
方法的重载:在一个类中允许存在一个以上的同名方法,只要这些方法的参数个数或类型不同即可。
方法重载中两个方法的返回值类型可以不同,但只有返回值类型不同不足以构成重载。
不定长参数方法:
返回值 方法名(参数数据类型…参数名称)
这个不定长参数就是一个数组
抽象类:使用abstract关键字定义,用来被继承。
抽象方法:没有方法体,必须放在抽象类中。
抽象类被继承后需要实现其中所有的抽象方法。
接口:抽象类的延伸,可看作是纯粹的抽象类,里面所有的方法都没有方法体(方法必须被定义为public或者abstract形式)。使用interface关键字进行定义。
在接口中定义的任何字段都自动是static和final的。
一个类实现一个接口,可使用implements关键字。
Java中不允许多重继承,但一个类可以同时实现多个接口。
定义一个接口时也可继承自另外一个接口。