黑马java.doc_第1页
黑马java.doc_第2页
黑马java.doc_第3页
黑马java.doc_第4页
黑马java.doc_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

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

文档简介

颜色块标识示例概念关键字关键点Java相关单词Encapsulation封装API应用程序接口PCIPeripheral Component Interconnect局部总线或者外设组件互连DaoData access object 数据访问对象IDEIntegrated Development Environment集成开发环境JAVA常见错误类型ArrayIndexOutofBoundException:3操作数组时,访问到了数组中不存在的角标NullPointerException:指针异常:当引用没有任何指向值为null情况,该引用还在用操作实体Ide6ced 是数组,I是int数据类型,de6ced数组指向内存地址 编码GBK的不可映射字符将源程序用笔记本打开,另存为选择ANSI编码就了ClassCastException类型转换失败ArithmeticExcept算术异常JAVA常用包简介dos命令行,课程中常见的命令。dir : 列出当前目录下的文件以及文件夹md : 创建目录rd : 删除目录cd : 进入指定目录cd. : 退回到上一级目录cd/ : 退回到根目录del : 删除文件exit : 推出dos命令行JRE Java Runtime Environment Java运行环境,包括虚拟机JDK Java Development Kit Java开发工具包开发工具,包括JRE对环境变量进行临时设置与取消:Set classpath=.;文件目录 ;文件目录: 最前面的.指当前目录,最后分号不加只找环境变量目录,加的话先找环境变量中的再找当前目录的 优先级高于当前目录查找Set classpath=Java有三种注释方法:/内容单行注释/*内容*/多行注释/*内容*/文档注释/*需求:思路:步骤:*/二进制负数表示:取反+字符型(char=两个byte)布尔型(boolean)整数类型(byte=-128至127, short=2byte, int=4byte, long=8byte)浮点类型(float=4个八位, double个八位)类(class)接口(interface)数组( )整数默认:int 小数默认:doublefloat f=3.33f;long l=345l;byte b=3;b=(byte)(b+2);b+=2;int+fload=float;类型提升大的内存空间+小的内存空间大的内存空间int+long=long强制类型转换(int)4.13=4;转义字符:通过来转变后面字母或者符号的含义。n换行b退格,相当于backspacer按下回车键,windows系统,回车符是由两个字符表示rnt制表符,相当于tab键赋值运算符:只是一个符号,不是两个符号,+,*,/,%short x=3;x=x+4; 这是错误的X+=4; 是正确的逻辑运算符用于连接boolean类型的表达式&与|或异或!非&短路|:两边相同结果为假,两边不同结果为真&:左边为假时即为假,右边不运算;|:当左边为真时即为真,右边不运算位运算符:均是二进制的运算(可以先转换成二进制再算),加密工程可以这些运算右移无符号右移&与运算|或运算异或运算反码:除以的移动位数次幂,高位空出的拿原有最高位补:同,区别是右移后最高位始终用补&:转换成二进制,当成真,当真假,| 同: (6取反加等于,所以取反是) 例:两个变量数值交换:利用一个数被另一个数同时异或两次还是这个数n=nm;m=nm;m=nmm=nn=nm; n=n(nm)=m三元运算符:(条件表达式)?表达式:表达式;如果条件为真运算结果是表达式,如果条件为假,运算结果是表达式例:获取两个数中大数int x=3,y=4,z;z=(xy)?x:y;变量存储的就是两个数的大数条件判断语句if switchif多重语句:方便区间判断,可以布尔if()else if()else if()elseswitch语句:不能作布尔判断,值不多而且符合byte,short,int,char选此switch(变量)/开关,小括号中只能出现byte,short,int或charcase 变量值1:/案例,case案例个数可随便定义但后面一定要跟常量内容;break; /跳出case 变量值1:内容;break;case 变量值1:内容;break;case 变量值1:内容;break;default:/默认内容;循环语句:命令行强制停止ctrl+cwhile与do while区别:do while会无条件先执行一次while(条件表达式)循环体(执行语句);do循环体(执行语句);while(条件表达式);for和while的区别:for的增量执行结束后释放,for(初始化表达式;循环条件表达式;循环后操作表达式)循环体(执行语句);for例:int x=1;for(System.out.println(“a”);x3;System.out.println(“c”),x+)/小括号中的每个表达式都可以不唯一,中间用 , 隔开System.out.println(“d”);/x+;打印结果:adcdc无限循环表达式:for(;)while(true)/break作用范围判断语句和循环语句w:for(int x=1;x3;x+) /w: 是对for作标识break w;就是跳出此for循环q:for(int y=1;y4;y+)System.out.println(“x=”+x);break q; /跳出内循环/continue 作用范围是循环结构,继续循环。特点:结束本次循环,继续下一次循环。for(int x=1;x=10;x+) / 打印偶数if (x%2=1)continue;System.out.println(“x=”+x);函数的定义在类(class)中就行修饰符返回值类型函数名(参数类型形式参数1,参数类型形式参数2,)执行语句;return 返回值;返回值类型:函数运行后的结果的数据类型。参数类型:是形式参数的数据类型。形式参数:是一个变量,用于存储调用函数时传递给函数的实际参数。实际参数:传递给形式参数的具体数值。return:用于结束函数。返回值:该值会返回给调用者。对于函数没有具体返回值的情况,返回值类型用关键 字void表示,那么该函数中的return语句如果在最后一行可以省略不写比较x,y是否相等return x=y;函数的重载:当定义的功能相同,但参与去处的未知内容不同,那么这时就定义一个函数名称以表示功能相同,方便阅读,而通过参数列表的不同来区分多个同名函数。重载和返回值类型没关系,不同返回值的函数不能存在一个类中数组格式:格式1:元素类型 数组名= new 元素类型元素个数或数组长度;示例:int arr = new int5;/arr的值是堆内存地址,堆内存三个特点:脚标,初始值,垃圾清理机制格式2:元素类型 数组名= new 元素类型元素,元素,;int arr = new int3,5,1,7;int arr = 3,5,1,7;new关键字用来在内存中产生一个容器实体,其所在内存是堆内存,堆内存中数据会被java虚拟机不定时清除,不一定会立即清除int等非引用关键字会在内存栈中生成一个存储空间,栈内存数据用完后会自动清除第 四 课int arr=new int3;动态定义数组个数int arr=new int3,4,3,6,7; iint arr=3,5,2,6;静态定义了数组元素内容及个数;数组长度:数组名称.length数组参与定义函数:例:一行打印数组中的元素,元素之间用”, ”隔开public static void printArray(int arr)for(int x=0;xarr.length;x+)if(x!=arr.length)System.out.print(“arr”+x+”=”+arrx+”,”);else/去掉最后一个元素后面的“”,“”System.out.println(“arr”+x+”=”+arrx);数组排序:选择排序冒泡排序/*选择排序。内循环结束一次,最值出现头角标位置上。*/public static void selectSort(int arr)for (int x=0; xarr.length-1 ; x+)for(int y=x+1; yarry)int temp = arrx;arrx = arry;arry= temp;/*选择排序。内循环结束一次,最值出现尾角标位置上。*/public static void bubbleSort(int arr)for(int x=0; xarr.length-1; x+)for(int y=0; yarr.length-x-1; y+)/-x:让每一次比较的元素减少,-1:避免角标越界。if(arry0&a130)age=a;speak();elseSystem.out.println(“feifa age”);构造函数函数名必须与类名相同,没有返回值class Personperson()对象一建立就会调用与之对应的构造函数构造函数的作用:用于给对象进行初始化。类中没有定义构造函数时,系统会默认给该类加入一个空参数的构造函数。一个类中可以多定义多个构造函数,通过不同参数列表形成重载函数构造代码块;类中没有名称的一对大括号作用:给对象进行初始化对象一建立就运行,而且优先于构造函数执行和构造函数的区别:构造代码块是给所有对象进行统一初始化而构造函数是给对应的对象初始化构造代码块中定义的是不同对象共性的初始化内容this代表所在函数所属对象的引用简单说,哪个对象在调用this所在函数,this就代表哪个对象用于区分局部变量和成员变量同名情况this语句构造函数间调用,只能放在构造函数第一行,因为初始化要先执行。第六课static 静态修饰符,用于修饰成员(成员变量,成员函数),建立对象时静态修饰内容不放在堆内存中,可以被不同对象共同引用。当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,还可以直接被类名调用。类名.静态成员特点:、随着类的加载而加载,随着类的消失而消失,它的生命周期最长、优先于对象的存在,静态先存在,对象后存在、被所有对象共享、可以直接被所调用实例变量和类变量的区别:.存放位置类变量随着类的加载而存在于方法区中实例变量随着对象的建立而存在于堆内存中.生命周期类变量生命周期最长.主函数是静态的静态使用注意事项:. 静态方法只能访问静态成员2静态方法中不可以定义this,super关键字因为静态优先于对象存在,所以静态方法中不可以出现this静态有利有弊利:对对象的共享数据进行单独空间的存储,节省空间,没有必要每一个对象中都存储一份可以直接被类名调用弊:生命周期过长访问出现局限性,(静态虽好,只能访问静态)内存中的方法区(共享区,数据区):static放在此class PersonString name;/成员变量,实例变量static String country =”CN”;/静态的成员变量,类变量public static void main(String args)/args要不是, 要不null主函数:是一个特殊的函数,作为程序的入口,可以被jvm( java虚拟机) 调用。主函数的定义:public:代表该函数的访问权限是最大的static:代表主函数随着类的加载就已经存在了void:主函数没有具体的返回值main:不是关键字,但是是一个特殊的单词,可以被jvm识别(String args):函数的参数,参数类型是一个数组,该数组中的元素是字符串,字符串类型的数组。jvm只当这固定格式的主函数为函数入口,其它形式的(如:public static void main(int x))重载函数不行,但不会报错public static void main(String x),参数列表中args改为x也可以作函数入口jvm在调用主函数时,传入的是new String(0);软件说明文档生成:/*这是一个可以对数组进行操作的工具类,该类提供了。等功能author lilyversion V2.3*/class要用public修饰才能制作说明文档每个函数前要有/*功能说明:param arr 接收一个int类型的数组return 会返回一个该数组中最大值*/javadoc d f:javahelp author version Array.java不想让用户创建对象,要建一个私有空构造函数静态代码块格式:static静态代码块中的执行句特点:随着类的加载而执行,只执行一次先于主函数执行用于给类进行初始化执行顺序:静态代码块构造代码块构造函数设计模式:解决某一类问题最行之有效的方法java中23种设计单例设计模式:解决一个类在内存只存在一个对象想要保证对象唯一. 为避免其它程序过多建立该类对象,先禁止其它程序建立该类对象. 为了让其它程序可以访问到该类对象,在本类中,自定义一个对象. 为了方便其它程序对自定义对象的访问,可以对外提供一些访问方式代码体现:. 将构造函数私有化. 在类中创建一个本类对象. 提供一个方法可以获取到该对象第一种方法饿汉式class Singalprivate Singal ()private static Singal d=new Singal ();public static Singal getInstance()return d;第二种方法懒汉式延时加载class Singalprivate Singal ()private static Singal d=null;public static Singal getInstance()if (d=null)d=new Singal();return d;第七课. 面向对象第二特征:继承继承好处:a. 提高了代码的复用性b. 让类与类之间产生了关系,有了这个关系,才有了多态的特性extendsclass Student extends Person 聚集:has a聚合:球队和球员组合:事物联系更紧密,人和手的关系this:子类访问本类对象super:父类访问父类对象当子类继承父类,沿袭了父类的功能,到子类中但是子类虽具备该功能,功能的内容却和父类不一致这时,没有必要定义新功能,而是使用覆盖特殊,保留父类的功能,并重写功能内容覆盖:.子类覆盖父类,必须保证子类权限大于等于父类权限,才可以覆盖,否则编译失败.静态只能覆盖静态权限:public private什么都不写:权限介于public与private之间重载与重写:重载:只看同名函数的参数列表重写:子方法要一模一样final:最终,作为一个修饰符. 可以修饰类,函数,变量。. 被final 修饰的类不可以被继承,为了避免被继承,被子类复写功能. 被final修饰的方法不可以被复写. 被final修饰的变量是一个常量,只能赋值一次,既可以修饰成员变量,又可以修饰局部变量一些数据的出现是固定的,如PI(3.1415),可以用final定死,格式:MY_PI. 内部类定义在类中的局部位置上时,只能访问该局部被final修饰的局部变量abstract 抽象abstract void study();.抽象方法只能放在抽象类中.抽象方法和抽象类都必须被abstract关键字修饰.抽象类不可以用new创建对象,因为调用抽象方法没意义.抽象类中的抽象方法要被使用,必须由子类复写起所有的抽象方法后,建立子类对象调用。如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类获取时间:System.currentTimeMillis();模板方法设计:在定义功能时,功能的一部分是确定的,但是有一部分是不确定,而确定的部分在使用不确定的部分,这时就将不确定的部分暴露出去,由该类的去完成inerface接口;初期理解,可以认为是一个特殊的抽象类,抽象类中的方法都是抽象的,那么该类可以通过接口的形式来表示class用于定义类interface用于定义接口接口定义时,格式特点为:. 接口只能定义:常量,抽象方法. 接口中的成员都有固定修饰符常量:public static final方法:public abstract接口中的成员都是public的接口不可以创建对象,因为有抽象方法需要被子类实现,子类对接口中的抽象方法全都覆盖后,子类才可以实例化否则子类是一个抽象类接口可以被类多实现,也是对多继承不支持的转换形式,java支持多实现implements 实现class Test implements Inter,InterA接口间可以多继承接口特点:. 接口是对外暴露的规则. 接口是程序的功能扩展基本功能定义在类中,扩展功能定义在接口中. 降低了耦合性第八课多态:可以理解为事物存在的多种体现形态提高代码的扩展性人:男人,女人. 多态的体现父类的引用指向了自己的子类对象父类的引用也可以接收自己的子类对象Aniamal c=new Cat();/类型提升,向上转型. 多态的前提必须类与类之间有关系,要么继承,要么实现通常还有一个前提,就是存在覆盖. 多态的好处多态的出现大大提高程序的扩展性. 多态的弊端提高了扩展性,但是只能使用父类的引用访问父类中的成员. 多态的应用. 多态的出现代码中的特点(多态使用的注意事项)Animal a=new Cat(); /类型提升,向上转型。父类的引用指向子类对象eat();Cat c=(Cat)a;/强制将父类的引用,转成子类类型,向下转型c.catchMouse();instanceof 用来判断所属类型a instanceof Cat /a是Cat类型在多态中非静态成员函数的特点:在编译时期:参阅引用型变量所属的类中是否有调用的方法,如果有,编译通过,如果没有编译失败在运行时期:参阅对象所属的类中是否有调用的方法。简单总结就是:成员函数在多态调用时,编译看左边,运行看右边在多态中成员变量的特点:无论编译和运行,都参考左边(引用型变量所属的类)在多态中,静态成员函数的特点:无论编译和运行,都参考左边object :是所有对象的直接或者间接父类该类上定义的是所有对象都具备的功能:equal,clone,toString,hashCode,getClass 第九课内部类(内置类,嵌套类):内部类可以被私有内部类的访问规则:. 内部类可以直接访问外部类中的成员,包括私有之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式外部类名.this. 外部类要访问内部类,必须建立内部类对象外部访问内部类:Outer.Inner in=new Outer().Inner();访问格式:.当内部类定义在外部类的成员位置上,而且非私有,在外部其他类中,可以建立内部类对象格式:外部类名.内部类名变量名= 外部类对象. 内部类对象;Outer.Inner in=new Outer().Inner();.当内部类在成员位置上,就可以被成员修饰符所修饰。比如 private:将内部类在外部类中进行封装static:内部类就具备static特性当内部类被static修饰后,只能直接访问外部类中的static成员,出现了访问局限在外部其它类中,如何直接访问static内部类非静态成员new Outer.Inner().function();在外部其它类中,如何直接访问static内部类静态成员new Outer.Inner.function();当内部类中定义了静态成员,该内部类必须是static当外部类的静态方法访问内部类时,内部类也必须是static的当描述事物时,事物的内部还有事物,该事物用内部类来描述因为内部事物在使用外部事物的内容内部类定义在局部时.不可以被成员修饰符修饰.可以直接访问外部类中的成员,因为还持有外部类中的引用但是不可以访问它所在的局部中的变量,只能访问被final修饰的局部变量匿名内部类:.匿名内部类其实就是内部类的格式.定义匿名内部类的前提:内部类必须是继承一个类或者实现接口3.匿名内部类的格式:new 父类或者接口()定义子类的内容4.其实匿名内部类就是一个匿名子类对象。而且这个对象有点胖,可以理解为带内容的对象.匿名内部类中定义的方法最好不要越过个new AbsDemo() void show() System.out.println(“x=”+x);.show();异常:程序运行时出现不正常情况异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述。并封装成对象其实就是java对不正常情况进行描述后的对象体现对于问题的划分:两种:一种是严重的问题,一种是非严重的问题对于严重的,java通过Error类进行描述对于Error一般不编写针对性的代码对其进行处理对于非严重的,java通过Exception类进行描述。对于Exception可以使用针对性处理方式进行处理无论Error或者Exception都具有一些共性内容比如:不正常情况的信息,引发原因等Throwable |-Error |-Exception2.异常处理java 提供了特有的语句进行处理try 需要被检测的代码;catch(异常类变量)处理异常的代码;(处理方式)finally(一定会执行的语句;)3.对捕获到的异常对象进行方法操作String getMessage(): 获取异常信息在函数上声明异常便于提高安全性,让调用者进行处理,不处理编译失败int div(int a,int b) throws Exception对多异常的处理:.声明异常时,建议声明更为具体的异常。这样处理的可以更具体int div(int a,int b) throws ArithmeticException,ArrayIndexoutofBoundsException2.对方声明几个异常,就应有几个catch块,不要定义多余的catch块如果多个catch块中的异常出现继承关系,父类catch块放在最下面建议在进行catch处理时,catch中一定要定义具体处理方式不要简单定义一句e.printStackTrace 也不要简单的只书写一条输出语句异常日志文件自定义异常因为项目中会出现特有的问题而这些问题未被java所描述并封装对象所以对于这些特有的问题可以按照java的对问题封装的思想将特有的问题,进行自定义的异常封装当在函数内部出现了throw抛出异常对象,那么就必须要给对应的处理动作要么在内部try catch处理要么在函数上声明让调用者处理一般情况下,函数内出现异常,函数上需要声明throw 抛出throw new FuShuException();/手动通过throw关键字抛出一个自定义异常对象throws与throw的区别throws 使用在函数上throw使用在函数内throws后面跟的异常类,可以跟多个,用逗号隔开throw后面跟的是异常对象Exception中有一个特殊的子类异常RuntimeException运行时异常如果在函数内抛出该异常,函数上可以不用声明,编译一样通过如果在函数上声明了该异常,调用者可以不用进行处理,编译一样通过之所以不用在函数上声明,是因为不需要让调用者处理当该异常发生,希望程序停止,因为在运行时,出现了无法继续运行的情况,希望停止程序后对代码进行修正自定义异常时,如果该异常的发生,无法在继续进行运算就让自定义异常继承RuntimeException.异常分两种:.编译时被检测的异常.编译时不被检测的异常(运行时异常,RuntimeException以及其子类)第十课finally代码块:定义一定会被执行的内容通常用于关闭资源数据库操作,必须断开时用finallytry连接数据为库;数据操作;/throw new SQLException();catch(SQLException e)/catch是处理异常的如果没有catch就代表异常没有被处理过,如果该异常是检测时异常,那么必须声明会对数据库进行异常处理;throw new NoException();finally关闭数据库;/该动作,无论数据操作是否成功,一定要关闭资源的异常在子父类覆盖中的体现:.子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类.如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集.如果父类或者接口的方法中,没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常如果子类方法发生了异常,就必须要进行try处理,绝对不能抛出异常:对问题的描述,将问题进行对象的封装异常体系:Throwable-Error-Exception-RuntimeException异常体系的特点:异常体系中的所有类以及建立的对象都具备可抛性也就是说可以被throw和throws关键字所操作只有异常体系具备这个特点throw和throws的用法:throw定义在函数内,用于抛出异常对象throws 定义在函数上,用于抛出异常类,可以抛出多个用逗号隔开当函数内部有throw抛出异常对象,并未进行try处理,必须要在函数上声明,否则编译失败注意,RuntimeException除外,也就说,函数内如果抛出的RuntimeException异常,函数上可以不用声明如果函数声明了异常,调用者需要进行处理,处理方法可以thtrows可以try异常有两种:编译时被检测异常该异常在编译时,如果没有处理(没有抛也没有try),编译失败 该异常被标识,代表可以被处理运行时异常(编译时不检测)在编译时,不需要处理,编译器不检查该异常的发生,建议不处理,让程序停止,需要对代码进行修正异常处理语句:try 需要被检测的代码;catch()处理异常的代码;finally一定会执行的代码有三种结合格式:. try 需要被检测的代码;catch()处理异常的代码;.try 需要被检测的代码;finally一定会执行的代码.try 需要被检测的代码;catch()处理异常的代码;finally一定会执行的代码注意:.finally中定义的通常是,关闭资源代码,因为资源必须释放。.finally只有一种情况不会执行,当执行到System.exit(0),系统退出,jvm结束自定义异常:定义类继承Exception或者RuntimeException .为了让该自定义类具备可抛性.让该类具备操作异常的共性方法当要定义自定义异常的信息时,可以使用父类已经定义好的功能将异常信息传递给父类的构造函数class MyException extends ExceptionMyException(String message) super(message);自定义异常:按照java的面向对象思想,将程序中出现的特有问题进行封装异常的好处:.将问题进行封装.将正常流程代码和问题处理代码相分离,方便于阅读异常的处理原则:,处理方式有两种:try或者throws,调用到抛出异常的功能时,如果抛出几个,就处理几个,一个try对应多个catch,多个catch,父类的catch放在最下面,catch内,需要定义针对性的处理方式,不要简单的定义printStackTrace,输出语句也不要不写当捕获到的异常,本功能处理不了时,可以继续在catch中抛出trythrow new AException();catch(AException e)throw e;如果该异常处理不了,但并不属于该功能出现的异常可以将异常转换后,再抛出和该功能相关的异常或者异常可以处理,但需要将异常产生的和功能相关的问题提供出去让调用者知道,并处理,也可以将捕获异常处理后,转换新的异常trythrow new AException();catch(AException e)/对AException处理throw new BException异常的注意事项:在子父类覆盖时:,子类抛出的异常必须是父类异常的子类或者子集,如果父类或者接口没有异常抛出时,子类覆盖出现异常,只能try不能抛package 包 可以使源文件与class文件分开存放package pack;自动生成:javac d . PackageDemo.java包与包之间进行访问,被访问的包中的类以及类中的成员,需要public修饰不同包中的子类还可以直接访问父类中被protected权限修饰的成员protected;保护权限(第三个权限关键字了)=权限关键字publicprotecteddefaultprivate同一个类中okokokok同一个包中okokOk子类包okOk不同包中okimport 导入包中的类为了简化类名的书写,使用一个关键字* 通配符建议不要写通配符,需要用到包中的哪个类,就引入哪个类建立定义包名不要重复,可以使用url来完成定义,url是唯一的Jar包Java的压缩包第十一课进程:是一个正在执行中的程序每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元线程,进程中的一个独立的控制单元线程在控制着进程的执行一个进程中至少有一个线程Java VM启动时会有一个进程java.exe该进程中至少有一个线程在负责java程序的执行而且这个线程运行的代码存在于main方法中该线程称之为主线程扩展:更细节说明jvm,jvm启动不止一个线程,还有负责垃圾回收机制的线程.如何在自定义代码中,自定义一个线程通过对api的查找,java已经提供了对线程这类事物的描述,就是Thread类创建线程的第一种方式:继承Thread类步骤:1.定义类继承Thread2.复写Thread 类中的run方法目的:将自定义的代码存储在run方法中,让线程运行3.调用线程的start方法,该方法两个作用:启动线程,调用run方法发现运行结果每一次都不同因为多个线程都获取cpu的执行权,cpu执行到谁,谁就运行明确一点,在某一个时刻,只能有一个程序在运行,(多核除外)cpu在做着快速的切换,以达到看上去是同时运行的效果可以形象把多线程的运行形容为在互相抢夺cpu的执行权这就是多线程的一个特性:随机性谁抢到谁执行,至于执行多长时间,cpu说的算为什么要覆盖run方法:Thread类用于描述线程该类就定义了一个功能,用于存储线程要运行的代码,该存储功能就是run方法也就是说Thread类中的run方法,用于存储线程要运行的代码线程都有默认的名称:通过getName()Thread-编号该编号从开始static Thread currentThread():获取当前线程对象getName():获取线程名称设置线程名称:setName或者构造函数创建线程的第二咱方式:实现Runnable接口步骤:.定义类实现Runnable接口.覆盖Runnable接口中的run方法将线程要运行的代码存放在该run方法中.通过Thread类建立线程对象.将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数为什么要将Runnable接口的子类对象传递给Thread的构造函数因为,自定义的run方法所属的对象是Runnable接口的子类对象所以要让线程去执行指定对象的run方法,就必须明确该run方法所属的对象.调用Thread类的start方法开启线程并调用Runnable接口子类的run方法实现方式和继承方式有什么区别呢?实现方式好处:避免了单继承的局限性。在定义线程时,建立使用实现方式。两种方式区别:继承Thread:线程代码存放Thread子类run方法中。实现Runnable,线程代码存在接口的子类的run方法通过分析,发现,打印出0,-1,-2等错票。多线程的运行出现了安全问题。问题的原因:当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行。导致共享数据的错误。解决办法:对多条操作共享数据的语句,只能让一个线程都执行完。在执行过程中,其他线程不可以参与执行。Java对于多线程的安全问题提供了专业的解决方式。就是同步代码块。synchronized(对象)需要被同步的代码对象如同锁。持有锁的线程可以在同步中执行。没有持有锁的线程即使获取cpu的执行权,也进不去,因为没有获取锁。火车上的卫生间-经典。同步的前提:1,必须要有两个或者两个以上的线程。2,必须是多个线程使用同一个锁。必须保证同步中只能有一个线程在运行。好处:解决了多线程的安全问题。弊端:多个线程需要判断锁,较为消耗资源,如何找问题:1,明确哪些代码是多线程运行代码。2,明确共享数据。3,明确多线程运行代码中哪些语句是操作共享数据的同步函数用的是哪一个锁呢?函数需要被对象调用。那么函数都有一个所属对象引用。就是this。所以同步函数使用的锁是this

温馨提示

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

评论

0/150

提交评论