1.匿名类
- 匿名类是用来创建接口或者抽象类的实例的
- 匿名类可以出现再任何有代码的地方
1 | cpu = new UnitSpec() { |
用匿名类实现抽象类
1 | private UnitSpecAbs unitSpecAbs = new UnitSpecAbs(4.4,"huawei") { |
- 匿名类可以让我们能快速的创建一个接口或者抽象类的实例
- 我们需要提供接口,或者抽象类的的抽象方法的实现
2.特殊类的总结
枚举
- 有固定实例的类
- 父类为enum
- 枚举中还有一些方法,比如得到序号,所有枚举的实例
- 两个枚举之间对比可以直接用==
非共有类
- 最不特殊的类,可以认为被缺省访问控制符修饰的类,也就是说和public class的区别仅仅是可以被访问的范围不一样
- 如果一个文件,只有非共有类,那么类名和文件名可以不一样
内部类
内部类的特殊之处在一可见性和可以访问的数据以及方法,内部类会被认为是类本省的代码,所以外部类的private成员对其可见
类里面可以有静态变量,成员变量和局部变量,对比着看,内部类也分为这三种,这个内部类的访问修饰符,可以访问的数据以及可见性都可以对比着记忆
- 静态内部类:可以有访问修饰符,可以再类外部访问,(对比静态变量)
- 成员内部类:可以有访问修饰符,有外部类对象的this自引用(对比成员方法),可以再外部使用,但是创建对象语法需要指明外部对象
- 局部内部类;没有访问修饰符(对比局部变量),有外部类的引用,访问参数和局部变量必须是final 的
内部类可以有父类,可以实现接口
内部类
- 匿名类是一种创建 接口和抽象类对象的语法,任何可以new一个对象的地方,口可以使用匿名类
- 匿名类只能实现/继承一个接口/抽象类,本身没有名字
- 如果是再成员方法或者给成员方法赋值时创建匿名类,那么会有对外部对象的this自引用
- 匿名类也可以访问外部类的private属性
无论是内部类还是匿名类,类都是只有一个,对象可以有多个 ,不会再每次执行内部类声明的地方,就创建一个新的类
3.让我们的超市运转起来:设计篇
设计一个超市
- 主角:超市,消费者,商品,购物车和服务员
- 配角:优惠策略,卡
- 互动模式:超市,消费者和商品封装各自的功能,服务员主导整个过程
- 帮助消费者原则商品结算,处理会员积分
拿到一个功能,先思考和抽象出功能的本质,理清脉络,想清楚这个功能需要那些角色。,然后根据角色和角色之间的互动设计出接口,最后再面向接口编程
5.初识异常:trycatch
- try语句中如果发生了异常(Exception)那么程序就会跳转到catch语句
- java会将异常的相关信息封装再一个异常类的实例中,ex是指向这个异常实例的引用
- “处理”最简单的方法,就是调用printStackTrace将异常信息输出到控制台
- catch语句执行完毕,就会继续向下执行
6.Java中异常的分类
- 异常也是java中的类
- 所有异常的父类:Throwable
- 两类异常:Error 和 Exception
- 看一下?Throwable的继承关系
按照处理方式不同分类
- checked exception:语法要求必须用try catch或者throws语句处理异常
- unchecked exception:语法不要求要用try catch 或者throws语句处理
- Error和RuntimeException是unchecked exception的父类,我们一般用RuntimeException
7.抛出异常的语法
- 可以使用throws关键字,抛出一个异常
- 抛出的异常类型,可以是实际异常的父类或者本身
- 可以抛出多种类型的异常,用逗号分开就可以
抽象方法中声明异常时接口签名的一部分
1 | package com.geekboys.exception; |
- 接口中声明了抛出异常,实现类可以抛也可以不抛,抛的话必须是接口声明的类或者其子类
- 接口中没有声明抛出异常,实现类中可以抛RuntimeException ,也可以不抛
- 如果抛checked exception,就会出错
- 可以catch exception,然后将他封在RuntimeException里
8.Java异常的传递
- 方法一个调一个的层层调用,组成了方法调用栈
- Java异常再方法调用之间的传递
- Java异常的归宿,要么沿着方法调用栈顺序一路抛,最终造成当前线程出错退出,要么catch住
- 线程叫做Thread。我们可以简单的认为是再帮我们执行代码的东西
- 我们可以在方法调用栈的任意一环,处理掉异常
9.自定义异常
- 我们可创建自己的异常继承自Expection或者RuntimeExpection
- catch 语句是根据异常类型匹配来捕捉相应类型的异常
- 如果类型不匹配,catch语句是不会被执行的,异常会继续抛出
- 也就是说catch(Throwable)会捕捉到所有的异常,包括Error,建议最多只捕获Exceededion
- 如果catch一个其实并没有抛出的checked exception,java会报错,因为java知道这个类型的异常不会发生
- 如果catch一个Unchecked exception,Java不会报错
- 如果throws一个其实没有被抛出的checked expection或者unchecked expection,java不会报错
10.异常不是鳞波微步
- 异常代表程序出错,不要使用异常来做正常的程序跳转
- 错误实例:使用凌波微步跳转到catch语句
- 异常不是鳞波微步,异常的创建和处理很消耗资源