极客java10

1.匿名类

  • 匿名类是用来创建接口或者抽象类的实例的
  • 匿名类可以出现再任何有代码的地方
1
2
3
4
5
6
7
8
9
10
11
cpu = new UnitSpec() {
@Override
public double getNum() {
return Math.max(5.5,4.6);
}

@Override
public String getProducer() {
return "AMD";
}
};

用匿名类实现抽象类

1
2
3
4
5
6
7
8
9
10
11
private UnitSpecAbs unitSpecAbs = new UnitSpecAbs(4.4,"huawei") {
@Override
public double getNum() {
return 0;
}

@Override
public String getProducer() {
return "华为";
}
};
  • 匿名类可以让我们能快速的创建一个接口或者抽象类的实例
  • 我们需要提供接口,或者抽象类的的抽象方法的实现

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.geekboys.exception;

public class ImplIntfWithEx implements IntfWithEx{

@Override
public void danger() throws NullPointerException{
throw new NullPointerException();
}

@Override
public void safe(){
try {
throw new Exception("");
} catch (Exception e) {
throw new RuntimeException("",e);
}
}
}

  • 接口中声明了抛出异常,实现类可以抛也可以不抛,抛的话必须是接口声明的类或者其子类
  • 接口中没有声明抛出异常,实现类中可以抛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语句
  • 异常不是鳞波微步,异常的创建和处理很消耗资源
你的支持是我最大的动力!
0%