java详解笔记.docx
《java详解笔记.docx》由会员分享,可在线阅读,更多相关《java详解笔记.docx(17页珍藏版)》请在冰豆网上搜索。
java详解笔记
-----------------------------第一天------------------------------
一、java历史
---Java的出生地:
SUNMicrosystemsInc.
---Java之父:
JamesGosling
---1991年
二、java技术架构
JavaSE:
标准版,桌面程序
JavaEE:
企业版,服务器
JavaME:
嵌入式设备上的程序开发手机
三、java语言的特点
编译型和解释型语言结合的语言
编译型语言:
先编译生成执行文件,编译器和操作系统有关,所以编译型语言移植性差,但是效率高。
解释型语言:
比如shell,python脚本。
解释一句,执行一句。
不需要编译,不依赖特定的操作系统,移植性好。
效率低一些。
编译:
把java文件编译生成字节码文件(class文件)
解释:
jvm识别class文件,解释成特定操作系统的机器代码
四、java程序的运行过程(参考书上的图)
java文件--->class文件--->加载代码(加载用到的类库)---代码校验(排错)--解释执行
五、Java开发环境搭建
--JVM
jvm识别class文件,有了JVM,java才能跨平台
--JRE
java的运行环境:
包括jvm,java的核心库
--垃圾回收
系统级的线程在jvm空闲的时候,监控内存的使用情况,回收内存。
程序不需要干预
--JDK
java的开发工具集,包括编译器,解释器,调试器,jre(jvm和java库)
--开发环境搭建
---安装jdk,配环境变量
1)找到path,在路径的最前面添加
F:
\ProgramFiles\Java\jdk1.6.0_33\bin;
2)添加变量classpath的值
.;F:
\ProgramFiles\Java\jdk1.6.0_33\lib\
注意:
把命令行关掉,重新开
---写一个java程序
publicclassHelloWorld{
publicstaticvoidmain(Stringargs[]){
System.out.println("HelloJava!
");
}
}
注意事项:
一个源文件中至多只能有一个public的class声明
源文件名必须和public的类名相同
main方法是Java应用程序的入口方法
---命令
E:
cdjava_demo\myapp
javacHelloWorld.java(会生成HelloWorld.class)
javaHelloWorld(解释执行HelloWorld.class)
六类和对象
---对象:
实际存在的,万事万物皆对象
对象有属性和行为
属性:
描述事物的静态特征
行为:
描述事物的功能和行为(对属性进行操作的方法)
---类:
类是同一类对象的属性和行为的抽象和总结。
是抽象的概念,分类是人的本能
忽略对象的细节,抽取本质构造类
类中包括属性和方法
属性:
对对象静态特征的描述
方法:
对对象行为的描述
---类和对象的关系
类是对象的模板,对象是类的实例
在编程中,类是数据类型,对象是该类的变量(是数据类型和变量的关系)
七类的声明
修饰符class类名{
属性//修饰符数据类型属性名(默认值)
构造方法
方法
}
八、构造方法/构造器/构造函数
修饰符类名(参数){
}
构造器的方法名和类名相同
对象创建,一定会调构造方法
若没写构造方法,系统有一个默认的构造方法
若写了自己的构造,系统不再生成的默认的
构造方法可以有多个,通过参数来区分
创建对象:
Mobilemobile=newMobile();
函数重载:
函数名相同,参数不同。
不能通过返回值来区分
structStudent{
intno;
floatscore
}
structStudents1;
printf("%d\n",s1.no);
structStudent*p;
p->no=1;
九、面向对象的三大特征:
封装、继承、多态
---封装:
属性写成私有,加get和set方法
右键-source-Generategettersandsetters
十、为了解决名字冲突
--包名一般小写字母,域名倒置写(公司名.部门名.项目名)
package.farsight.packagedemo;
--使用不同包下的类,需导入包
import.farsight.packagedemo.Book;或者import.farsight.packagedemo.*
默认包下的类,没包名,就没办法导入包,影响使用。
建议先建包,再写类
默认情况下,系统会自动引入java.lang包中的所有类
十一、eclipse关联源码
作业1:
Person类
属性:
姓名、性别、年龄(0-120)private
方法(行为):
3*2(getter/setter)、构造器(至少2个)、show
提示:
建一个包,测试类放在另一个包
-----------------------------------------第二天-------------------------------
一、标示符和关键字
由字母、数字、下划线和$组成,不能以数字开头
二、数据类型
---类型长度
boolean-1位byte-1字节char/short-2字节
float/int-4字节long-8字节
System.out.println(Byte.SIZE);
System.out.println(Short.SIZE);
System.out.println(Character.SIZE);
System.out.println(Integer.SIZE);
System.out.println(Long.SIZE);
System.out.println(Float.SIZE);
System.out.println(Double.SIZE);
---boolean
boolean类型数据只允许取值true或false,不可以0或非0的整数替代true和false。
---char
占2个字节,表示的范围大
采用unicode编码(不是ANSI),支持中文
charc1='\u0061';
---整数类型
Java各整数类型有固定的表数范围和字段长度,而不受具体操作系统的影响,以保证Java程序的可移植性。
---byteshoreintlong
---float和double
Java浮点型常量默认为double型,如要声明一个常量为float型,则需在数字后面加f或F,如:
doubled=3.14;
floatf=3.14f;
floatf=3.14e5;//3.14e-5;
---范围大、精度高类型赋给范围小、精度小的类型,需要强制转换
f1=(float)3.24;//double--float
intm1=(int)f1;
三、引用类型
---引用类型数据以对象的形式存在(比如p2)
---引用类型数据存储的是对象在堆中的起始地址
---声明引用,只是分配引用变量本身的内存,没有创建对象
Personp2=newPerson("Jerry",'m',3);
---申请内存,创建对象
---把对象用属性的默认值初始化
---用构造方法中的语句初始化
---把返回的地址赋给变量p2
四、变量
--方法内部或程序块的局部变量,不初始化,编译通不过
--全局变量
类中的属性(成员变量)就是java的全局变量
类中的所有方法可以直接使用
有默认值(boolean-false)
五、参数传递
---值传递
函数内对形参的修改,不影响调用函数
---引用传递(类似于指针传递)
通过调用类的方法,可以改变对象的值
六、运算符
---<<>>算术移位
--->>>无符号右移位运算符
inti=-32;System.out.println(i>>>2);前面补充2个0,打印一个很大的整数
---字符串连接
---“abc”+”de”结果:
”abcde”
---字符串+数值,Java会自动将数值转换成字符串,然后两个字符串相连生成一个新的字符串。
System.out.println(2+4+"567");
System.out.println(2+"567"+4);
System.out.println("567"+4+2*5);
执行结果如下:
6567
25674
567410
七控制语句
---main函数传参
Run----Runconfiguration--Arguments---Programarguments
Integer.parseInt(args[0])//字符串转整数
---switch后的类型:
bytecharshortint。
没有long,float,double
---for语句alt/
注意i的声明的位置,只能在for循环中用
for(inti=0;i}
f2文件重命名(类名自动跟着改)
---break和continue
break语句和标签(label)的结合可以用来指定从多个嵌套循环的某个循环中跳出。
continue语句也可以使用和标签结合的方式来选择需要终止的嵌套循环的层级。
八、数组
---数组的元素可以是简单类型的数据,也可以是引用类型的数据
---数组自己本身都是一种引用类型(有默认值)
---在数组定义中,不能指定数组的长度
int[]a;
a=newint[10];//默认值0
inta[];
a=newint[10];
inta[]=newint[10];
inta[]={1,5,9,10};
inta[]=newint[]{2,5,1,4,9};
inta[4]={1,5,9,10};error
inta[]=newint[5]{2,5,1,4,9};//error
备注:
int[]arr1,arr2;//arr2是数组,不是int
intarr3[],arr4;//arr4是int,不是数组
---快速遍历数组(打印数组所有元素)
System.out.println(Arrays.toString(arr1));
---数组的方法
---排序:
Arrays.sort(arr1);
----拷贝
System类的静态方法arraycopy()
参数:
src-源数组。
srcPos-源数组中的起始位置。
dest-目标数组。
destPos-目标数据中的起始位置。
length-要复制的数组元素的数量。
System.arraycopy(a,1,b,3,2);
----第二种拷贝:
Arrays.copyOf
int[]c;
c=Arrays.copyOf(a,4);//Copyof内部申请了新数组,C数组有自己的内存
c[0]=100;
System.out.println("int[]a:
"+Arrays.toString(a));//159105
System.out.println("int[]c:
"+Arrays.toString(c));//1005910
-----------------------------------------第三天---------------------------------------------
一、继承:
方便代码复用
is-a
修饰符class类名extends父类名{
}
--创建子类对象时,会先调用父类的构造器,再调用自己的构造器
--子类对象可以调用父类的方法,也可以调用子类新增加的方法
--覆盖:
当子类有和父类完全相同的方法时,用子类对象去调用,调的是自己类方法
可以在子类方法中,用super关键字来调用父类的方法
--类默认有父类Object
二、访问修饰符
本类同包下的子类同包下的普通类不同包下的子类不同包下的普通类
private(类修饰符T
default(包修饰符)TTT
protected(子类修饰符)TTTT
publicTTTTT
三、覆盖
子类的方法和父类的方法完全一样(子类的修饰符不能比父类方法的修饰符更严格)
打印对象,本质是调用对象的toString方法,打印的是地址
建议每个类都重写toString,打印属性
四、super
主要解决父子类名字冲突
---访问父类的成员变量(父类成员的访问修饰符不能是private)
super.变量
//super.name
----访问父类中被重写的方法
super.方法([参数列表])
//super.toString()
---访问父类的构造器
super([参数列表])
//super();super(_name,_age);
五、this
所创建的对象的引用(存储所创建的对象的起始地址)
Personp1=newPerson();
六、初始化块
---它指的是类中的“游离块”——不属于变量声明、不属于方法、不属于构造器,但需要用{}单独括起来
---不管使用哪个构造器创建对象,它都会被首先运行,然后才是构造器的主体部分被执行
备注:
执行顺序:
实例变量的初始化如下递归的进行:
1.设置实例变量的值为缺省的初始值
2.调用对象的构造器,绑定构造器参数。
3.如果构造器中有this()调用,则根据this()调用的参数调用相应的重载构造器,然后,转到步骤5;否则转到步骤4。
4.除java.lang.Object类外,调用父类的中的初始化块初始化父类的属性,然后调用父类构造器,如果在构造器中有super()调用,则根据super()中的参数调用父类中相应的构造器。
5.使用初始化程序和初始化块初始化成员。
6.执行构造器方法体中其他语句
七、装箱:
将简单类型数据自动转换成对应封装类型
拆箱:
将封装类型转换成简单数据类型
-封装类遇到了简单类型自动拆箱
-进行算术运算,自动拆箱
Integeri3=100;//相当于Integeri3=newInteger(100);
Integeri4=100;
System.out.println((i3==i4));//true比的是地址
需要注意的地方:
boolean类型的值
所有byte类型的值
在-128~127之间的short类型的值
在-128~127之间的int类型的值
在\u0000~\u007F之间的char类型的值
==操作符用来判断两个引用是否指的同一个对象(比地址),或者两个简单类型的值是否相等
equal比的是对象的值
八、static
---static属性(跟实例属性相对),主要存类级别的属性,比如统计信息(对象个数)
类名.属性
实例方法能否操作静态属性?
可以
不能用this修饰
---static方法
只能操作静态属性,不能操作普通属性(实例属性)
静态方法能否操作实例属性?
不能
----静态初始化块
不管创建多少个对象,静态初始化块只执行一次
static{
//静态属性初始化
}
九、final
final修饰类,类不能被继承
final修饰方法,方法不能被覆盖
final修改属性,属性的值不能改,所有属性必须有默认值
final修饰局部变量,局部变量只能赋值1次(局部变量只能有final修饰)
-----------------------------------------第四天---------------------------------------------
一、抽象类
--类中有抽象方法,类必须是抽象类
--子类若没有实现父类(抽象类)的抽象方法,子类也得是抽象类
--抽象类不能创建对象
--可以包括属性和实现了的方法
二、接口
--接口中有属性和方法
---属性默认有修饰符publicstaticfinal(有默认值)
---方法默认的修饰符publicabstract
//publicstaticfinalStringname="commontool";
//publicabstractvoidcommu();
Stringname="commontool";
voidcommu();
--接口的本质是特殊的抽象类
--类可以实现多个接口
---接口中的方法可以重名(因为都没实现)
---接口中的属性可以重名,实现类如何区分重名属性?
(通过接口名区分)
System.out.println(ICommuTool.name);
System.out.println(IMediaplay.name);
--接口定义格式:
interface{
[]
[]
}
--java如何模拟多继承(不支持多继承)
类实现多个接口来模拟
三、多态
面向对象的三大特征:
封装、继承、多态
多态:
父类的引用指向子类的对象
---将来该引用实际调的是子类的方法
---该引用就不能再访问子类中添加的属性和方法
---可以把父类的引用,进行强制转换,转成子类类型,调用子类新增方法(经常使用运算符instanceof可以得到对象的类型)
Traffict1=newCar();
t1.show();
((Car)t1).setNum("京A88888");
t1=newBus();
t1.show();
if(t1instanceofCar){
((Car)t1).setNum("京A88888");//excepion
t1.show();
}else{
System.out.println("notcar类的对象");
}
if(t1instanceofBus){
((Bus)t1).setCompany("上海公交集团");
t1.show();
}
四、内部类
--成员内部类:
把类定义在一个类中,叫做成员内部类
---内部类的方法可以直接访问外部类的私有属性及方法
---当内部类的属性和外部类的属性重名时,用outer.this访问外部类的属性(比如:
MemeberInner.this.name)
---创建内部类对象的方法
---法一:
Outer.Innerin=newOuter().newInner();
---法二:
Outero=newOuter();
Outer.InnerI=o.newInner();
--静态内部类:
内部类有修饰
----静态内部类中的每一个方法都不能访问外部类的实例成员
----静态内部类中的每一个方法都可以访问外部类的静态成员
----静态内部类对象的创建
Outer.Innerin=newOuter.Inner();
--匿名内部类:
省略了名字,只用一次
五、异常
算术异常
空指针异常
数组下坐标越界异常
类型转换异常
输入类型不匹配异常
以上的运行时异常:
Java编译器允许程序不对它们做出处理。
一般写一些语句来避免(编程控制)
------------------------------------第五天------------------------------
一、
--String
---replacetrimindexOf
注意字符串本身是否修改
---String相当于C语言中的字符串常量
---Strings1="hello"//char*s1="hello"
---Strings2="hello"//char*s2="hello"
------s1="HELLO"其实s1是新申请内存存储HELLO
--StingBuffer
StringBuffer对象代表一组可改变的Unicode字符序列
(和String不同,不是字符串常量;可存中文)
构造器:
---StringBuffer()创建一个空的字符缓冲,长度为16个字符容量;
---StringBuffer(intcapacity)用指定的初始容量创建一个空的字符缓冲;
---StringBuffer(StringinitString)创建包含initString的字符缓冲,并加上16个字符的备用空间。
---字符串缓冲的修改操作:
append、insert、reverse、setCharAt、setLength,delete,capacity
二、集合类
---泛型(模板类):
数据必须是引用类型
---声明泛型类的方法
修饰符class类名{
}
---定义泛型类的对象
泛型类名<引用类型>变量;
--LinkedListlist1
--GenericDemog1
---ArrayList和LinkedList
比较:
插入和删除操作频繁,用LinkedList;查找、访问元素用ArrayList
方法:
addremoveset
---HashMap
方法:
getputcontainsKey
三、线程
方法一:
定义一个线程类,它继承类Thread并重写其中的方法run()
调用start方法,线程自动执行run
线程类,可以是