目录:
一、抽象类:
1、概念:
在面向对象中,所有对象都是由类来创建的,但是呢,并不是所有的类都用来创建类,如果一个类不能描述一个具体的对象,那么这个类就是抽象类。
可以看到,我们的这个父类Shape类中的draw()没有实际的工作,对于图形都是有Shape的子类来完成的,像Shape这种设计为抽象类,而没工作的方法为抽象类。需要使用abstract关键字。
我们知道了抽象类的概念,那么我们要如何使用代码来实现呢?下面我们来看:
2、抽象类语法:
注意:抽象类也是一种类,它内部可以存在属性、方法、构造方法。
3、抽象类的特性:
1)、抽象类不能实例化对象:
2)、抽象方法不能是private:
3)、抽象方法不能被finall 和static修饰:
4)、抽象类必须被继承,并且要重写抽象方法:
那你可能会想,假如我不在子类中重写抽象方法,想在下一个子类中重写,要如何做到这个操作呢?那我们来看代码:
5)、抽象类不一定有抽象方法,但是有抽象方法的一定是抽象类:
4、抽象类的作用:
抽象类本身不能被实例化,如果想要使用的话 ,只能通过子类,然后让子类来重写抽象类的抽象方法。
看到这,就会有疑问,我们普通类也是可以重写方法,也可以被继承,那么我们为什么还要有抽象类呢?
这是因为抽象类呢,相当于添加了一层检验,如果没重写抽象方法会报错,对于普通类就不会报错。
二、接口:
1、接口的概念:
在我们的生活中呢,有很多接口的例子的,比如呢:我们的插座。对于插座来说它可以插很多的东西,比如呢我们的电脑、电视、手机充电器、风扇、抽烟机等等设备。
通过这个例子呢可以看出,对于接口来说就是公共的行为规范标准,只要遵守这个规范标准就可以使用这个接口。
在Java中呢,接口呢就是多个类的公共规范,是一种引用类型。
2、语法:
定义接口呢和定义类差不多,就是将类中的class替换成 interface 。咱们看看如何实现的:
在接口中有一些固定参数咱们来看看:
3、接口的使用:
在我们了解接口之后呢,我们要开始使用接口,下面我们开看看接口要如何使用:
接口不能直接使用,需要有类来实现,并且实现接口中的所有抽象方法。
public class 类名 implements 接口名称 {
}
4、接口的特性:
1)、接口是一种引用,但是不能new对象:
2)、接口中的方法都是默认为 public abstract
3)、接口中的方法不能在接口类中实现,一般由实现接口的类实现。
4)、接口中可以存在变量,但是默认为public static final
5)、接口中不能存在静态代码块和构造方法
6)、接口虽不是类但是在编译后的字节码文件为.class文件
7)、如果这个类没有实现所有的接口的抽象方法,那要把这个类设置为抽象类
5、 实现多接口:
在Java中,不能实现多继承,但是可以实现多接口,对于一个类来说可以继承父类并实现接口:
对于这个例子就是继承并实现单接口。下面让我们看看如何实现多接口:
当一个实现多接口的时候呢,必须要把所有抽象类重写,不然将其设置成抽象类。
6、接口间的继承:
接口继承一个接口呢,需要使用的是extends关键字。直接来看示例:
这个呢就是关于接口间的继承,当继承的实现接口时一定要把所有继承下来的抽象方法都重写。
7、接口的使用:
我们先来看一段代码:
在上面这个自定义的类中的呢,我们两个变量,一个是String和int 那么我们思考一下,我们要根据哪种类型来进行比较呢?这种又是怎么做的呢?
这时候就要用到compareTo这个方法,但是这个方法来自于一个接口,所以我们需要实现Comparable这个接口,并且重写方法。
OK,我们来看看例子:
这里知识两组进行排序,但是要是多组进行比较的话,那么要如何做到?我们在数组那里有一个方法叫做sort排序方法,那么我们来看看直接使用这个方法会出现什么结果:
为什么会出现这个异常呢? 所以,只要是自定义的类型,在当我们要比较大小的时候,我们都需要实现Comparable的接口,并且重写 compareTo方法。
在上面我们使用compareTo的时候,是不是感觉有点麻烦,每次呢,我们只能比较一种成员变量,相比较另一种成员变量的话呢,就需要把改变代码,那么我们有没有一种办法使其可以根据传哪种比较方法就用哪种成员变量呢?
当然可以,我们使用另一种接口来实现,Comparator这个接口来完成,我们看看如何实现:
当然对于String类型也可以这样写:
这些对于比较的接口和方法,先大概了解并且会使用就可以,在后面我们还会进行专题介绍。
8、Clonable接口的使用和深拷贝:
在Java中,存在一些有用的接口,Clonable就是其中一个接口。在Object类中,有一个方法叫clone,可以进行拷贝对象。 那clone和Clonable又有什么关系呢?先让我们来看看clone:
这样就实现了clone的克隆方法,这时候呢就存在了一个问题,我们来看:
但是当我们修改ID的时候,就会出现这种情况:
这种现象就做:浅拷贝。
那么我们怎样才能把克隆的ID进行修改,但又不修改本体的ID呢? 我们看如何做到:
这种现象叫做:深拷贝。
9、抽象类与接口的区别:
最核心的就是:
抽象类可以存在普通方法和成员变量,但是接口里面,必须是抽象方法,必须重写。
三、Object类:
1、介绍:
Object类时Java中默认提供的一个类,在Java中除了Object类之外,所有的类都存在继承关系,都会默认的继承Object类,那么所有的对象都可以用Object类来进行接收。
所以Object是所有类的父类,我们来示范一下:
这次我们对于Object类呢,我们只介绍三种方法,分为toString、equals、hashCode。
2、获取对象的信息(toString):
对于这个方法呢,我们之前就介绍过,在这里呢就不一一道来了,我们直接举个例子过一下:
我们直接重写toStirng方法就可以了
3、对象间的比较方法(equals) :
在Java我们经常使用 == 来进行比较的,对于 == 来说:
1):如果 == 两侧是基本类型变量的话,比较的就是值是否相同
2)、如果 == 两侧是引用类型变量,比较的就是他们的地址是否相同
3)、如果想要比较对象中的内容的话,那么我们要重写equals方法,因为equals方法默认的也是比较地址。 equals的底层代码。比较的也是地址。
那么我们要如何做呢?
当我们要比较对象内容是否相同的时候,我们要重写equals方法
4、hashCode方法:
hashCode这个方法帮我们计算了一个具体的对象位置,用16进制输出,这里呢,涉及到了一些数据结构方面的知识,这里我们只要知道是干什么的,如何使用就可以了。
我们会认为,当两个方法的对象的成员都相同的时候,认为它们在同一个位置上,如果不重写,当我们使用hashCode的时候,就输出的不一样,比如:
所以我们要重写这个方法:
总结:
这次的分享就到这里了,这次的抽象类和接口这个专题,有点多,希望可以耐心看下去,期待我们的下次分享。
下次我们先把类和对象有一个给补充了,在之后,我们实现一个简单的程序,利用学过的知识。拜拜~~