当前位置: 首页 > 后端技术 > Java

零基础学习Java第7节(面向对象3)

时间:2023-04-02 00:47:33 Java

本文是《零基础学Java》专栏的第七篇文章。文章以通俗易懂的文字、图表和代码实战,带你从零基础走向高薪之路!本文首发于公众号【编程攻略】包是java中类的一种组织和管理形式。java中的所有资源也是以文件的形式组织起来的,其中主要包含大量需要组织和管理的类文件。java中也使用了目录树结构。虽然各种常见的操作系统平台对文件的管理都是以目录树的形式组织的,但是它们对目录的分隔有不同的表达方式。为了区别于各种平台,“.”用于分隔java中的目录。包机制也解决了类名冲突的问题。包是一组相关的类和接口。同一个包中不能有同名的类或接口。包还实现了对类及其成员的保护。.java文件通常称为编译单元。每个源文件中可以有多个类,但只有一个类可以在它之前进行公共修改。该类的名称与文件名相同。这个类在包外是可见的,可以调用。其他非公共类在包外是不可见的,这些类是公共类的支撑类。编译.java文件时,文件中的每个类都会生成一个对应的文件,文件名与文件名相同,后缀为.class。在文件系统的存储中,一个包对应一个文件夹,包还可以有子包,子包对应子文件夹,包中的类对应文件系统中的.class文件。当classpathJava中的资源存在于不同的平台下时,它们的存储方式和位置必然会有很大的不同。因此,必须要有一种方法来连接跨平台的java包结构和平台。这种连接方式是通过类路径实现的。Classpath告诉java虚拟机(jvm)在哪里放置要使用或执行的*.class文件,用于java类的存放位置。就像windows中的路径一样。在jdk6中,系统类的位置不需要设置classpath,但是如果需要指定用户自定义类的位置,则需要设置classpath,用户设置的位置不会影响system来查找系统类。比如在c盘创建一个目录java,放某个类,比如test。c:\java;,然后执行javatest,你会发现可以运行了。如果在当前目录下放一个和test同名但功能不同的class文件,再执行javatest,看执行的是哪个test?包声明与编译声明包的格式如下:package包名;这条语句必须放在java源文件的第一行,最多只能有一条语句。子包和父包的连接是通过.该语句指定了源程序编译生成的所有类的存放位置,即package。编译方法:带有package语句的java源文件必须这样编译:javac-dgeneratepathjava源文件存放位置path该命令会在“generatepath”指定的位置自动生成package指定的包级别对应的文件夹“结构。下面的程序示例:packageedu.henu.rjxy.wht;publicclasstest{publicstaticvoidmain(String[]args){System.out.println("China");}}导入edu.henu.rjxy.wht。test;publicclasst1{publicstaticvoidmain(String[]args){test.main(args);//edu.henu.rjxy.wht.test.main(args);}}importuse加上包名use类很不方便,所以引入import语句,其格式如下:import包名。班级名称;导入包名。*;import告诉编译器引入一个包(package),它是类的集合。使用标准Java库中的组件时,可以这样做:importjava.util.Scanner;这里告诉编译器使用Java的Scanner,但是util中有很多类,使用时没必要一一列举,可以使用通配符:importjava.util.*;另外java.lang包中的类不需要导入。importstatic用于导入某个类的静态成员。缺点是如果多个导入类中有同名静态成员,会报错,如下:importstaticjava.lang.Math.*;异常是指程序运行时出现的异常现象,通常有两种处理异常的方法:系统检测到程序错误,给出错误信息并终止程序的运行,增加处理异常的功能到程序。语言中所有错误或异常的父类。在Java中,异常分为两类:Exception和Error。因此,有两种类型的Throwable对象。Exception解决程序和环境产生的异常,可以被程序捕获和处理。Error处理很少发生的内部系统错误,并且不能被程序捕获。,程序只能由用户按照系统提示关闭。异常类的名称代表了可能发生的异常的含义。这个异常类的对象表示实际发生的异常,但请注意它不是异常本身。java.lang包中并没有全部定义异常,其他如util、net、io等都有定义。所有I/O异常都继承自java.io.IOException。那些在编译时可以检查的异常称为检查异常,其他的称为未检查异常。非检查异常有两种类型:RuntimeException及其子类,Error及其子类,其他异常类都是检查异常类。异常对象产生的异常对象表示发生的异常,而不是异常本身。异常对象可能是系统被动产生的,也可能是程序主动产生的。在Java语言中,异常机制是:一旦发生异常,可以通过运行方法(主动)或JVM(被动)产生一个异常对象,代表异常事件的类型。生成异常对象并传递给Java运行时系统的过程称为抛??出异常(throw)。您可以抛出任何类型的异常。比如引用t,在使用t之前,我们应该检查t是否真的引用了一个实例,如下:if(t==null)thrownewNullPointerException();//程序生成JDK中的所有异常类.类,一种是默认构造方法,另一种是带字符串参数的构造方法:thrownewNullPointerException("t=null");throw抛出new生成的引用,捕获并处理它。当异常发生时,会有以下过程:首先创建(系统或程序)异常对象来表示异常,然后中断当前执行流程,异常处理机制接管并找到合适的代码继续执行程序,这段代码是异常处理程序。这就好比在生产线上,当发现一个产品有某种缺陷时,质检员会在上面贴上一个描述缺陷的标签(这个标签类比一个不正常的物体),然后这个产品就会被检测出来。根据标签的类别撤回和处理,产品将被发送到不同的部门进行相应的处理(相当于异常处理程序)。异常处理try...catch语句语句格式为:try{//Theguardedregion:Dangerousactivities//thatmightthrowA,B,orC}catch(Aa1){//情况A的处理程序}catch(Bb1){//情况B的处理程序}catch(Cc1){//情况C的处理程序}finally{//每次发生的活动}每个catch语句就像一个接受参数的小方法,它可以只是一个参数,就像一个方法参数。该参数的类型已经提供了足够的信息来处理异常。如果抛出异常,异常处理机制会在catch中依次查找,就近匹配。子类异常会匹配父类异常,直到找到匹配的异常,然后进入catch语句。注意,try中可能有很多条语句会产生相同的异常,但对应的catch中只需要一条。有时,不管try中是否出现异常,都必须执行一些特定的语句,那么可以将这些语句放在finally语句中。因此,为了保证程序中某个资源一定会被释放,通常会将释放资源的语句放在finally语句块中。通常会执行finally块中的代码。但是如果在finally语句块执行之前JVM就退出了,那么finally语句块就不会被执行。try{//退出JVMSystem.exit(0);}finally{//不会执行。System.out.println("finally...");}示例:importjava.io.*;publicclasstestEextendsException{staticvoidf1()throwstestE{try{thrownewtestE();}catch(ArrayIndexOutOfBoundsExceptione){System.out.println("fromf1");}}publicstaticvoidmain(String[]args){try{f1();}catch(testEe){System.out.println("frommain.");}}}异常表如果方法内部产生了异常但没有处理,则需要抛出方法体,这个方法需要用到异常表。异常表指定方法可能抛出的异常种类。使用方法如下:voidf()throwsTooBig,TooSmall,DivZero{//...下面的例子voidf(){//...表示该方法不会抛出任何异常(RuntimeException异常除外或继承自Its的异常),该方法可能产生的所有异常,都应在异常表中列出(RuntimeException异常或继承自它的异常除外),但出现在异常表中的异常可能不会发生在异常表中方法的实际执行。以下示例://编译失败。//IOException没有被处理publicstaticvoidmain(String[]args)throwsFileNotFoundException{FileInputStreamfis=newFileInputStream("abc");fis.read();}所有的RuntimeException类及其子类的异常系统都可以自动处理,同时RuntimeException及其子类的异常不需要出现在异常表中,这种异常可以被catch捕获也可以不处理.请记住:您只能忽略RuntimeException(或其子类)。公共类NeverCaught{staticvoidf(){thrownewRuntimeException("Fromf()");}staticvoidg(){f();}publicstaticvoidmain(String[]args){g();}}自定义异常类JDK异常不包括所有可能的异常,所以你可以编写自己的异常类。要创建您自己的异常,您应该扩展一个与此异常含义相似的异常类。例如:classSimpleExceptionextendsException{}publicclassSimpleExceptionDemo{publicvoidf()throwsSimpleException{System.out.println("ThrowSimpleExceptionfromf()");抛出新的SimpleException();}publicstaticvoidmain(String[]args){SimpleExceptionDemosed=newSimpleExceptionDemo();尝试{sed.f();}catch(SimpleExceptione){System.err.println("抓到它了!");}}}又如:classMyExceptionextendsException{publicMyException(){}publicMyException(Stringmsg){super(msg);}}publicclassFullConstructors{publicstaticvoidf()throwsMyException{System.out.println("ThrowingMyExceptionfromf()");抛出新的MyException();}publicstaticvoidg()throwsMyException{System.out.println("ThrowingMyExceptionfromg()");抛出新的MyException(“起源ding()");}publicstaticvoidmain(String[]args){try{f();}catch(MyExceptione){System.out.println(e);}try{g();}catch(MyExceptione){System.out.println(e);}}}//:ExtraFeatures.java//异常类的进一步点缀.classMyException2extendsException{privateintx;publicMyException2(){}publicMyException2(Stringmsg){super(msg);}publicMyException2(Stringmsg,intx){super(msg);this.x=x;}publicintval(){returnx;}}publicclassExtraFeatures{publicstaticvoid}f()throwsMyException2{System.out.println("ThrowingMyException2fromf()");thrownewMyException2();}publicstaticvoidg()throwsMyException2{System.out.println("ThrowingMyException2fromg()");thrownewMyException2("起源于我ng()");}publicstaticvoidh()throwsMyException2{System.out.println("ThrowingMyException2fromh()");thrownewMyException2("Originatedinh()",47);}publicstaticvoidmain(String[]args){try{f();}catch(MyException2e){e.printStackTrace();}try{g();}catch(MyException2e){e.printStackTrace();}try{h();}catch(MyException2e){e.printStackTrace();System.err.println("e.val()="+e.val());}}}如果你需要捕获任何异常,代码如下:catch(Exceptione){System.err.println("Caughtanexception");}上面的语句应该放在异常处理语句的末尾一些例子:publicclassExceptionTest09{publicstaticvoidmain(String[]args){inti=m1();System.out.println(i);//10}publicstaticintm1(){inti=10;尝试{返回我;}最后{i++;System.out.println("m1的i="+i);//11}}}/*被覆盖的方法不能抛出比被覆盖的方法Exception.*/importjava.io.*;/*classA{publicvoidm1(){}}classBextendsA{//子类永远不会抛出比父类更多的异常。publicvoidm1()抛出异常{}}*/classA{//publicvoidm1()抛出FileNotFoundException{}publicvoidm1()抛出IOException{}}classBextendsA{//publicvoidm1()抛出IOException{}publicvoidm1()抛出FileNotFoundException{}}