Java面向对象部分重点笔记(二)
接口
声明类的关键字是class,声明接口的关键字是interface
接口的作用: 1.接口是一种约束 2.定义一些方法,让不同的类实现 3.接口中的方法都是默认 public abstract 4.接口中的变量都是默认 public static final 常量 5.接口不能被实例化,因为接口中没有构造方法 6.implements 可以实现多个接口,但是必须要重写接口中的方法
接口和抽象类的区别
区别点 | 接口 | 抽象类 |
---|---|---|
含义 | 接口通常用于描述一个类的外围能力,而不是核心特征。类与接口之间的是-able或者can do的关系。 | 抽象类定义了它的后代的核心特征。派生类与抽象类之间是is-a的关系。 |
方法 | 接口只提供方法声明。 | 抽象类可以提供完整方法、缺省构造方法以及用于覆盖的方法声明。 |
变量 | 只包含public static final常量,常量必须在声明时初始化。 | 可以包含实例变量和静态变量。 |
多重继承 | 一个类可以继承多个接口。 | 一个类只能继承一个抽象类。 |
实现类 | 类可以实现多个接口。 | 类只从抽象类派生,必须重写。 |
适用性 | 所有的实现只是共享方法签名。 | 所有实现大同小异,并且共享状态和行为。 |
简洁性 | 接口中的常量都被默认为public static final,可以省略。接口中的方法被默认为public abstract。 | 可以在抽象类中放置共享代码。必须用abstract显式声明方法为抽象方法。 |
添加功能 | 如果为接口添加一个新的方法,则必须查找所有实现该接口的类,并为它们逐一提供该方法的实现。 | 如果为抽象类提供一个方法,可以选择提供一个缺省的实现,那么所有已存在的代码不需要修改就可以继续工作。 |
内部类
-
内部类就是在一个类的内部再定义一个类,比如A类中定义一个B类,那么B类相对于A类来说就称为内部类,而A类相对于B类来说就是外部类了。
-
内部类分为:
-
成员内部类
-
静态内部类
-
局部内部类
-
匿名内部类
-
异常
要理解Java异常处理是如何工作的,需要掌握以下三种异常
-
检查性异常: 最具代表的检查性异常时用户错误或问题引起的异常,这是程序员无法预见的的。例如要打开一个不存在文件时,一个异常就发生了,这些异常再编译时不能被简单地忽略。
-
运行时异常: 运行时异常时可能被程序员避免的异常。与检查性异常相反,运行时异常可以再编译时被忽略。
-
错误 (Error) : 错误不是异常,而是拓宽i程序员控制的问题。错误再代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。
Error
Exception
用户自定义异常
-
用户自己定义异常类,只需继承Exception类即可
在程序中使用自定义异常类,大体可分为以下几个步骤:
-
创建自定义异常类
-
在方法中通过throw关键字抛出异常对象
-
如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理;否则在方法的声明出通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作
-
在出现异常方法的调用者中捕获并处理异常
Lambda表达式语法
Java 8中引入了一个新的操作符,“->”可以称之为箭头操作符或者Lambda操作符。当使用Lambda表达式进行代码编写时就需要使用这个操作符。箭头操作符将Lambda表达式分成左右两部分,在操作符的左侧代表着Lambda表达式的参数列表(接口中抽象方法的参数列表),在操作符的右侧代表着Lambda表达式中所需执行的功能(是对抽象方法的具体实现)。Lambda表达式的语法格式如下:
(parameters) -> expression或(parameters) ->{statements; }
上述语法还可以写成以下几种格式:
无参数无返回值:() -> 具体实现
有一个参数无返回值: (x) -> 具体实现 或 x -> 具体实现
有多个参数,有返回值,并且Lambda体中有多条语句:(x,y) -> {具体实现}
若方法体只有一条语句,那么大括号和return都可以省略。
注意:Lambda表达式的参数列表的参数类型可以省略不写,可以进行类型推断。在Java 8之后可以使用Lambda表达式来表示接口的一个实现,在Java 8之前通常是使用匿名类实现的。
Ø Lambda表达式案例
接下来通过代码讲解Lambda表达式的使用,编写一个能够实现加、减、乘、除功能且能够实现输出字符串功能的案例。首先chapter05项目的根目录下创建lambda包,在该包下创建MathOne接口,该接口中定义一个带有两个参数的operation方法,