Java知识学习资料笔记课堂记录.doc

上传人:laozhun 文档编号:2386946 上传时间:2023-02-17 格式:DOC 页数:57 大小:664KB
返回 下载 相关 举报
Java知识学习资料笔记课堂记录.doc_第1页
第1页 / 共57页
Java知识学习资料笔记课堂记录.doc_第2页
第2页 / 共57页
Java知识学习资料笔记课堂记录.doc_第3页
第3页 / 共57页
Java知识学习资料笔记课堂记录.doc_第4页
第4页 / 共57页
Java知识学习资料笔记课堂记录.doc_第5页
第5页 / 共57页
点击查看更多>>
资源描述

《Java知识学习资料笔记课堂记录.doc》由会员分享,可在线阅读,更多相关《Java知识学习资料笔记课堂记录.doc(57页珍藏版)》请在三一办公上搜索。

1、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 - 边解释边

2、运行 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运行

3、程序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),程序执

4、行。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之间不互相转换

5、,它们在运算时都会转换为int 表数范围大的类型转换为表数范围小的数据类型时,需要进行强制类型转换 多种类型的数据混合运算时,会自动将所有类型转换为最大表数范围的那种类型之后再运算2.3为什么是-124Byte b=122;Byte b2=10;Byte b3=b+b2;B3=-124?原码 反码 补码正数 原=反=补负数 补原码除符号位各位取反+101111010000010101000010000132011111100100000111000010012210132转为byte高三位全部舍弃-124各位取反+12.4取某一位的值或者设置某一位的值一个整数,要取某一位的值为0或为1将该整数

6、与 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

7、 最终结果,将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

8、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):存放字符串常量和静态变量

9、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=li

10、ne.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

11、(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;/第一种实验结论:传入的参数在方法内部的变化不影响调用环境/对于基本数据类型的参数,传入不影响调用环境/值传递m

12、c.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

13、()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.callMeth

14、od(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. 父亲的成员变

15、量默认初始化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 导入代码中需要

16、引入的包Ctrl_shif+f代码格式化3.5接口1.接口存在的意义:就是为了实现多继承 ,更多的是为了扩展,,以不变应万变2.接口是未实现的方法与常量值的集合3.多个无关的类可以实现同一个接口4.一个类可以实现多个无关的接口5与继承关系类似 接口与实现类之间存在多态6.接口之间可以继承7.接口中定义的常量 public static final 这种3.6抽象类1.用abstract关键字修饰的一个类,这个类叫做抽象类,用abstract修饰的一个方法叫做抽象方法.2.含有抽象方法的类必须声明为抽象类,抽象类必须被继承后才能使用,抽象方法必须被子类重写3.如果重写不了,则将该类声明为抽象的4

17、.抽象类不能被实例化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、 理解堆、方法区、栈

18、的区别11、 理解方法调用的时候,值传递原则12、 方法调用的过程,其内存如何变化?13、 什么是方法的重载?14、 对象转型a) 向上转型b) 向下转型(注意其中的风险)15、 override 方法重写(覆盖)a) 子类覆盖(重写)了父类的方法16、 多态a) 子类继承了父类b) 父类的引用指向了子类的对象c) 子类的方法重写了父类的方法d) 我们通过父类的引用去调用那些被重写的方法,虚拟机将在运行的时候确定调用的究竟是哪个方法,是哪个子类的方法(同一个方法调用,有可能调用的真正方法不一样,产生了多态性)17、 构造方法a) 构造方法可以重载b) 子类的构造方法必需先调用父类的构造方法c)

19、 如果没有在子类中显式添加调用父类的构造方法,编译器将默认添加一个调用,以调用父类的无参构造方法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:some

20、Str)c) 静态导入4. 异常4.1异常的分类Erorr 系统错误,往往是虚拟机报出的系统级错误Exception Checked exception 必须处理 Exception及其子类(RuntimeException除外),在编译期就需要处理 Unchecked exception 运行时可能发生的异常,不一定需要处理 RuntimeException及其子类4.2异常处理Trycatch(Exceoption1 e1) /出现Exception1时的处理代码catch(Exception e2) /出现Exception2时的处理代码finaly /关闭或销毁资源对于无法处理的异常,

