一.抽象类
1.抽象类的概念:如果一个类中没有包含足够的信息来描述一个具体的对象,这样的类就是抽象类。(图例说明:)
2.抽象方法的概念:当一个方法被abstract来修饰,此时代表着这个方法可以不进行实现,此时的方法就成为抽象方法。
3.抽象类:如果一个类当中,包含抽象方法,此时这个类就必须是抽象类。但是没有抽象方法,这个类也可以写为抽象类。
4.当不能描述一个具体的对象的时候,这个类可以被定义为抽象类。
5.抽象类中定义的成员和普通类没有区别。
6.抽象类不可以被实例化,所以抽象类是为了被继承。
7.当一个普通类继承这个抽象类之后,必须重写抽象类当中的抽象方法。
8.抽象类也可以发生多态:
9.此时抽象方法也要满足重写的条件。(被final 或者 static 或者 private修饰的方法不能重写的)
10.当一个普通类A继承了一个抽象类,不想重写这个这个抽象类的方法,此时可以把普通类A改为抽象类,但是如果抽象类A被普通类B继承了,那么B中就要重写A继承的抽象类中的方法和A中抽象的方法。
二.接口(实现某种功能)
1.概念:多个类的公共规范。
2.定义接口使用关键字interface。
3.接口当中的成员变量默认为public static final修饰的,所以定义的时候必须初始化。(这里的public static final也是可以省略的)
4.接口当中的方法默认是public abstract修饰的。(抽象方法是没有具体实现的)
5.接口当中使用default和static修饰的方法可以具体实现。(test3也是可以重写的只是没有进行演示)
6.接口和抽象类一样不能被实例化。
7.接口需要被类实现,需要使用关键字implements实现(implements就是让类实现接口)
8.当一个类实现了一个接口,那么这个类就要重写这个方法。
9.接口可以发生向上转型,也可以发生动态绑定,也可以发生多态。
10.接口当中不能有静态代码块 实例代码块 和 构造方法。
11.接口虽然不是类,但是编译完成之后字节码文件的后缀格式也是.class。
12.实现多个接口:
13.接口解决了多继承的问题: (若需要继承父类需要先extends再implements)
14.这里还可以让使用者忘记类型,有了接口就可以不用关注具体类型,而只关注某个类是否具有这个功能。
15.接口也可以使用extends来扩展:
16.用接口来完成引用数据类型的比较:(要重写Comparable中的方法)
17.字符串的比较大小要用compareTo:(这里的compareTo和上述重写的compareTo不一样)
18.Compareble接口有局限性,一旦这个类写死了一种比较方式,后期就不能随意进行更改。
三.Clonable接口(任何一个类默认都是继承于Object类的)
1.由于要使用Object中的clone方法是protected,那么这个访问修饰限定符是最多只能在不同包的子类中访问的。所以我们只能通过super来访问它的克隆方法。
2.在自定义类中重写一个clone方法:
3.这里保存是因为这是调用的Object这个父类的方法,所以这里需要向下转型。
4.还报错的原因是异常的这个原因,这个在后面异常课件中讲解。
5.正确的话就是这样的:
6.代码正确但是运行报错:
7.解决方法是必须一个克隆的接口:
8.这个接口为什么没有抽象方法:(在我们使用这个接口的时候都没有重写方法)
9.因为此时这个接口叫做空接口或者标记接口。当这个接口被实现了,才能证明有被克隆这个功能。
10.克隆示意图:
四.比较器
1.比较器的实现:(年龄比较器)
2.比较器中也有要重写的方法:
3.比较器这个类中有了这个功能后的重写方法:
4.比较器的用法:(先实例化比较器的类对象,在通过比较器的类来调用重写的方法,传入引用就可以进行比较)
五.Arrays.sort方法和比较器联动
1.这是Arrays.sort里面的参数,目前先简单的理解为可以传入一个数组和一个Comparator
2.使用自己的Comparator来排序:
3.此时我们把nameComparator传入Arrays.sort中时,就是发生了向上转型,使排序使通过我们重写的compare进行的。这里就发生了动态绑定。
六.深浅拷贝
1.浅拷贝:
浅拷贝会通过克隆过的对象来改变原来的数据。
2.深拷贝:在上述的浅拷贝中,money的值会被克隆后的对象进行修改,是因为在拷贝之后试student2中克隆过来的是age=10和m中存储money的地址。m的地址又指向了money就与student1中的m中存储的money的地址是一样的。所以在student2中修改money的值也会把student1中的money的值改变。所以就需要让m也进行一次克隆,也就是深拷贝了。
3.深拷贝的实现:首先我们需要让money类和student类一样来实现接口,才能使用克隆。
然后我们在student的类中来克隆m。(因为其中调用clone都是Object类中的方法,所以需要调用父类的方法,然后我们这里是通过子类来调用父类的方法,那么就是向下转型)
示意图:
七.接口和抽象类的区别
1.核心区别:抽象类中可以包含普通的字段和方法,在子类中可以被直接调用(不需要重写)。而接口中并不存在普通方法,每一个方法都是抽象方法,并且字段都是public static final修饰的,子类也必须重写接口中所有的抽象方方法。
2.图表: