java300笔记.docx
《java300笔记.docx》由会员分享,可在线阅读,更多相关《java300笔记.docx(41页珍藏版)》请在冰豆网上搜索。
java300笔记
JDKJREJVM
JDK:
JavaDevelopmentKitJava开发工具包。
JRE:
JavaRuntimeEnviromentjava运行的环境。
JVM:
JavaVirtualMachineJava虚拟机。
JVM是一种规范。
就是一个而虚拟的用于执行bytecodes字节码的计算机。
.java编译成.class文件执行...某某系统。
一个源文件只有一个publicclass,但是可以有好几个class,一个class编译成一个.class文件。
标识符
作用:
给变量、类和方法命名
规则:
——标识符必须以字母、下划线、美元符开头。
——标识符其他部分可以使字母、下划线、美元符和数字的任意组合。
——Java标识符大小写敏感,且长度无限制。
——不可以是Java关键字。
注:
——Java不采用通常语言使用的ASCII字符集,而是采用Unicode这样的标准的国际字符集。
Java基本数据类型
整数变量:
Byte一个字节-127~128
Short两个字节-32768-32767
Int(integer)四个字节约21亿
Long八个字节
自定义类BigDecimal
Integer.toBinaryString(a);变为二进制字符串
Longa=249853483809L;
浮点数:
Float四个字节
Double八个字节
BigDecimal
字符型两个字节
char:
unicode编码有0-65535个字符默认’\u0000’(成员变量有默认值)
Boolean:
一位默认fasle
自动类型转换
容量小的数据类型可以自动转换成容量大的数据类型。
容量指的是表述的范围(数的范围)。
Long可以转换为floatdouble有可能丢失精度。
可以将整型常量直接赋值给charbyteshort等类型只要不超过表述范围。
强制类型转换
用于显式的转换一个数值的类型,在有可能丢失信息的情况下进行的转换,可能造成精度降低或溢出。
当将一种类型强制转换成另一种类型,而又超出了目标类型的表示范围,就会被截断成为一个完全不同的值。
(!
!
所以不能这样转换)。
运算时类型提升问题
Intb;
Floatc;
Floata=b+c;
Intb提升了
变量
Java是一种强类型语言,每个变量都不必须声明其类型。
Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。
局部变量:
方法或语句块内部定义的变量,变量在使用前必须对其声明
实例变量(成员变量):
方法外部、类的内部定义的变量,如果不自行初始化成该类型的默认初始值,他会自动初始化成该类型的默认初始值(数值型变量初始化成0或0.0,字符型变量的初始化值是16位的0,布尔型默认值是false)
常量
Final:
只能被初始化一次!
!
一般大写
运算符
算术运算符:
+,-*,/,%,++,--
赋值运算符:
=
关系运算符:
<,>,<=,>=,==,!
=,instanceof
逻辑运算符&&,||,!
位运算符:
&,|,^(按位异或),~,>>,<<,>>>
条件运算符:
?
:
扩展赋值运算符:
+=,-=,*=,/=
Intb=a++先赋值给b,再a+1
Doubled=10.3%3,可以d=1.3
逻辑与:
&&,逻辑或:
||,逻辑非!
逻辑与和逻辑或采用短路的方法。
从左到右计算,如果确定值则不会再计算下去。
+字符串连接符,只要+号两边有一个是字符串则变为字符串。
控制语句
if后面没有括号只保持一行
Switch(int或者可以转成int的类型,枚举,JDK7中可以放置字符串)
Case:
Break;没有break会一直往后执行
JDK7新例子
Swith(a){
Case:
“马士兵”
...
Case:
”高琪”
}
循环:
whiledowhileforforreach
确定循环时先可以从笨的开始先输出一行一行打再替换成想要的东西
比如乘法表:
System.out.println(“1*1=1”);
System.out.println(“1*2=22*2=4”);
.....
Break:
再任何循环语句的主体部分,均可用break控制循环的流程,break用于强行退出循环,不执行循环中剩余的语句,(break语句还可用于多支结构中)。
Continue语句用在循环语句体中,用于终止某次循环过程,即跳出循环体中尚未执行的语句,接着进行下一次是否执行循环的判断。
Goto是java的保留字不推荐使用
Intcount=0;
outer:
for(inti=101;i<150;i++){
for(intj=2;j
if(i%j==0)
continueouter;//可以调到外部
}
}
方法(methodfunction)
Java的方法类似于其他语言的函数,是一段用来完成特定功能的代码片段,声明格式:
[修饰符1,修饰符2...]返回类型方法名(形式参数列表){
Java语句;...
}
形式参数:
在方法被调用时用于接受外部输入的数据
实参:
调用方法时实际传给方法的数据。
返回值:
方法完毕后返回给调用它的环境的数据
返回类型:
事先约定的返回值的数据类型,如无返回值,必须给出返回类型void
Java语言中使用下述形式调用方法:
对象名.方法名(实参列表)
return语句终止方法的运行并制定要返回的数据。
Java中进行方法调用中传递参数时,遵循值传递原则。
基本类型传递的是该数据本身。
引用类型传递的是对对象的引用,而不是对象本身。
递归是一种常见的解决问题的方法,即把问题逐渐简单化。
递归的基本思想就是“自己调用自己”,一个使用递归技术的方法将会直接或者间接的调用自己。
递归结构包括两个部分:
——定义递归头。
解答:
什么时候不调用自身方法。
如果没有头,将陷入死循环。
——递归体。
解答:
什么时候需要调用自身方法。
API
API:
Applicationprograminginterface
package便于文件管理
生成自己的API文档:
特殊的注释/***/
使用javadoc
接受键盘输入
Scanner
面向对象编程
orientedobject
组织代码,封装数据
面向对象的本质:
以类的方式组织代码,以对象的方式组织(封装)数据。
对象:
是具体的事物
类:
是对对象的抽象(抽象、抽出像的部分)
先有具体的对象,然后抽象各个对象之间像的部分,归纳出类通过类再认识其他对象。
方法是从属于类的。
内存分析
栈:
存放局部变量。
(自动分配连续的空间,后进先出)
堆:
存放new出来的对象。
(不连续空间)
方法区:
存放类的信息(代码)、static变量、常量池(字符串常量)等。
(也是堆)
垃圾回收机制(GarbageCollection)
程序员可以通过System.gc(),通知GC运行,但是Java规范并不一定立即运行。
Finalize方法,是Java提供给程序员用来释放对象或资源的方法。
构造器又称为构造方法constructor
构造器用于构造该类的实例。
格式如下:
[修饰符]类名(形参列表){
//n条语句
}
是一种特殊的方法:
1.通过new关键词调用!
!
2.构造器虽然有返回值,但是不能定义返回类型(返回值的类型肯定是本类),不能在构造器里调用return。
3.如果我们没有定义构造器,则系统会自动第一个无参的构造器。
如果已定义则编译器不会添加。
4.构造器的方法名必须和类名一致。
方法的重载(overload)
方法的重载是指一个类中可以定义有相同的名字,单参数不同的多个方法。
调用时,会根据不同的参数表选择对应的方法。
两同三不同:
1.同一个类,同一个方法名;2.参数列表不同(类型,个数,顺序不同)
只有返回值不同不构成方法的重载。
只有形参的名称不同,不构成方法的重载。
与普通方法一样,构造方法也可以重载。
Static
在类中,用static生命的成员变量为静态变量,或者叫做:
类属性,类变量
——它为该类的公用属性,属于类,被该类的所有实例共享,在类被载入时被显式初始化。
——对于该类的所有对象来说,static成员变量只有一份。
被该类的所有对象共享!
——可以使用对象.类属性来调用,不过一般使用类名.类属性
——static变量属于方法区中!
用static声明的方法为静态方法
——不需要对象,就可以调用(类名.方法名)
——在调用该方法时,不会讲对象的引用传递给它,所以在static方法中不可访问非static的成员。
This
普通方法中,this总是指向调用该方法的对象。
构造方法中,this总是指向正要初始化的对象。
This不能用于static方法。
面向对象三大特征
继承
封装/隐藏
多态——为了适应需求的多种变化,是代码变得更加通用。
子类继承父类,可以得到父类的全部属性和方法(除了父类的构造方法)。
Java中只有单继承。
方法的重写(override)
在子类中可以根据需要对从基类中继承来的方法进行重写。
重写方法必须和被重写方法具有相同方法名称、参数列表和返回类型。
重写方法不能使用比被重写方法更严格的访问权限。
(由于多态)
Object类
Object类时所有Java类的根基类
如果在类的声明中未使用extends关键字指明其基类,则默认基类为Object类
重写:
toString()方法:
——默认返回:
报名+类名+@+哈希码
——可以重写
Object中Equals比较两个对象是否相等
Super关键字
super是直接父类对象的引用。
可以通过super来访问父类中被子类覆盖的方法和属性。
普通方法:
没有顺序限制,可以随便调用
构造函数中:
任何类的构造函数中,若是构造函数的第一行代码没有显式的调用super(。
。
),那么Java默认都会调用super();作为父类的初始化函数。
Is-a关系采用继承
Has-a关系使用组合
Final关键字
修饰变量:
常量
修饰方法:
该方法不可被子类重写。
但是可以被重载!
修饰类:
修饰的类不能有子类,不能被继承。
封装
同一个类
同一个包中
子类
所有类
Private
*
Default
*
*
Protected
*
*
*
Public
*
*
*
*
多态
父类的引用指向子类的对象
Animala=newCat();
多态主要是用来实现动态联编的,换句话说,就是程序的最终状态只有在执行过程中才被决定而非在编译期间就决定了。
这对于大型系统来说能提高系统的灵活性和扩展性。
引用变量的两种类型
——编译时类型(模糊一点,一般是个父类)
——运行时类型(运行时,具体是那个子类就是哪个子类)
多态3个必要条件:
要有继承、要有方法重写、父类引用指向子类对象。
抽象类
是一种模板模式。
抽象类为所有子类提供了一个通用模板,子类可以在这个模板基础上进行扩展。
通过抽象类,可以避免子类设计的随意性。
通过抽象类,我们就可以做到严格限制子类的设计,是子类之间更加通用。
要点:
有抽象方法的类只能定义成抽象类。
抽象类不能实例化,不能new出来。
抽象类可以包含属性、方法、构造方法。
但是构造方法不能用来new实例,只能用来被子类调用。
抽象类只能用来继承。
抽象方法必须被子类实现。
接口(interface)
方法中没有实现只有声明
内部类
内部类使用场合:
通常内部类只为所在的外部类提供服务。
java内部类:
普通内部类(成员内部类)
——静态内部类
——非静态内部类
匿名内部类
方法内部类
内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的class文件,但是前面冠以外部类的类名和$符号。
内部类可以使用修饰符(public,protected,defalut,private)
成员内部类
成员内部类的基本用法:
(普通内部类)
——成员内部类就像一个成员变量一样存在外部类中
——成员内部类可以访问外部类的所有成员(包含:
private的)
——成员内部类的this值内部类对象本身。
要拿到外部类对象可以使用:
外部类名+.this
——成员内部类不能有静态成员
成员内部类的创建方式:
——外部类内部
Innerinner=newInner()
——外部类外部
Innerinner=newOuter().newInner();
方法内部类
——方法内部类的地位和方法内的局部变量的位置相似
因此不能修饰局部变量的修饰符也不能修饰局部内部类
——方法内部类只能在声明的方法内是可见的
因此定义局部内部类之后,想要用的话就要在此方法内直接实例化
——方法内部类不能访问定义它的方法内的局部变量,除非这个变量定义为final
本质原因:
局部变量和方法内部类声明周期不一致所致!
——方法内部类只能包含非静态成员!
匿名内部类
匿名内部类的基本方法:
——匿名内部类的实例化方式:
newSomeInterfaceOrClass(){};意思是创建一个实现(集成)了someInterfaceOrClass的类的对象。
——根据声明的位置,判断匿名内部类还是方法内部类。
注:
一般是方法内部类,这是这时具有方法内部类的特性。
三种使用方法:
——继承式
——接口式
——参数式
数组
数组是相同类型数据的有序集合
数组描述的是相同类型的若干数组,按照一定的先后次序排列组合而成,其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它。
数组有三个特点:
1.其长度是确定的。
数组一旦被创建,它的大小就是不可改变的。
2.其元素必须是相同类型,不允许出现混合类型。
3.数组中的元素可以是任何数据类型,包括基本类型和引用类型。
一维数组三种初始化方式:
int vec[] = new int[]{1, 5, 3}; //第一种方法
int vec[] = {37, 47, 23}; //第二种方法
intvec[]=newint[3];
for(inti=0;i<3;i++)
vec[i]=i+1; //第三种方法
一维数组两种声明方式:
int[]a;//a属于引用类型就是个地址
doubleb[];
Int[][]a={{2},{34,8},{9}};
System.arraycopy();
java.util.Arrays里面好多操作数组方法
String类
Java字符串就是Unicode字符串序列。
Java没有内置的字符串类型,而是在标准Java类库中提供一个预定义的类String,每个用双引号括起来的字符串都是String类的一个实例。
String类创建后不会变,
String重写了equals方法(比较的是字符串值是不是一样)
String只是引用
subString(),split(),trim(),replace(),getChars.valueOf(),regionMatches(),equalsIgnorCase,indexof(),
Replace(),matches(),等方法
String是个特殊的类,比如Strings=“abc”;表示s引用指向常量池“abc”,而且加入有Strings1=“abc”,java不会再分配内存地址不会再创建对象所以s==s1.然后Strings=newString(“abc”);表示创建一个新的对象指向“abc”,是abc的一个副本。
StringBuilder,StringBuffer
StringBuffer:
是线程安全的,效率低
StringBuilder:
是线程不安全的,效率高
Append(),insert()等方法
Java常用类
基本数据类型的包装类
ParseInt(String)String————Integer
Integeri=newInteger(“34”);
i.intValueInteger——int
重写equals比较两个整数是否相等
自动装箱:
Integeri=100;
本质上是,编译器编译时为我们添加了:
Integeri=newInteger(100);
自动拆箱
Inta=newIntegr(100);
本质上,编译器编译时为我们添加了:
Inta=newInteger(100).intValue();
Jdk5.0之后有的
时间相关的类:
Date
Lontt=System.currentTimeMillins()得到当前时刻毫秒
SimpleDataFormat
java.text.SimpleDataFormat字符串转date
File:
代表一个文件或者目录
异常机制
Java是采用面向对象的方式来处理异常的,处理过程:
抛出异常:
在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把这个异常交给JRE。
捕获异常:
JRE得到该异常后,寻找相应的代码处理该异常。
JRE在方法的调用栈中查找,从生成异常的方法开始回溯,直到找到相应的异常处理代码为止。
ErrorException
Error不需要自己管(唯一办法重启),Exception需要自己处理。
)Checked,UnChecked。
Trycatch没有遇见异常直接try执行finally语句。
Trycatchfinallyreturn;
容器
Collections.reverse():
容器工具类
Collection表示一组对象,它是集中,收集的意思,就是把一些数据收集起来。
Collection函数库是在java.util包下的一些接口和类,类时用来产生对象存放数据用的,而接口是访问数据的方式。
Collection函数库与数据的两点不同:
1.数组的容量是有限制的,而Collection没有这样的限制,它容量可以自动调节。
2.Collection函数库只能用来存放对象,而数组没有这样的限制。
Collection接口是Collection层次结构中的跟接口,他定义了一些最基本的访问方法,让我们能统一通过它或它的子接口来访问数据。
区别:
Collection代表一组对象,Collection函数库就是java数据的集合框架,Collection接口,是这个集合框架中的跟接口。
存放在Collection库中的数据,被称为元素(element)。
List:
有顺序的表(索引的顺序)
List中比如有{2,3,6,2,54,4}size()为6,index从0~5数组的length也为6
ArrayList:
底层实现数组,线程不安全。
所以,查询快。
修改、插入、删除慢。
LinkedList:
底层实现是链表,线程不安全。
所以,查询慢。
修改、插入、删除快。
Vector:
线程安全的,效率低。
Map:
Key,value通过key操作value比如get()、remove()
map的底层结构就是:
数组+链表(hash码),内部类!
将键映射到值的对象。
一个映射不能包含重复的键;每个键最多只能映射到一个值。
实现首先新建个对象keyvalue
HashMap:
效率高,线程不安全。
实现是数组+链表。
键不能重复,键最多一个null,值可以多个null
HashTable:
效率低,线程安全。
键与值不能为null
Set:
无序不可重复
Java中两个内容相同的东西有相同的hashcode
Set中加一个privatestaticfinalPRESENT=newobject();数据存入key中。
HashSet:
最快的获取元素的方法。
TreeSet:
按照比较结果的升序保存对象。
LinkedHashSet:
它按照被添加的顺序保存对象。
Map一样。
Iteratormyite=set(set对象).iterator();
Iterator是一个接口。
Map实现用key遍历
Cursor游标的实现。
如果用集合的iterator()方法,返回的是一个实现了Iterator接口的类的实例(对象)。
HashMap分拣思想,首先分拣出来新建容器然后一直往里面装东西。
为所有key创建容器,存放value
泛型
泛型就是参数化类型,使用广泛的类型
起因:
数据类型不明确
——转入数据的类型当做Object对待,从而‘丢失’自己的实际类型
——获取数据时往往需要转型,效率低,容易产生错误。
作用:
——安全:
在编译的时候检查类型安全,
——省心:
所有强制类型都是自动和隐式的,提高代码的重用率。
1.格式:
<>
class类名<字母列表>{
修饰符字母属性;
修饰符构造器(字母){
}
修饰符返回类型方法(字母){
}
}
不能使用在静态属性、静态方法上
2.使用:
指定具体类型
1.编译时会进行类型检查
2.获取数据时不需要强制类型转换
泛型使用时不能指定基本类型
泛型常用字母
T-Type
KVKeyValue
EElement
?
表示不确定的类型,声明类型方法时,声明不定使用确定
泛型方法:
返回类型前面
Publicstaticvoidtest(Ta){}
增强for,必须实现java.lang.Iterable接口,重写iterator
Iterable返回一个iterator
Iterator有:
hasNext()Next()remove()
compareTo返回0表示this==obj
返回正数表示this>obj
返回负数表示thisIntegera;//根据基本数据类型大小
Characterc;//根据Unicode编码顺序
Strings;//如果其中一个是另外一个起始开始的子串,返回长度之差,否则返回第一不相等的Unicode差值
Collections.sort排序
Comparator:
很多排序规则,提供排序的比较器,业务比较器,实现java.util.Comparator接口,重写publicintcompare(To1,To2),作用:
解耦独立于实体类,方便:
便于应对各种排序规则。
TreeSetTreeMap
TreeSet:
数据元素可以排序,数据元素不可重复。
HashSet:
元素必须重写hashcode和equals。
1)、元素可以排序java.lang.Comparable+compareTo
newTreeSet()
2)、排序业务类java.util.Comparator+compare
NewTreeSet(Comparator
superE>comparator)
TreeMap:
确保key可以排序
Collections