内部类和异常 十年饮冰 难凉热血田林哥哥复习:接口:接口不是特殊的抽象类,一个类可以实现多个无关接口,一个接口可以被多个无关的类实现,是一种功能规范;在层和层之间加
十年饮冰 难凉热血 田林哥哥 复习: 接口: 接口不是特殊的抽象类,一个类可以实现多个无关接口,一个接口可以被多个无关的类实现,是一种功能规范; 在层和层之间加上一个接口,降低耦合性,提高可维护性; 接口也会生成字节码文件; Java中通过接口来实现多继承。 为什么接口不是特殊的抽象类: 1.接口的声明是 interface; 2.一个类只能继承一个父类,却能实现多个接口; 3.子类对父类的方法的重写叫覆盖,对接口方法的重写叫实现; 4.接口里的属性默认都是 public static final的 5.接口里的方法默认都是 public abstract的 6.抽象类有构造方法,在创建子类对象的时候调用,但接口类没有构造方法; 7.一个接口可以继承多个父接口; 8.一个类实现了这个接口,就说明这个类遵守这个功能规范而已; 9.接口的回调:用接口的引用型变量 保存 实现该接口的类的对象的地址 不管持久层的代码是什么,都实现了同一个接口,符合同一个功能规范,业务层只是面向这个接口,不管持久层代码怎么变(方法实现变化,方法声明都不变),业务层都不需要变,便于管理,便于维护。 实例内部类:在外部类中定义 定义在一个类的内部,它和外部类是组成关系,相当于外部类的一个成员; 内部类可以访问外部类的私有属性,内部类的作用域仅限于外部类的内部; 内部类对象必须依赖一个外部类对象a来创建: 在外部类中创建:inner io = this.new inner();//必须传递一个外部类对象的地址,在外部类的实例方法中创建内部类对象可以省略this; 在其他类中创建:outer.inner io = a.new inner(); 在内部类对象io中,会存放一个与他关联的外部类对象的引用: 通过outer.this. 来操作外部类对象的属性和方法; 如果两个内部类对象关联同一个外部类对象,那他们会共享这个外部类对象的属性; Ps:假设外部类名为outer,内部类名为inner 如果一个内部类是私有的,那他只能在外部类中创建内部类对象; 常见:通过外部类的方法创建内部类的线程,来访问外部类的属性,对这些属性进行操作,过程要保证同步和安全; 私有内部类+省略名字→匿名类; 新姿势: 方法内部类/局部内部类:定义在一个外部类的方法里 该内部类对象只能在该方法中创建,只能在该方法里有效; 有几个类就有几个字节码文件,该内部类的字节码文件也是: 外部类名$内部类名.class 创建一个外部类对象o,调用o的定义了方法内部类的方法,把内部类加载到内存,如果需要创建内部类对象,那就按照内部类的模板,创建一个内部类对象,但是该内部类对象的作用范围仅在包含他的这个方法里 方法内部类的对象也有其关联的外部类对象的引用 方法内部类只能访问该方法里的final修饰的局部变量 PS:输出一个对象的地址,其实是调用这个类的toString方法 异常Exception:为了代码的健壮性 一段好的代码是需要有健壮性的,健壮性是指:不会因为外部因素(用户输入,资源未找到等)而终止了程序的运行。 对于程序执行中无法控制的资源问题提供一个预先的处理方案,不让它影响程序的继续执行; 让程序员发现程序出现的问题,从而解决,不要让程序的异常影响程序的继续执行; 把容易出错的代码放在try{}里面,如果出现异常就通过catch捕获; 运行时异常:RuntimeException 捕获异常不是目的,找到出现的错误的原因,从而修正代码解决问题并且提示用户的手段而已。 编译时异常: FileInputStream fin = new FileInputStream(“文件”); 血型 血袋 抽血管(献血人) 如果献血人不来了,就会出现异常。IOException 由于资源问题而出现的异常,是修改代码解决不了的,我们只能加一个预备处理措施,不要让它影响程序的运行; 在编译时,对于可能出现资源未找到之类的原因而出现异常的代码,必须用try包住,并由catch提供对于异常的处理机制,不然编译都不让你通过; java把异常封装为一个对象, Throwable有两个子类Error,Exception,Error没法解决, 而Exception是所有异常的父类,Exception主要又分RuntimeException(通过修改代码可以解决的)和IOException(通过修改代码解决不了的,我们只能通过try/catch提供一个预案) 不要指望你的程序永远不出错,一个有健壮性的程序不是绝对不出错,而是尽量解决运行时异常,同时对于可能出现的编译时异常提供预先解决方法,不让可能出现的异常影响程序的继续执行。 异常处理机制: 父类的print方法声明了不处理ArithmeticException,把该异常抛给调用它的方法,那继承该父类的子类在重写print方法时,也要抛出该异常。 子类覆盖方法声明不处理的异常不能多于父类该方法声明不处理的异常。子类覆盖方法所声明的异常需要跟父类方法声明的相同,或者是父类声明异常的子类。 异常处理流程: 当出现异常的时候,会创建一个该异常类的对象e,先找在当前方法中是否有try/catch,如果有,就在该方法内处理;如果没有,就看在该方法中是否声明了不处理该类型异常,声明了,那就到调用该方法的那个方法里找try/catch机制,然后继续程序继续执行; Try{ 语句一; 语句二;//如果语句二出现了异常,那就会跳到catch块,不再执行try块后面的语句 语句三; …… }catch(Exception e){ 处理异常的代码; } 有可能出现问题的代码就放在try块里面,但try块不要过大,如果你想继续执行语句三;那就再写个try/catch把语句三放进去。 不可能出现问题的代码就别放在try里面了,不然会影响调试程序员的工作 一个try可以有多个catch语句,但try中发生一个异常就会跳到对应的catch块,所以try一次执行只会提示一个异常,执行完catch之后还会执行该try块以外的代码 catch需要对号入座,尽量细分区别拦截的是什么异常,最好成为一个金字塔类型,从小到大 把预计的到的,详细的异常,声明在上面的catch语句,一旦发生了异常,就知道具体是哪个异常了,在最底部声明Exception,万一出现完全意料不到的异常时,用于保底。 Finally:不管是正常执行还是出现异常,在返回以前都必须执行的代码 譬如:读取文件之后必须执行close()关闭与该文件连接的字节流; 如果有try,没catch,但是有finally,就是出现了异常,在结束程序之前,先执行finally的代码 返回值栈:先进后出 出现异常,该异常的catch语句会返回1,再执行finally,会返回3;先把1压栈,再把3压栈.....后进先出,所以调用该方法获取的返回值是最后压栈的值(通常是finally语句中的返回值) 所以:在finally里头尽量不要有return,不然会覆盖正常/异常流程的返回结果 注意:finally里面有return,当try出现异常,然后执行catch块中代码,再次出现异常的时候,准备抛出的新异常,会被finally的返回值覆盖,这就隐藏了异常 作业:把try/catch细化,让四条语句都执行 不问过往 直奔前程 为什么我明明很想做事情却又缺乏自律? 因为很多人的自律都只是他律而已。 了不起的阿木木:自律?他律