目录
抽象类
抽象类的概念
抽象类的语法
抽象类的特性
抽象类的作用
接口
接口的概念
接口的语法
接口特性
实现多个接口
接口间的继承
接口实例
1.Compareable
2.Comparator
3.Clonable 接口和深拷贝
抽象类与接口的区别
Object类
使用Object接收所有类的对象
1.toString()获取对象信息
2.对象比较equals方法
3.hashcode方法
接收引用类型
在了解抽象类和接口前我们先来看一段代码
class Shape{
public void draw () {
System.out.println("画图形");
}
}
class Cycle extends Shape {
@Override
public void draw() {
System.out.println("○");
}
}
class Rect extends Shape {
@Override
public void draw() {
System.out.println("♦");
}
}
public class TestDemo {
public static void drawMap(Shape shape) {
shape.draw();
}
public static void main(String[] args) {
drawMap(new Cycle());
Shape shape=new Rect();
drawMap(shape);
}
}
代码很简单Cycle和Rect继承了Shape类重写了draw()方法,main函数中通过drawMap()方法传递不同对象调用重写的draw()方法完成打印,但是有一个小问题父类中方法实现没有意义可以不写嘛?答案是肯定的,此时就引出了抽象类的概念了,我先实现如何修改
abstract class Shape{
public abstract void draw () ;//抽象方法
}
我们可以将draw()方法用abstract修饰此时变为抽象方法,将Shape类改为抽象类 ,好知道了如何修改我们就来了解抽象类的知识
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类
一个类如果被 abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法不用给出具体的实现体
abstract class Shape{ int a; public void func() { System.out.println("shape"); } public abstract void draw () ;//抽象方法 }
注意:抽象类也是类,内部可以包含普通方法和属性,甚至构造方法
1.抽象类不能实例化
2.普通类继承抽象类必须重写抽象类中的抽象方法(所有)
3.抽象类存在的最大意义就是被继承,发生向上转型进而发生多态
4.当抽象类A继承了抽象类B此时可以不重写B中的抽象方法
5.当普通类C继承了4中的A此时要重写所有的抽象方法
6.final不能修饰抽象方法或者抽象类
7.抽象方法不能是private修饰或者static修饰的
注意:抽象方法没有加访问限定符时,默认是public
8. 抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类
9. 抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量
抽象类本身不能被实例化, 要想使用, 只能创建该抽象类的子类.然后让子类重写抽象类中的抽象方法
在现实生活中,接口的例子比比皆是,比如:笔记本上的USB口,电源插座等,接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用
在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型
接口的定义格式与定义类的格式基本相同,将class关键字换成 interface 关键字,就定义了一个接口
创建接口时, 接口的命名一般以大写字母 I 开头
1.接口使用关键字interface来修饰
2.接口当中的成员方法,只能是抽象方法,默认是public abstract
3.接口当中的成员变量默认是public static final
4.接口当中的方法如果要实现需要default修饰
5.接口当中的静态方法,可以有具体的实现
6.接口不能实例化,接口只能通过 类 implement 接口 来实现接口
在Java中,类和类之间是单继承的,一个类只能有一个父类,即Java中不支持多继承,但是一个类可以实现多个接口
继承表达的含义是 is - a 语义, 而接口表达的含义是 具有 xxx 特性 .
接口可以继承一个接口, 达到复用的效果. 使用 extends 关键字
类和接口间是implements,接口和接口间是extends
我们了解了接口的基本知识来看看3个比较常用的接口
我们这里实现了以年龄进行比较的代码,实现了Comparable
这里是通过实现Comparator
我们看到在实现克隆时需要使用Cloneable接口
这个接口没有任何的实现我们称其为空接口(标记接口)代表当前类是可以被克隆的
接着我们重写Objet类的clone()方法,要注意此时clone()在使用时要进行强转并且要抛出异常,我们就可以完成克隆操作了
实现深拷贝是代码层次上的,不是说某个方法就是深拷贝是在代码的实现上来看的,要达到深拷贝如果有引用这个对象的引用所指向的对象也要进行克隆
核心区别: 抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写), 而接口中不能包含普通方法, 子类必须重写所有的抽象方法
我们在之前提到过Object类接下来我简单总结一下注意与使用
Object是Java默认提供的一个类,Java里面除了Object类,所有的类都是存在继承关系的,默认会继承Object父类,即所有类的对象都可以使用Object的引用进行接收
Object类是参数的最高统一类型,但是Object类也存在有定义好的一些方法
我们重点介绍几个目前常用的方法
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
如果==左右两侧是基本类型变量,比较的是变量中值是否相同
如果==左右两侧是引用类型变量,比较的是引用变量地址是否相同
如果要比较对象中内容,必须重写Object中的equals方法,因为equals方法默认也是按照地址比较的
public boolean equals(Object obj) {
return (this == obj); // 使用引用中的地址直接来进行比较
}
所以我们就需要重写equals方法来比较引用类型内容是否相同
hashCode()这个方法,他帮我算了一个具体的对象位置存在,
public native int hashCode();
这是hashCode的原码,它是native修饰的底层是c/c++实现的我们看不到
我们认为两个名字相同,年龄相同,成绩相同的对象,将存储在同一个位置就要重写hashCode
可以看到此时哈希值相同
结论
1.hashcode方法用来确定对象在内存中存储的位置是否相同
2.事实上hashCode() 在散列表中才有用,在其它情况下没用,在散列表中hashCode() 的作用是获取对象的散列码,进而确定该对象在散列表中的位置
使用Object来接受数组对象
public static void main(String[] args) {
// Object接收数组对象,向上转型
Object obj = new int[]{1,2,3,4,5,6} ;
// 向下转型,需要强转
int[] data = (int[]) obj ;
for(int i :data){
System.out.print(i+"、");
}
}
使用Object接收接口对象
public static void main(String[] args) {
IShape shape=new Cycle();
Object o=shape;//接口给Object
IShape shape1=(IShape) o;//互相转换
shape1.draw();
}
以上就是Java中抽象类和接口的知识总结对你有帮助还请点赞评论支持一下!!!