抽象类
abstract修饰的类被称为抽象类
修饰的方法被称为抽象方法
抽象类不能够被直接实例化只能通过子类进行实例化
举个例子:
定义一个Animal抽象类
如图:
再定义一个Duck子类:
如图:
创建一个Demo来当测试类:
如图:
运行结果为:
通过这个案例可以总结:
1.抽象类不能被实例化,只能同过子类继承实现
2.抽象类中可以有普通方法,但是普通类中不可以有抽象方法
3.抽象方法只能通过子类覆盖的方式进行实现
作用:
通过继承实现代码复用,减少冗余代码
接口
intreface关键字表示接口
implements关键字表示实现一个接口
特点:
Java中类不能多继承但是可以多实现
接口中的方法都是抽象方法
接口中的变量都是常量
接口中的常量可以不用abstract抽象方法也可以不用写
举个例子:
定义一个USB接口:
如图:
定义一个键盘类:
如图:
定义一个鼠标类:
如图:
接着创建一个Demo测试类:
如图:
运行结果:
接口和抽象类的区别:
1.定义方式:
接口:接口定义了一组方法的签名(即方法名、参数列表和返回类型),但没有方法的实现,接口中的方法默认是public abstract的,字段默认是public static final的(Java 8 之后接口也可以有默认方法和静态方法)
抽象类:抽象类可以包含抽象方法(没有方法体的方法),也可以包含具体方法(有方法体的方法)。抽象类通过abstract关键字进行声明,并且可以有构造方法
2.多继承:
接口:Java中的类可以实现多个接口(多继承),这允许类在不同的接口定义的行为中进行适配和实现
抽象类:Java中的类只能继承一个类(单继承),但是可以是实现多个接口
3.构造方法:
接口:接口不能包含构造方法,因为接口中没有状态(字段)可以初始化
抽象类:抽象类可以有构造方法,并且抽象类的构造方法可以被子类调用以初始化抽象类的状态
4.成员访问权限:
接口:接口中的方法默认是public的,字段默认是public static final的
抽象类:抽象类中的抽象方法可以有不同的访问控制符(public、protected、default),具体方法可以有任何访问控制符
5.用途和设计理念
接口:接口用于定义一种契约,描述了类应该具有的方法,但并不关心实现的细节。接口提供了一种多态性的实现方式,使得不通过的类可以共享相同的行为
抽象类:抽象类则更适合用于定义一些通用的功能,并且可以包含一些默认的实现。它更多的用于代码重用和继承的设计中。
Java不允许多继承,但是可以多实现
面向对象之多态
概念:
一种事物多种不同的表现形式
前提:
继承
好处
1.可以使用父类中的公有的属性和方法有利于代码的重复利用,减少了代码冗余
2.提高了代码的灵活性和可扩展性,能够以统一的方式处理不同类的对象
3.是的代码更容易理解和维护,提高了代码的可读性
举个例子:
创建一个Animal接口:
如图:
创建一个Dog类:
如图:
创建一个Bird类:
如图:
创建一个FIsh类:
如图:
创建一个Demo测试类:
如图:
运行结果为:
Object类
Object类是所有类的父类,也可以称为基类
异常
在计算机程序中,代码出现了能够解决的错误叫做异常
Error:称为错误类,它表示在Java运行时产生的系统内部的错误或者资源耗尽,是比较严重的,仅靠修改程序本身是不能恢复运行的
Expetion:称为异常类,它表示程序本身可以处理的错误,在Java程序中进行的异常处理都是针对于Expetion的
Thorwable是Error和Exception的父类
当方法抛出异常的时候在其他地方调用该方法需要进行异常处理要么抛出要么try catch处理
异常的分类:
1.编译时异常
处理方式:throws或者try catch
2.运行时异常(RuntimeException)
数组下标越界异常
int [ ] arr = new int [6];
arr [6] = 10;
这个异常不运行不会出现编译错误
3.自定义异常
当出现异常时有两种解决方式:
1.抛出异常,使用throws抛出异常后不解决
2.try catch 捕获异常并解决
举个例子:
如图:
运行结果为:
API
String类StringBuffer类
StringBuffer类:
String和StringBuffer的区别:
由于字符串是常量,因此一旦创建,其内容和长度是不可改变的。如果要对一个字符串进行修改,只能新建字符串,所以JDK中提供了一个StringBuffer类(也称为字符串缓冲区)
举个例子:
System类:
arrayCopy()方法:
Runtime类:
包装类:
基本数据类型 | 包装类 |
byte | Byte |
short | Short |
int | Intger |
long | Long |
float | Float |
double | Double |
bollean | Bollean |
举个例子:
集合
集合按照其存储结构分为两大类:单列集合 双列集合
Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是List和Set
List的特点:元素有序,可重复
Set的特点:元素无序,不可重复
List接口的主要实现类:ArratList和LinkedList
Set接口二点主要实现类:HashSet和TreeSet
Map:双列集合的根接口,用于存储具有键(key)、值(value)映射关系的元素,每个元素都包含一对键值,在使用Map集合时可以通过指定的key找到对应的Value
ArrayList集合
LinkedList集合:
set集合
Set接口和LIst接口一样,都继承自Collection接口
特点:无序,不可重复
HashSet集合
HashSet是Set集合的实现类,它所存储的数据是不可重复的,元素都是无序的
判断是否重复的底层原理:当向HashSet集合中添加一个对象时,首先会调用该对象的HashCode()方法来计算对象的哈希值,从而确定元素的位置,如果此时哈希值相同,在调用对象的equals()方法来确保该位置没有重复元素
举个例子:
创建一个Student类:
创建一个Demo测试类:
Map接口:
Map接口是一个双列集合,它的每一个元素都包含一个键对象key和值对象value,键和值对象之间存在一种对应关系称为映射,从Map集合访问元素时,只要指定了key,就能找到对应的value。
Map接口还有一个实现类Hashtable,它和HashMap的区别在于它是线程安全的
举个例子:
泛型:
先创建一个Student类:
再创建一个Dog类:
再创建一个Demo测试类:
如果使用了泛型HashSet<Student> hashset = new HashSet <> ();那么Dog类就不能添加,只可以由Student类来做添加操作