一.抽象类
1.抽象类概念和语法
⨀概念:
在面向对象的概念中,所有的对象都是通过类来描绘的,但是并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
⨀语法:
在Java中,一个类如果被 abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法不用给出具体的实现体。
⨀现在我们来用一个实例,来展示一下抽象类的概念和语法形式
2.抽象类特性
⨀抽象类不能直接实例化对象
⨀抽象方法不能是 private 的
被private所修饰的方法在子类中是不可见的,这就导致了我们不能重写该方法
⨀抽象方法不能被final和static修饰
因为抽象方法要被子类重写,但是static和final关键字会阻止方法的重写。
⨀抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必须要使用 abstract 修饰
如果我们不重写抽象方法就会报错
如果我们不想在子类中重写抽象方法,我们可以将子类也修饰为抽象方法,但是记住,出来混迟早是要还的,在之后我们需要在Circle的子类下重写Shape和Circle的所有抽象方法
⨀抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类
⨀抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量
3.抽象类的作用
抽象类本身是不能被实例化, 要想使用, 只能创建该抽象类的子类,然后让子类重写抽象类中的抽象方法,这时我们发现其实我们的普通类也完全可以实现这些功能但是为什么要用抽象类呢?这其实是因为使用抽象类的时候我们可以多一层校验,因为想这样的一类代码实际的完成不应是我们的父类完成,而是由我们的子类来进行实现,如果我们不用抽象类在编译时时不会报错的,但是当我们是抽象类时,一旦我们进行实例化的时候,就会提醒我们错误,这样可以使我们尽早发现问题。
二.接口
1.接口的概念和语法
⨀概念:
接口在我们的生活中比比皆是,例如我们的机箱和笔记本上的USB口,插座上的插座口等等。这些都是我们生活中的接口,但是接口之间也是有着一定的标准的,例如我们的插座口,我们以三个插头接口为例,只要我的符合三个插头接口标准,尽管是不同的家电,也都能给设备进行充电,所以我们可以把接口看成公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。
所以在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型
⨀语法 :
接口的定义格式与定义类的格式基本相同,将class关键字换成 interface 关键字,就定义了一个接口。
⨀定义一个C接口 :
创建接口时, 接口的命名一般以大写字母 I 开头.
⨀注意:在接口中定义的属性默认是 public static final 修饰的,方法默认是 public abstract 修饰的,但是我们默认不写,直接写类型+名字/方法名即可。
⨀注意:由于方法默认是由 abstract 所修饰的,所以在接口中方法全都为抽象方法,没有方法体
2.接口使用
接口不能直接使用,必须要有一个"实现类"来"实现"该接口,实现接口中的所有抽象方法。
注意:接口与类之间是实现关系。所以这时我们又要引入一个新的关键字implements。
public class 类名称 implements 接口名称{
// ...
}
3.接口特性
⨀接口类型是一种引用类型,但是不能直接new接口的对象
⨀接口中每一个方法都是public的抽象方法, 即接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)
⨀接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量
这两个在上文我们已经提到了
⨀接口中的方法是不能在接口中实现的,只能由实现接口的类来实现
这个在上文也提到到了因为方法默认是被public abstract 所修饰的,是抽象的方法,是没有方法体的,所以方法不能在接口中实现,只能由实现接口的类进行重写。
⨀重写接口中方法时,不能使用默认的访问权限
在接口中方法默认是public 修饰的,而在重写是访问限定符不能比原方法严格,范围只能大于等于原方法。而默认访问权限的范围是比public要小的所以不能是用默认访问权限,同时我们也知道public修饰符的范围是最大的,所以我们接口的重写修饰符只能是public.
⨀接口中不能有静态代码块和构造方法
⨀接口虽然不是类,但是接口编译完成后字节码文件的后缀格式也是.class
⨀如果类没有实现接口中的所有的抽象方法,则类必须设置为抽象类
⨀jdk8中:接口中还可以包含default方法
4.实现多个接口
Java中不支持多继承,但是一个类可以实现多个接口。
注意:一个类实现多个接口时,每个接口中的抽象方法都要实现,否则类必须设置为抽象类。
5.接口间的继承
接口支持多继承,即一个接口可以继承多个接口
6.接口的使用
如果我们想要进行对象之间的比大小我们该怎么进行呢?,我们先来看一段代码
像是图片上的两个对象我们如果使用正常的方式去对比,我们其实是比不了的,因为我们不知道是用年龄比还是去用姓名去比,所以我们根本不能进行比较。
如果我们想要进行比较的话,我们就要用到类去实现 Comparable 接口, 并实现其中的 compareTo 方法
注意:我们必须要实现Comparable 接口,并且重写compareTo 方法 让我们知道根据什么进行比较的,才能进行对象的比较。
这时我们又想到了一个于比较相关的问题排序,我们知道在数组中我们可以使用Arrays.sort();方法进行排序
如果我们这时我们想要把在数组里的对象进行排序我们该怎么办呢?
这时我们就要将两方法进行联合使用,实现Comparable 接口,并且重写compareTo 方法和toString()方法,这后再利用sort进行排序
7.Clonable 接口和深拷贝
Java 中内置了一些很有用的接口, Clonable 就是其中之一Object 类中存在一个 clone 方法, 调用这个方法可以创建一个对象的 “拷贝”. 但是要想合法调用 clone 方法, 必须要先实现 Clonable 接口, 否则就会抛出 CloneNotSupportedException 异常.
我们发现这里出现了错误,这是因为我们的clone的返回类型为Object,我们要进行强制类型转换
但是我们转换完之后,发现问题还是存在
这时我们可以在main方法后加上一个throws CloneNotSupportedException就能解决这个异常。
但是如果这时我们想要打印我们所克隆到person2中的name,我们发现还是出现了错误
如果想要解决这个方法就要我们进行接口的实现,即Cloneable接口
深拷贝和浅拷贝
浅拷贝:
深拷贝:
8.抽象类和接口的区别
核心区别: 抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写), 而接口中 不能包含普通方法, 子类必须重写所有的抽象方法
三.Object类
1.Object类的介绍
Object是Java默认提供的一个类。Java里面除了Object类,所有的类都是存在继承关系的。默认会继承Object父 类。即所有类的对象都可以使用Object的引用进行接收
2.获取对象信息
如果要打印对象中的内容,可以直接重写Object类中的toString()方法
3.对象比较的方法equals
在Java中,==进行比较时:
- 如果==左右两侧是基本类型变量,比较的是变量中值是否相同
- 如果==左右两侧是引用类型变量,比较的是引用变量地址是否相同
- 如果要比较对象中内容,必须重写Object中的equals方法,因为equals方法默认也是按照地址比较的
4.hashcode方法
hashCode()这个方法,他能帮我们算一个具体的对象位置,然后调用Integer.toHexString()方法,将这个地址以16进制输出。
我们会认为,当两个方法的对象的成员都相同的时候,认为它们在同一个位置上,如果不重写,当我们使用hashCode的时候,就输出的不一样,比如:
如果我们想要让他们相同的话可以去进行重写
好了今天的分享就到这里了,我们下一篇见!