21、可以向外抛出 方法定义时 throws Exception1 , Exception2程序中可以用 throw new Exception1(“aaa”) 抛出异常原则:捕获时先捕获小异常再捕获大异常 可以用大异常替代小异常,但是不建议这么做4.3重写方法时异常处理 总结,重写方法需要抛出 如果父类(接口)没声明抛出异常 不声明抛出异常 声明抛出任意RuntimeException 如果父类(接口)声明抛出checked exception 与原方法所声明抛出类型一致的异常 子异常 不声明抛出异常 声明抛出任意RuntimeException 如果父类(接口)声明抛出unchecked exc

22、eption 不声明抛出异常 声明抛出任意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.f

23、ill(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.ha

24、shCode(); /返回数组中的下标 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;

25、 2.寻找到数组中计算出的下标的位置,将对象引用存放在数组中3.如果超过当前数组长度(初始为16)的装载因子(0.75)后,则扩大一倍数组(32)4.采用这种存储方式,取元素性能极高 取时,通过对象的HashCode()计算出该对象应该在数组的位置,直接通过下标索引取得,当然,如果该位置存在有多个对象组成的链表,则在确定该位置后依次遍历,所以说,为了减少链表的遍历的时间开销,数组越散越好,最好做到一个数组位置唯一确定一个对象。5.2.3Map1.加入字符串这种类型 以字符串作为key,由于字符串本身重写了HashCode和equals,所以可见的字符串只要相等就会与Map中的存在的关键字冲突,

26、后者会覆盖前者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(),如果重写了,能取出,不重写,取不出Syst

27、em.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通过C

28、lass创建对象实例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();

29、 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

30、,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

31、();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=(

32、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字符流:以字符为基本单元读入或写出

33、: Reader/Writer7.2原始流类针对不同的数据源直接作用于数据源的流,又称节点流 FileInputStream/FileOutputStream 把文件当数据源 ByteArrayInputStream/ByteArrayOutputStream - 把byte当数据源 StringReader/StringWriter 把String当数据源 CharArrayReader/CharArrayWriter 把char当数据源 FileReader/FileWriter 把文件当数据源的Reader/Writer数据源字节流字符流文件FileInputStreamFileOutp

34、utStreamFileReaderFileWriter字节数组ByteArrayInputStreamByteArrayOutputStreamStringStringReaderStringWriter字符数组CharArrayReaderCharArrayWriter原始流类的典型特征是:其构造方法就是用数据源作为参数! FileInputStream/FileOutputStream一般用于操作二进制文件,如影像文件,图片,doc,excel所有存在某种格式的文件 FileReader/FileWriter一般用于操作文本文件7.3Decrator设计模式可以灵活组合多种功能的实现,最

35、典型的特征的是构造对象时传入另外一种功能的对象。s abcdef hgijkl shStringHandlersh03DeleteBlankHandlerTrimStringHandlerWshWsh7.4包装流(处理流) 为了不同的目的,而对原始流进行包装的类,称为包装流(Wrapper Stream),有的地方叫“处理流” Wrapper Stream相关的类,典型的特征是:其构造方法是以InputStream/OutputStream/Reader/Writer作为参数的,由此可知,Wrapper Stream必定持有对另外一个流对象的引用!这另外一个流对象,有可能是原始流对象,也有可能

36、是另外一个包装流对象,这样就会形成层层包装,每一层包装都完成它自己该完成的功能缓冲流:BufferedInputStream/BufferedOutputStream/BufferedReader/BufferedWriter打印流:PrintStream PrintWriter数据流:DataInputStream DataOutputStream对象流:ObjectInputStream ObjectOutputStream转化流:InputStreamReader OutputStreamWriter7.5对象序列化l 如果对象需要序列化,则需要实现Serializable接口 l 序列

37、化时调用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.lea

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号