Java知识学习资料笔记课堂记录.doc_第1页
Java知识学习资料笔记课堂记录.doc_第2页
Java知识学习资料笔记课堂记录.doc_第3页
Java知识学习资料笔记课堂记录.doc_第4页
Java知识学习资料笔记课堂记录.doc_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

java笔记java概述1.1java发展简史及jdk版本1982年成立了sun公司 (stanford university network ),应用于小型机等服务器领域的开发。oak1995年 jdk1.0 1998年 jdk2.0 1999年 javaee 标准推出java 5.0 java 6.02009年 oracle 收购了sun solaris (unix) mysql 1.2java技术特点1.开源1. 简单易用2. 纯面向对象3. 跨平台性 java虚拟机 for linux for windows .class 文件 java (java虚拟机中的一个命令)-.class - 边解释边运行 java程序与 操作系统之间的一个纽带 java普遍被认为是”一次编译,随处运行”。程序代码中不要出现过分依赖某种操作系统特征的代码4. 垃圾回收机制1.3jdk下载与安装1.2.安装3.配置环境变量path环境变量中追加一段 “ c:program filesjavajdk1.6.0_18bin”,注意一定要指到 bin下4.运行javac,进入命令提示选项即可1.4环境变量的说明(path)1.首先会在当前目录寻找该命令2.如果找不到,会在系统环境变量中寻找有无指向该命令的路径3.如果找不到, 会在用户环境变量中寻找有无指向该命令的路径4.如果找不到,提示错误1.5第一个java运行程序class helloworld public static void main(string args) system.out.println(这是第一个应用程序!); 详解过程1. cmd命令行定位到应用程序源文件所在目录下2. javac编译应用程序源文件3. javac verbose显示详细的编译过程4. 当前目录下生成字节码文件 helloworld.class5. java 执行应用程序6. java verbose显示详细的执行过程编译:源文件-字节码指令执行:字节码指令装入内存,字节码校验器对其进行校验,引用到的相关的类的字节码被装入,找到应用程序入口(main),程序执行。1.6java编码约定person1.类名遵守驼峰标识 对于合成单词,每个单词首字母大写2.对于方法 首字母小写 helloworld()3.package 所有的字母全部小写4.成员变量与方法命名一致5.局部变量与方法命名一致6.见名知意2.基础语法2.1直接量和变量char型表示unidcode字符集10001000 1111111188 f f 00012dff014e中88ff2.2基本数据类型转化对于整数直接量默认为int型对于小数直接量默认为double型 byte/short/char -int-long-float-double byte/short/char之间不互相转换,它们在运算时都会转换为int 表数范围大的类型转换为表数范围小的数据类型时,需要进行强制类型转换 多种类型的数据混合运算时,会自动将所有类型转换为最大表数范围的那种类型之后再运算2.3为什么是-124byte b=122;byte b2=10;byte b3=b+b2;b3=-124?原码 反码 补码正数 原=反=补负数 补原码除符号位各位取反+101111010000010101000010000132011111100100000111000010012210132转为byte高三位全部舍弃-124各位取反+12.4取某一位的值或者设置某一位的值一个整数,要取某一位的值为0或为1将该整数与 1左移目标位后 作 & 运算 ,如果结果为 0,则表明该位为0,否则为1如 12 0000 1100 判断第2位的值为1还是01 0000 000112 0000 010012 & 12 0000 0100 最终结果不为0 则12的第2位为1一个整数,要将某一位设置为1将该整数与 1左移目标位后 作 | 运算即可如 12 0000 1100 设置第2位的值为1分析: 既要保持该整数各位不变,又要将目标位设置为1,目标位只可能为0或1,要将目标位设置为1,则只需要将该整数与 目标位为1,其它位为0的一个数作 | 运算1 0000 000112 0000 010012|12 0000 0101 最终结果,将12的第2位设置为1一个整数,要将某一位设置为0 将该整数与 1左移目标位后 取反 作 &运算即可如 12 0000 1100 设置第2位的值为0分析: 既要保持该整数各位不变,又要将目标位设置为0,目标位只可能为0或1,要想得到结果,选取可能参与运算的数应为目标位为0,其它各位为1,且两个操作数作 & 运算1 0000 000112 0000 010012 1111 1011 12 & 1 package-protected-public 清一色的采用public 虽然也可以实现开发 但是尽可能的权限越严格越好关于protected的实验父类:animal proeteced string name=”;子类: dog 能够继承protected的成员变量3.3.3attribute和property 1所有的成员变量均需要设置为对外不可见 2提供一组public的setters和getters完成对成员变量的读写 3成员变量就是attribute 4 而setters和getters决定的名称为property(就是去掉set部分后单词首字母小写后的名称) 5再次强调编码约定3.3.4运行时内存分布状况1.java栈(stack):存放局部变量,一个方法开辟一个栈帧2.堆(heap):存放引用类型的对象3.方法区(method area):存放字符串常量和静态变量4.pc寄存器:存放指令执行到哪一条person p=new person()1.java栈中为main方法开辟新的栈帧2.java栈中存放局部变量p,此时p的值为空3.等式右边产生新的对象,在堆内存中分配person对象的地址,同步成员变量赋初值4.将对象的地址赋值给局部变量p5.main方法执行完,栈帧弹出6.在某一时刻,堆内存中的对象被垃圾回收器回收public static void main(string args) line line=new line(); line.setstartpoint(1, 2); line.setendpoint(3, 4); string s1=line.printstartpoint(); system.out.println(s1); string s2=line.printendpoint(); system.out.println(s2);栈堆方法区args:?line:0x00001start:?end:?x:1y:2p1xvalue:1yvalue:2xvalue:3yvalue:4s1“起点是1,2”“终点是3,4”s23.3.5值传递的原则package org.leadfar;public class methodclient public void callmethod(int i)system.out.println(i);i=20;public void calldog(dog d)system.out.println(d.getage();/dog dog=new dog();/dog.setage(5);d.setage(5);public void calldog2(dog d)d=new dog();d.setage(5);public static void main(string args) methodclient mc=new methodclient();int a=100;/第一种实验结论:传入的参数在方法内部的变化不影响调用环境/对于基本数据类型的参数,传入不影响调用环境/值传递mc.callmethod(a);system.out.println(a=+a);/第二种:传入的参数在方法内部的变化影响调用环境/对于引用类型,传入影响调用环境/引用传递dog d=new dog(); d.setage(1);/但是,由于引用传递传的是地址,而地址本身就是一个值,所有从本质上讲,java遵循的都是值传递原则mc.calldog(d);system.out.println(d.age=+d.getage();3.3.6转型与多态三个基本条件:要有继承关系,子类需要重写父类方法,父类引用指向子类对象package .leadfar; class a public void m1()system.out.println(a.m1()被调用了);public void m2()system.out.println(a.m2()被调用了);m1();class b extends apublic void m1()system.out.println(b.m1()被调用了);public void m3()system.out.println(b.m3()被调用了);public class c public static void main(string args)a a=new b(); /父类引用指向字类对象 a.m2(); /调用子类重写的方法c.callmethod(a); 实际对象为b类型static void callmethod(a a)if( a instanceof b) /判断如果为b类型,则可以执行 instanceof是为了解决非b类型对象非法传入b b=(b)a;b.m3();b.m2();3.3.7对象构造过程dog d=new dog();1. 静态变量或静态代码块执行 (依次执行类继承树由根到子的静态变量或静态代码块)2. 调用dog类的构造方法,在构造方法里第一句调用父类的构造方法,直到父类到根3. 在根里成员变量默认初始化 4. 在根里成员变量显示初始化5. 在根里执行构造方法中的代码 object的对象6. 父亲的成员变量默认初始化7. 父亲的成员变量显示初始化8. 父亲构造方法中的代码 -animal的对象9. 自己的成员变量默认初始化10. 自己的成员变量显示初始化11. 自己构造方中的代码 -dog 对象 d产生this,super结论:1. 构造方法中一定要存在super调用,,无论是直接的还是间接的2. super,this调用只能出现在构造方法的第一句 3. super与this()不能出现在一起3.4eclipse的使用选择一个java工程起工程名,点击configure jres引入jdk 定位到jdk的根路径选择jdk设置快捷提示如果”.” 不提示ctrl +shift +o 导入代码中需要引入的包ctrl_shif+f代码格式化3.5接口1.接口存在的意义:就是为了实现多继承 ,更多的是为了扩展,,以不变应万变2.接口是未实现的方法与常量值的集合3.多个无关的类可以实现同一个接口4.一个类可以实现多个无关的接口5与继承关系类似 接口与实现类之间存在多态6.接口之间可以继承7.接口中定义的常量 public static final 这种3.6抽象类1.用abstract关键字修饰的一个类,这个类叫做抽象类,用abstract修饰的一个方法叫做抽象方法.2.含有抽象方法的类必须声明为抽象类,抽象类必须被继承后才能使用,抽象方法必须被子类重写3.如果重写不了,则将该类声明为抽象的4.抽象类不能被实例化5.抽象方法只需声明,不需要实现6.抽象类中可以包含非抽象的方法3.7总结1、 对象包括什么?a) 状态b) 行为2、 什么是抽象?3、 类包括什么?a) fieldb) method4、 如何通过类创建一个对象?a) 用new关键字创建对象5、 有哪几种可见性?它们分别表示什么意思?6、 attribute/property之间的区别是什么?a) attribute一般定义为什么样的可见性?7、 如果在一个类中,要用到另外一个包中的类,必须?a) 用import语句来引入那个类8、 实例变量与类变量的区别是什么?9、 实例变量与类变量的初始化值?10、 理解堆、方法区、栈的区别11、 理解方法调用的时候,值传递原则12、 方法调用的过程,其内存如何变化?13、 什么是方法的重载?14、 对象转型a) 向上转型b) 向下转型(注意其中的风险)15、 override 方法重写(覆盖)a) 子类覆盖(重写)了父类的方法16、 多态a) 子类继承了父类b) 父类的引用指向了子类的对象c) 子类的方法重写了父类的方法d) 我们通过父类的引用去调用那些被重写的方法,虚拟机将在运行的时候确定调用的究竟是哪个方法,是哪个子类的方法(同一个方法调用,有可能调用的真正方法不一样,产生了多态性)17、 构造方法a) 构造方法可以重载b) 子类的构造方法必需先调用父类的构造方法c) 如果没有在子类中显式添加调用父类的构造方法,编译器将默认添加一个调用,以调用父类的无参构造方法18、 this是动态绑定的19、 private方法和static方法是静态绑定的20、 super调用是静态绑定的21、 类的初始化过程22、 finalize()方法与垃圾回收23、 final关键字24、 接口与抽象类25、 object类中可被重写的方法a) equals 注意理解equals和=的区别b) hashcodec) tostringd) clone26、 jdk1.5以后版本的新语法a) 可变参数的方法(string)b) 增强的for循环 for(string s:somestr)c) 静态导入4. 异常4.1异常的分类erorr 系统错误,往往是虚拟机报出的系统级错误exception checked exception 必须处理 exception及其子类(runtimeexception除外),在编译期就需要处理 unchecked exception 运行时可能发生的异常,不一定需要处理 runtimeexception及其子类4.2异常处理trycatch(exceoption1 e1) /出现exception1时的处理代码catch(exception e2) /出现exception2时的处理代码finaly /关闭或销毁资源对于无法处理的异常,可以向外抛出 方法定义时 throws exception1 , exception2程序中可以用 throw new exception1(“aaa”) 抛出异常原则:捕获时先捕获小异常再捕获大异常 可以用大异常替代小异常,但是不建议这么做4.3重写方法时异常处理 总结,重写方法需要抛出 如果父类(接口)没声明抛出异常 不声明抛出异常 声明抛出任意runtimeexception 如果父类(接口)声明抛出checked exception 与原方法所声明抛出类型一致的异常 子异常 不声明抛出异常 声明抛出任意runtimeexception 如果父类(接口)声明抛出unchecked exception 不声明抛出异常 声明抛出任意runtimeexception5. 集合5.1数组a0a1a2a3a0123a15678a2a31、arrays.binarysearch()必须先排序,他返回的是一个int类型的数字。代表要查找的元素在数组中的索引值。2、arrays.copyof(a,int b).其中a代表要拷贝的数组,b代表要拷贝多少个3、arrays.tostring()将数组元素一一打印出来4、arrays.copyofrange(a, 1,3) a代表数组名称。1:代表从索引为1的位置开始拷贝,且包括该位置。 3:代表拷贝到的位置,但是不包括该位置。5、arrays.fill(a,12).a:代表填充数组的名称,12:代表用什么填充数组中的每一个元素5.2集合5.2.1常用集合类collectionlistsetarraylistlinkedlisthashsetmaphashmappropertiestreemaphashtablelinkedhashmap5.2.2hashmap存储解释1.当添加一个对象时,通过该对象的hashcode计算出应该存储的数组位置的下标public v put(k key, v value) if (key = null) return putfornullkey(value); int hash = hash(key.hashcode(); /返回数组中的下标 int i = indexfor(hash, table.length); for (entry e = tablei; e != null; e = e.next) object k; if (e.hash = hash & (k = e.key) = key | key.equals(k) v oldvalue = e.value; e.value = value; e.recordaccess(this); return oldvalue; modcount+; addentry(hash, key, value, i); return null; 2.寻找到数组中计算出的下标的位置,将对象引用存放在数组中3.如果超过当前数组长度(初始为16)的装载因子(0.75)后,则扩大一倍数组(32)4.采用这种存储方式,取元素性能极高 取时,通过对象的hashcode()计算出该对象应该在数组的位置,直接通过下标索引取得,当然,如果该位置存在有多个对象组成的链表,则在确定该位置后依次遍历,所以说,为了减少链表的遍历的时间开销,数组越散越好,最好做到一个数组位置唯一确定一个对象。5.2.3map1.加入字符串这种类型 以字符串作为key,由于字符串本身重写了hashcode和equals,所以可见的字符串只要相等就会与map中的存在的关键字冲突,后者会覆盖前者2.如果引用类型作为key,且重写了hashcode和equalse方法,则根据重写的规则判断是否冲突,是否后者覆盖前者map map =new hashmap();map.put(new person(1,张1), new person(1,张1);map.put(new person(2,张2), new person(2,张2);map.put(new person(3,张3), new person(3,张3);p=(person)(map.get(new person(1,张1); /通过hashcode()和equals(),如果重写了,能取出,不重写,取不出system.out.println(p.getid()+_+p.getname();5.2.4map示例解析persons111112222cqbmyjsbmyj“流氓”“小马哥”6. 反射机制初步6.1class实例化1.通过实例生成class实例string s = abc;class clazz=s.getclass();2.通过类名生成class实例class clazz=string.classclass clazz=java.util.date.class3.通过class.forname()class clazz=class.forname(java.util.date);6.2通过class创建对象实例string s=org.leadfar.person;try class clazz=class.forname(s);person p=(person)clazz.newinstance();/实际上是在调用person的无参的构造器p.setid(1);p.setname(张三);p.setsex(男);p.setbirthday(new date();system.out.println(p); catch (classnotfoundexception e) / todo auto-generated catch blocke.printstacktrace(); catch (instantiationexception e) / todo auto-generated catch blocke.printstacktrace(); catch (illegalaccessexception e) / todo auto-generated catch blocke.printstacktrace();6.3通过反射取得其成员1.取方法l getmethods() /取得所有的方法,包括继承的父类的方法,不包括非public的l getdeclaredmethods()/取得本类中所有的方法,不包括继承的父类的方法l getmethod(string,class) /取得指定的方法,传递方法名称及参数类型,包括继承的方法l getdeclaredmethod(string,class) /取得指定的方法,传递方法名称及参数类型,包括继承的方法,不包括继承方法针对method对象取各种值method setsexmethod=clazz.getdeclaredmethod(setsex,string.class);system.out.println(方法名称:+setsexmethod.getname();system.out.println(修饰符:+modifier.tostring(setsexmethod.getmodifiers();system.out.println(参数类型:);class clazzs=setsexmethod.getparametertypes();for (int i = 0; i clazzs.length; i+) system.out.println(clazzsi.getname();system.out.println(返回类型:+setsexmethod.getreturntype().getname();2.取构造器及取字段与上类似3.方法调用string s=org.leadfar.person;class clazz=class.forname(s);person p=(person)clazz.newinstance();method m=clazz.getmethod(setid, int.class);m.invoke(p, 10);method m1=clazz.getdeclaredmethod(m1);m1.setaccessible(true);/设置可见m1.invoke(p);system.out.println(p);7. 流7.1基本流类四大基类:inputstream/outputstream/reader/writer字节流:以字节为基本单元读入或写出:inputstream/outputstream字符流:以字符为基本单元读入或写出: reader/writer7.2原始流类针对不同的数据源直接作用于数据源的流,又称节点流 fileinputstream/fileoutputstream 把文件当数据源 bytearrayinputstream/bytearrayoutputstream - 把byte当数据源 stringreader/stringwriter 把string当数据源 chararrayreader/chararraywriter 把char当数据源 filereader/filewriter 把文件当数据源的reader/writer数据源字节流字符流文件fileinputstreamfileoutputstreamfilereaderfilewriter字节数组bytearrayinputstreambytearrayoutputstreamstringstringreaderstringwriter字符数组chararrayreaderchararraywriter原始流类的典型特征是:其构造方法就是用数据源作为参数! fileinputstream/fileoutputstream一般用于操作二进制文件,如影像文件,图片,doc,excel所有存在某种格式的文件 filereader/filewriter一般用于操作文本文件7.3decrator设计模式可以灵活组合多种功能的实现,最典型的特征的是构造对象时传入另外一种功能的对象。s abcdef hgijkl shstringhandlersh03deleteblankhandlertrimstringhandlerwshwsh7.4包装流(处理流) 为了不同的目的,而对原始流进行包装的类,称为包装流(wrapper stream),有的地方叫“处理流” wrapper stream相关的类,典型的特征是:其构造方法是以inputstream/outputstream/reader/writer作为参数的,由此可知,wrapper stream必定持有对另外一个流对象的引用!这另外一个流对象,有可能是原始流对象,也有可能是另外一个包装流对象,这样就会形成层层包装,每一层包装都完成它自己该完成的功能缓冲流:bufferedinputstream/bufferedoutputstream/bufferedreader/bufferedwriter打印流:printstream printwriter数据流:datainputstream dataoutputstream对象流:objectinputstream objectoutputstream转化流:inputstreamreader outputstreamwriter7.5对象序列化l 如果对象需要序列化,则需要实现serializable接口 l 序列化时调用objectoutputstream.writeobject();l 反序列化时调用objectinputstream.readobject();l 如果你不想序列化某个属性,则用transient修饰l 序列化后,如果类发生了变化,则不能够反序列化l 反序列化时,不调用类的构造方法l 如果你确实想类发生了变化,还想反序列化成功,加入n private static final long seriaversionuid =1l8. 线程8.1创建线程1.继承threadpackage org.leadfar;public class mythread extends thread overridepublic void run() for (int i = 0; i 1000; i+) system.out.println(mythread:+i);public static void main(string args) thread t=new mythread();t.start(); /线程启动,这个线程准备好了,等待jvm的调用(jvm的时间片的分配)for (int i = 0; i 1000; i+) system.out.println(main:+i);2.实现runnablepackage org.leadfar;public class mythread02 implements runnable overridepublic void run() for (int i = 0; i 1000; i+) system.out.println(mythread02:+i);public static void main(string args) runnable r=new mythread02();thread t=new thread(r);t.start();for (int i = 0; i 1000; i+) system.out.println(main:+i);8.2线程命名1.继承thread类 增加构造方法public mythread06(string name)super(name); /一定要加2.实现runnable接口runnable r=new mythread04();thread t=new thread(r,辅线程1);t.start();8.3线程控制方 法说 明isalive()判断线程是否还“活”着,即线程是否还未终止。getpriority()获得线程的优先级数值setpriority()设置线程的优先级数值thread.sleep()将当前线程睡眠指定毫秒数join()调用某线程的该方法,将当前线程与该线程“合并”,即等待该线程结束,再恢复当前线程的运行。thread.yield()让步,即暗示我的工作做的差不多了,可以让出cpu,其它线程可以使用它了,但不绝对,没有什么机制能够保证这一点。wait()当前线程进入对象的wait pool。notify()/notifyall()唤醒对象的wait pool中的一个/所有等待线程。thread.currentthread()得到当前线程对象8.4线程同步1.sychonized可以修饰方法,代码块2.尽可能的去修饰代码块,让其同步的代码的粒度越细越好3. sychonized修饰的代码块,一旦一个线程介入,自动拥有该方法所在对象上的一把锁,并且对这块代码块加锁,加锁后,其它线程只有等到该锁释放,才可介入.4.当一个类中有一个sychonized方法或代码块被加锁后,则其它的方法或代码块都得不到执行。5.锁是加到对象上的,而且一个对象永远只有一把锁.6.对于静态方法加锁不是加在代码所在的对象上,而是加在与之对应的class类型的对象上。8.5死锁package org.leadfar;public class deadlock extends thread private static object o1 = new object();private static object o2 = new object();private boolean flag = false;public deadlock(boolean flag) this.flag = flag;overridepublic void run() if (flag) synchronized (o1) try thread.sleep(1000); catch (interruptedexception e) / todo auto-generated catch blocke.printstacktrace();synchronized (o2) system.out.println(11111111111111111111111111111111);elsesynchronized (o2) try thread.sleep(1000); catch (interruptedexception e) / todo auto-generated catch blocke.printstacktrace();synchronized (o1) system.out.println(22222222222222222222222222222222222222);public static void main(string args) new deadlock(true).start(); /先o1后o2new deadlock(false).start(); /先o2后o18.6线程协作wait():进入等待区,释放锁wail(1000):进入等待区,释放锁,1000ms后被唤醒notify():唤醒等待区的某一个线程notifyall():唤醒等待区中所有的线程10 网络编程1、 tcp编程 面向连接、可靠a) 发送数据时,需建立连接b) 服务器端通过serversocket(需指定端口来创建)来accept客户端的socketc) 客户端通过创建socket(需指定服务器地址以及服务器的端口)来跟服务器建立连接d) 一旦客户端与服务器建立连接,服务器端即可得到一个socket对象,这个socket对象负责和客户端的socket对象进行通信e) 服务器端和客户端均可通过socket的getinputstream和getoutputstream来接收及发送数据2、 可在服务器端针对每一个客户端连接的socket对象,创建一个线程去处理3、 system.in用于接收控制台输入4、 udp编程 非面向连接,不可靠a) 发送方创建datagramsocket对象(可指定发送端口)b) 发送方创建datagrampacket对象,这是一个数据包,在创建这个对象的时候,需指定i. 这个数据包所包含的数据ii. 这个数据包要发送到哪台机器(即目标机器地址),或者指定发送到整个局域网(网络广播)iii. 这个数据包要发送到目标机器的哪个端口c) 发送方调用datagramsocket对象的send方法将数据包发送出去d) 接收方也是创建datagramsocket对象(指定要从哪个端口接收数据,应与发送方创建的数据包中指定的端口一致)e) 接收方创建datagrampacket对象(需指定一个内存缓冲区,即byte数组)f) 接收方调用datagramsocket对象的receive方法,将接收到的数据存入datagrampacketg) 接收方从datagrampacket中取出数据11 gui11.1guigraphical user interfacel awt (抽象窗口工具集 ) abstractwindow toolkit 为简单的applet程序设计 awt没有提供足

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论