java课堂笔记().doc_第1页
java课堂笔记().doc_第2页
java课堂笔记().doc_第3页
java课堂笔记().doc_第4页
java课堂笔记().doc_第5页
已阅读5页,还剩106页未读 继续免费阅读

下载本文档

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

文档简介

目录第一课 Java技术的历史2Java的历史2Jdk的安装2Java运行环境的配置2第二课 Java程序2类2变量3变量的类型转换4逻辑运算符6第三课 Java分支结构9If9Switch10While10*System.in.read()12数组12第四课 类和对象14类和对象14封装性(private)15构造方法:16匿名对象18第五课 Java方法19递归19方法重载20Java新技术21第六课 关键字this、static22This22Static24第七课 内部类、继承、封装、方法的重写25单态设计模式25对象数组26程序的代码块27内部类29封装31继承31方法的重写33第八课 final、抽象类、接口、多态35final关键字35抽象类35接口36对象转型和instanceof关键字37多态(动态绑定,池绑定)39第九次课 包、异常42包421.5的新特性:静态导入43异常44异常的处理机制44第十次课 finally、throw、throws和自定义异常47finally47throws子句47throw语句48自定义异常50垃圾回收机制:finalize()方法52第十一次课 线程、线程同步53线程的概念53线程的两种创建和启动方法53Runnable与Thread的区别57线程同步59死锁63第十二次课 进程通信65后台线程65线程的优先级67线程的通信68第十三次课 集合71集合类型72Iterator接口76第十四次课 IO系统78 第十五次课 网络基础.9第一课 Java技术的历史Java的历史Jdk的安装Java运行环境的配置这里,安装在D:java目录下,安装成功后,配置java_home、path、classpath的路径。方法一:设置WindowsXP系统环境变量 右击“我的电脑”图标,在弹出的快捷菜单中选择“属性”命令,弹出“系统属性”对话框,选择“属性”选项卡中的“高级”选项,弹出“环境变量”对话框。 在“系统变量”选项组中,新建变量java_home,变量值设置为:D:java 在“系统变量”选项组中,编辑变量path,在变量值的最前面加上:%java_home%bin; 在“系统变量”选项组中,新建变量classpath,变量值设置为:.%java_home%lib;方法二:在DOS命令行窗口cmd(操作系统会介绍)java 测试有无安装javajava version 查看java版本set path 查看是否有路径set path=D:javabin 设置path路径set classpath 查看是否有classpath路径set classpath=D:javalib 设置classpath路径在DOS命令行下运行java例:javac h.java 编译java h 运行工具:eclipse Myeclipse第二课 Java程序类1、类封装了一类对象的状态和方法,是用来定义对象的模板。基本格式如下: Class 类名 变量; 方法;例:class Hello /第一个字母习惯大写 public static void main(String args)System.out.println(“Hello”); 运行程序时输入的是:java 类名(因此必须注意文件名与类名不同的情况)。结果:小结:public类,类名必须与文件名一致。 一个文件中若有多个类,在编译时则会生成相应多个class文件(即字节码程序) 在一个.java文件中,只能有一个public类,且类名与public类名一致2、 注释语句作用:解释说明,方便用户; 调试程序3种注释形式:a. / 单行注释,调试程序时使用b./* */多行注释,不可嵌套多行注释,可嵌套单行注释c./* 生成java解释文档 */class Test01/此为单行注释,从/到本行结束,所有字符会被编译器忽略/*此为多行注释,/*/之间的说有字符会被编译器忽略*/*此为多行注释,之间的所有字符会被编译器忽略,且会作为JavaDoc文档的内容/pubic static void main( Stringargs)System.out.println(“注释演示”);结果:3. 输出形式:System out println (“Hello”); /有换行System out print (“Hello”); /没有换行因此:System.out.println(“Hello”); = System out print (“Hellon”);变量程序的基本功能就是处理数据,程序用变量来表示数据类型 字节byte取值范围记:java默认整型int、默认小数型double变量的分类接口interface基本类型数据类型布尔型浮点型整数型字符型TRUEFALSEFloat 4byteDouble 8bytebyte 1byteShort 2byteInt 4byteLong 8byteChar 2byte引用类型类(包括字符串class)数组array2(-38)238和-238-2(-38)2(-308)2308和-2308-2(-308)-27(27-1)-215(215-1)-231(231-1)-263(263-1)065535变量的类型转换1.变量命名规则:标识符的首字符必须是字母,下划线“_”, 美元符号“$”。 标示符不能用关键字命名,其中Java有49个关键字,以及goto和const两个保留字。True 和false不是保留字,但也不能作变量,因为有唯一的编译意义。2. 类型转换隐式(自动):从精度小往精度大的数据类型转换;显式(强制):从精度大往精度小的数据类型转换。(这种转换会损失数据的精度,所以需要显式转换)(类型名)转换值小结:隐式转换:byte -short(或 char )- int -long -float -double 如果碰到字符串类型,那么所有类型都要向字符串类型转换3.字符常量用单引号表示,字符串常量用双引号表示4.一个小数后面没有f,则默认为double型,若要表示float型,需加f例21class Test21public static void main(String args) int x=266;/二进制1 0000 1010byte y=(byte)x; /*强制转换,byte占八位,取二进制1 0000 1010后八位即0000 1010,十进制表示10*/System.out.println(x= +x);System.out.println(y= +y); 运行结果: 注意:266超过byte类型的数据的最大值,造成溢出,显式转换后,损失了精度数值的溢出3.数据溢出例:22求整型的最大值、最小值class Test22public static void main(String args) int max=Integer.MAX_VALUE; /获取INT型数据的最大值 int min= Integer.MIN_VALUE; /获取INT型数据的最小值 System.out.println(max); System.out.println(max+1); System.out.println(min); System.out.println(min-1); 运行结果: 小结:溢出时, Max+1 最小; Min-1 最大:class Test23public static void main(String ar) int c=12; long d=66666; float f=1e-20f; double g=3.14e-300; double result=f*g; System.out.println(f=+f); System.out.println(g=+g); System.out.println(result=+result); g=1234.123456789; c=(int)d; /在int范围,原样输出 f=(float)g; System.out.println(c=+c); System.out.println(d=+d); System.out.println(f=+f); System.out.println(g=+g); 运行结果: 4.变量的生命周期 变量可分为: 成员变量:在类中声明,它的作用域是整个类 局部变量:在一个方法或一个代码块声明,它的作用域是该方法或该代码块 方法参数:它的作用域是该方法 异常处理参数:变量的作用域决定了生命周期。class Test24 int a;/成员变量public static void main(String args) int x=23;/局部变量,其作用域为该main方法/int x=23; /*局部变量,其作用域是该代码块,由于该代码块在main方法内,所以这里定义的x会与上面定义的x冲突*/System.out.println(x); /复合语句System.out.println(x);运行结果:小结:复合语句的变量到复合语句外便失效。 复合语句外面和里面不能重复定义同一个变量。逻辑运算符1. 运算符(/,%)小结:取模运算(%),负号在模数上时,忽略不计; 取整符号(/)的运算特点。例:09的不断循环class Test25public static void main (String ar) int x=0; while(true) x=(x+1)%10; / %取模 System.out.println(x); 例24:有x个人,6人一房,求房数。 class Test26 public static void main(String ag) int x=Integer.parseInt(ag0); /给定义的变量n赋予初值 int y=(x+5)/6; /取整 System.out.println(y); class Test27 public static void main(String args) int x=Integer.parseInt(args0);int y= - x%2; System.out.println(y); 运行结果:(输入java Test27 99)/使用了命令行参数的模式,创建了一个string args变量 -1 (输入java Test27 100) 0 class Test28 public static void main(String args) int x=Integer.parseInt(args0); int y=x%-2; System.out.println(y); 运行结果:(输入java Test28 99) 1 (输入java Test28 100) 0 小结:%对“-”的处理,如果是在分子上,可见该式子看成-(x%2),如果在分母上,这忽略不计2.&与&的区别&:按位与,不管第一个条件为真为假,都必须判断第二个条件&:当第一个条件为真时,才判断第二个条件的真假,如果第一个条件为假,则整个式子直接返回flase;public class Test29 public static void main(String args)int x=1,y=0;if(x!=1&x/y=0)/编译通过/if(x!=1&x/y=0)/编译错误System.out.println(x);else System.out.println(y);结果:3. “+”的作用: 字符串中的连接符:第一个“+”运算符做的是字符连接操作时,所有数据向字符串类型转换 运算相加:第一个“+”运算符做的是运算相加(即有数值类型数据参加运算),所有数据向int型转换 例:class Test210 public static void main(String args) System.out.println(a+1+ ); System.out.println( +(a+1); System.out.println( +a+1); System.out.println(a+1); 运算结果: 4. 比较操作符(, =, = =, !=)小结:用来比较两个值的关系,运算结果是boolean型。 比较操作符的结合方向是从左到右。 “= =”和“!=”的操作元既可以是基本类型,也可以是引用类型。5. 位运算符(&,|,,”是逻辑移位运算。小结:对操作元进行移位运算后,并没有改变操作元本身的数据。移位一定在有限范围 对于“”算术右移位运算的规则:右移N位,相当于除以2N 方法:将操作数的二进制位向右移N位; 高位补零(原为正数),高位补1(原为负数)。 对于“”算术左移位运算的规则:左移N位,相当于乘以2N 方法:将操作数的二进制位向左移N位; 低位补零。 对于“”无符号右移位运算的方法: 将操作数的二进制位向右移N位; 高位补零,零扩展。 对于低于int型的操作数将先自动转换为int型,再进行移位运算。根据位运算符的运算特点,求解特殊的运算。6.逻辑操作符(&,&,|,|,!)“&”和“|”是短路操作符,“&”和“|”是非短路操作符。小结:对于“&”和“|”,如果能根据操作符左边的布尔表达式就能推算出整个表达式的值,此时便不再执行操作符右边的布尔表达式。 对于“&”和“|”,则始终要执行操作符两边的布尔表达式。 短路或“|”要求两个操作数(布尔操作数)都要有意义。例:求2x,用System.out.println(1x);移位要注意溢出问题。例:class Test211 public static void main(String args) int x=3,y=6; System.out.println(x|y); /按位或,两位二进制代码对应同为0时,对应为0,其余为1 System.out.println(x&y); /按位与,两位二进制代码对应同为1时,对应为1,其余为0 System.out.println(xy); / 按位异或,两位二进制代码对应不相同时,对应为1,相同则为0 System.out.println(y); /二进制取反加一 结果:又例:class Test212 public static void main(String args) byte j=42; byte j1=(byte)(j1); /84 byte j2=(byte)(j2); /168byte j3=(byte)(j3); /336 System.out.println(j1);System.out.println(j2);System.out.println(j3); 结果:(溢出,因为BYTE的范围从-128127)第三课 Java分支结构If1、 if的四种结构:(1) if(2) ifelse(3) ifelse ifelse if(else)(4) if ifelseelseifelse小结:if后面的表达式必须是布尔表达式; If后面的else不是必须的; If或else语句的程序代码块中有多条语句,则必须放在大括号中。Switch1、 switch的格式:switch(n) /n表达式须是byte,short,char,int型,新版的也支持float型case : break;/case可有swith嵌套 case : break; case : break; default:/最多只有一个default字句,且可选小结:switch语句可以嵌套,嵌套的复合语句相当于一句话; Switch()中的表达式必须是byte,short,Char,Int型;在switch语句中最多只有一个default子句,且该子句是可选的;如果switch表达式与某个case表达式匹配,或者与default匹配,就从case子句或default子句开始执行,如果遇到break,则退出整个switch语句,否则依次执行下面的语句。 public class Test301 public static void main(String args) int x=3,y=2; switch(x) case 1:System.out.println(x=1);break; case 2:System.out.println(x=2);break; case 3:System.out.println(x=3);break; default: System.out.println(x=?); 运行结果:While1、 while的结构(1) while先判断后做(2) dowhile先做循环再判断注意:while(dowhile)的循环体可以为空; dowhile语句都会至少执行一次循环体,然后再判断循环条件。例:class Test302 public static void main(String args) int x=0,sum=0; while(x=10) sum+=x; x+; System.out.println(“sum=+sum); 结果:class H1/代码可能有误public static void main(String args) int x=97; tryx=System.in.read(); /从键盘输入 catch(Exception e) while(x!=h) System.out.println(x); tryx=System.in.read(); catch(Exception e) 结果:j 106 13(回车) 10(换行)class Test304/代码可能有误 public static void main(String args) int x; tryx=System.in.read(); catch(Exception e) while(x!=h) System.out.println(char) x);/强制转换 try(x=System.in.read();) catch(Exception e) 结果:j j2、 跳转语句:(1) break:从switch语句、循环语句等代码块中退出;(2) continue:跳过本次循环,执行下一次循环或循环体。 *System.in.read()System.in.read(): 作为整数读取的字符,范围在 0 到 65535 之间 (0x00-0xffff),如果已到达流的末尾,则返回 -1。class Text305 public static void main(String args) int x=97;doSystem.out.println(char)x);tryx=System.in.read();catch (Exception e)while (x!=h);运行结果:在读取输入的字符时,有可能出现异常,所以必须用trycatch语句捕获异常。否则不能通过编译数组数组时相同类型的元素的集合,在内存中连续存储。格式:数组名字= new 数组元素的类型数组元素的个数空指针异常,数据成为垃圾String a=new String2; /new运算符分配了2个String引用变量组成的数组的内存存储空间。调用了 /String默认构造函数2次。class Xifloat height; String head, ear; void speak(String S) System.out.println(S); public class Text306public static void main(String args ) Xi zhou; /声明对象 zhou=new Xi(); /为对象分配内存,使用new运算符和默认的构造方法 1、创建数组和初始化数组数组是一种引用类型,开辟了栈内存和堆内存;用new来创建,数组的大小在堆内存中申请;引用数组元素通过数组名【下标】,且数组的释放由java虚拟机完成。小结:一维数组的声明:类型 数组名; 数组声明后不能被访问,因为未为数组元素分配内存空间; 对静态数组赋值时不要声明数组大小; NULL,此时引用变量没有指向。例: class Text307一维数组public static void main(String args) int a=new int1,2,3,5; /静态赋值, 不能写大小 int b=new int10; b2=3; int c=new int2; c0=new int1,2,3; c1=new int1; c10=10; a for(int i=0;ia.length;i+)/数组长度x.length,是属性栈堆 System.out.print(a+i+=+ai+ ); for(int i=0;ib.length;i+) System.out.print(b+i+=+bi+ ); for(int i=0;ic.length;i+)/二维数组,引用的引用(句柄),c.length一维长度 二维数组for(int j=0;jci.length;j+)/ci.length二维长度 System.out.print(c+i+j+=+cij+ ); 结果:a0=1 a1=2 a2=3 a3=5 b0=0 b1=0 b2=3 b3=0 b4=0 b5=0 b6=0 b7=0 b8=0 b9=0 c00=1 c01=2 c02=3 c10=102、数组操作:排序用sort方法,即java.util.Arrays.sort(a);对数组a进行排序。一维数组的复制:System.arraycopy(object src, int srcPos, object dest, int destPos, int length).命令行参数是java应用程序的主方法。小结:sort方法实际上是冒泡法; 一维数组的复制前提是object dest(目的数组)也开辟了内存空间; 命令行参数用空格将参数分开。例:class Test308public static void main(String args) int a=new int1,2,7,5; int b=new int5; System.arraycopy(a,1,b,0,2); for(int i=0;ib.length;i+) System.out.print(b+i+=+bi+ ); System.out.println(args1+args2);结果:第四课 类和对象类和对象类是用来定义对象的模板。当使用一个类创建了一个对象时,也相当于给出了这个类的一个实例。因此,类是一个抽象的概念,对象这是类的一个具体实例。方法存放在全局代码区中。注意:C是面向过程的:重在解决问题的过程;Java是面向对象的:重在描述某个事物在整个问题的步骤中的行为。其中:OOA:面向对象的分析;OOD:面向对象的设计;OOP:面向对象的程序。比较面向过程和面向对象:(1) 面向过程:person() char name12; int age; talk() (2) 面向对象: person String name; int age;void talk() 属性、方法都是类的成员(变量)小结:产生一个对象; 产生多个对象:如: Person per = new Person(); Person per1 = new Person(); 对象之间没有联系;对象之间可以相互赋值(对象引用的传递),如:Per1 =null;Per1 =per; /此时两个引用指向同一个堆内存。(对象赋值后之前已生成的空间会自动断开)例:class PersonString name; /成员变量,静态属性int age; /类成员变量,有默认初始值void talk() /方法习惯小写,动态属性 int age=30; /int age;是错误的,要初始化System.out.println(my name is:+name+i am:+age);class Apublic static void main(String agrs) Person per=new Person(); =zhangsan; per.age=10; per.talk();运行结果:小结:面向对象编程三大特点:封装性,继承性、多态性封装性(private)其核心思想史将数据和对数据的操作封装在一起。封装是指隐藏对象的属性和实现细节,仅仅对外公开接口。Java主要通过访问控制机制来进行封装,这种机制能控制对象的属性和方法的可访问性。4种访问控制级别:public:对外公开,访问级别最高;protected:只对同一个包中的类或者子类公开;默认:只对同一个包中的类公开;private:不对外公开,只能在对象内部访问。一般静态属性会加保护private,可以防止使用者错误地修改属性。而对其输入所实施的保护可以在各个方法中添加条件,从而控制输出。公有的方法去引用,如:setter getter例:class Personprivate String name;private int age;/私有类,在其他类不运行public void setName(String m) /方法名首字符习惯小写 name=m;public void setAge(int n) if(n180) /控制输出条件 System.out.println(error); else age=n;public String getName()/与public void setName(String m)成对出现 return name;public int getAge()/与public void setAge(int n)成对出现return age;void talk() System.out.println(my name is:+getName()+ +i am:+getAge();class Cpublic static void main(String agrs) Person per=new Person(); per.setName(zhangsan); per.setAge(200); per.talk();运行结果:构造方法:构造方法的3个特点:a、名称和类名称一样;b、没的方法的返回类型(外)c、方法内,不能用return 进行返回构造方法被系统(JVM)自动调用,只要有对象生成,就要调用构造方法。构造方法负责对象的初始化工作,为实例变量赋予合适的初始值。当用new创建内存时必须运行构造方法。注意:构造方法也可以重载,产生对象必须调用相应的构造方法。 Java中每一个类都一有默认的构造方法,它是无参的。 但是,一旦写了一个有参数的构造方法,默认的构造方法就没有了。例:class Personprivate String name;/String默认为空,nullprivate int age;/平时要封装int date;public Person()/public 可不要,不可加void,不可有returnpublic Person(String n)/方法重载,第一个Person重名name=n;public Person(String n,int m)/方法重载name=n; if(m180) System.out.println(age is error); else age=m; public Person(String n,int m,int i)name=n; if(m180) System.out.println(age is error); else age=m; if(i7) System.out.println(date is error); else date=i;void talk() System.out.println(my name is:+name+ +i am:+age+ +the date is:+date);class Epublic static void main(String agrs) Person per=new Person(zs);/ Person a =new Person(); Person b =new Person(linan,178); Person c =new Person(maya,12,8); Person d =new Person(yaya,12,6); per.talk(); a.talk(); b.talk(); c.talk(); d.talk();运行结果:内存变化:Person b =new Person(linan,178);栈age:20b:*堆1age:178name:linan2:调用3:释放age匿名对象:只使用一次匿名对象是在一个对象被创建之后,调用对象的方法时可以不定义对象的引用变量,而直接调用这个对象的方法。如:new Person(“huang”,10).talk();它使用在以下2种情况:1) 如果对一个对象只需要进行一次方法调用,那么就可以使用匿名对象;2) 将匿名对象作为实参传递给一个方法调用。其他程序:1、class Person String name; /属性int age;void talk() /方法System.out.println(my name is:+name+ my age is :+age);class Lesson2public static void main(String agr)Person per = new Person();Person per1 = new Person();/per1=null;per1=per; /对象赋值=zs;per.age=10;per.talk();=li;per1.age=-10;per1.talk();结果:2、class Person String name; /属性int age;public Person()public Person(String n)name=n;System.out.println(i am here);public Person(String n,int a)age=a; name=n; void talk() /方法System.out.println(my name is:+name+ my age is :+age);class Lesson5public static void main(String agr)new Person(huang,10).talk();结果:第五课 Java方法递归定义:简单的说,一个方法如果调用了本身,那么这个方法就是递归。递归函数一定要有一个结束的条件,作为函数的出口,要不然就会成为死调用。斐波那契数列递归算法及求和public class Test401 public static void main(String args)int n=Integer.parseInt(args0); int a=new intn; int sum = 0; for (int i = 0; i a.length; i+) System.out.print(func(i)+ ); sum +=func(i);System.out.println(sum= + sum);public static int func(int x)if (x=1|x=0)/函数的出口 return 1;else return (func(x - 1) + func(x - 2);结果:(输入)java Test310 8 (输出) 1 1 2 3 5 8 13 21 sum=54方法重载方法重载:多态的表现。同一种功能,有多种实现方式,采用哪种实现方式,取决于调用者给定的参数,即根据实际情况而定。这就引进了方法重载的思想。小结:方法重载:方法名一样,参数列表(参数个数,参数类型)不一样; 方法的返回类型不一样,参数列表一样,不构成重载;方法重载(静态多态),方法覆盖(动态多态)例:class Test402public static void main(String args) System.out.println(add(3,4); System.out.println(add(3,4,5); System.out.println(add(3,4f,5); static int add(int a,int b) int z=a+b; return z; static int add(

温馨提示

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

评论

0/150

提交评论