【Java】抽象类和接口
目录
若我们强制要要求子类必须复写一些方法就会用到抽象类和抽象方法,编译阶段要求的。
抽象类:
一、抽象类和抽象方法的定义与使用
在面向对象的世界里,一切可以通过类来描述,一切皆对象,但是某些类比较抽象的概念,没法对应到某个具体的实体。
抽象类是在普通类的基础上进行的进一步封装,默写类在当前类的内部有的方法无法给出具体实现,需要延迟到子类中,这些类都应该被定义为抽象类,相关的方法也应该被定义为抽象方法。
1、抽象类
若某些类的信息无法具体描绘一个对象,只是作为具体对象的父类,这样类就可以定义为抽象类。
如果 一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
使用关键字abstract来定义抽象类和抽象方法。
如上图中显示,Dog类,Duck类,Cat类都是动物类,并且他们都有对应的方法Back(),所以他们都可以继承Animal类成为他的子类,同时可以使用Animal类中的back()方法,back()方法在Animal类中可以不需要有具体的实现。在自己的类中对该方法进行自己的具体的实现就好。所以Animal类为抽象类。
2、抽象方法
抽象类需要被abstract修饰,在抽象类中被abstract修饰的方法成为抽象方法。
抽象类是普通类的超集,只是比普通类多了一些抽象方法而已。普通类有的抽象类都有。
抽象方法没有方法体,只有声明。
3、抽象类和抽象方法的使用原则
(1)抽象类不能直接实例化对象,即便抽象类中没有抽象方法,也不能实例化对象,只能通过向上转型引用赋值。
(2)抽象类的子类是普通类,则必须复写所有的抽象方法。若子类是抽象类可以一个抽象方法也不写。
public abstract class Sharp {
abstract void show();
}
public class Cycle extends Sharp{
@Override
void show() {
System.out.println("○");
}
}
Sharp就是一个抽象类,show在其中是一个抽象方法,则他的普通子类Cycle需要复写show,并且在实例化对象时只能new Cycle不能new Sharp,只能通过向上转型实例化。
(3)抽象类必须被继承,抽象方法是需要被子类重写的,所以不能用final和static修饰,也不能用private修饰,没有访问修饰符时默认为default包权限。
(4)抽象类是普通类的超集,抽象类中可以有构造方法和普通方法,构造方法供子类创建对象时,初始化父类的成员变量。
(5)抽象类中不一定有抽象方法,但是有抽象方法的一定是抽象类。
public abstract class Animal {
public String name;
public abstract void bark();
}
public class Dog extends Animal {
public String name;
public Dog(String name) {
this.name = name;
}
@Override
public void bark() {
System.out.println(name+"汪汪汪");
}
public static void main(String[] args) {
Animal dog = new Dog("小狗");
dog.bark();
}
}
如上建立的父类Animal抽象类和子类Dog普通类,在子类中重写了父类的bark抽象方法。
二、接口
在开发中,接口优先原则,能同时使用抽象类和接口的优先考虑接口。
1、定义
表示一种规范,或者表示一种能力或行为。
接口可以看成是:多个类的共同规范,是一种引用数据类型。
2、语法
接口的定义格式与定义类的格式基本相同,将class关键字换成 interface 关键字,就定义了一个接口。
在JDK8之前,接口中只有全局常量和抽象方法,接口是一个更纯粹的抽象类。
一般用I开头表示接口的命名。
3、实现接口
子类和父类之间是extends 继承关系,类与接口之间是 implements 实现关系。
一个普通类实现多个接口时,每个接口中的抽象方法都要实现,否则类必须设置为抽象类。
接口的子类没有太多联系,接口只是多个不同类之间相同的规范,表示一种水平方向上的混合规范。抽象类仍然是继承体系结构的内容,垂直体系,继承体系中子类之间是有很多共性的。
4、接口的使用规则
(1)接口是更加纯粹的抽象类,只有抽象方法和全局变量,没有构造方法,没有普通方法,因此接口仍然无法直接实例化对象。只能通过具体子类向上转型被接口引用接收。
抽象类实现接口,可以不重写抽象方法。
(2)Java中不支持多继承,但是一个类可以实现多个接口。 子类若同时继承一个抽象类,实现多个接口,先用extends继承类,再用implements实现接口,多个接口间逗号隔开。
接口有多继承,接口和接口之间可以用extends继承多个父接口,但是不能继承类。
(3)成员变量默认public static final 修饰,可以省略不写。抽象方法默认为public abstract修饰,也可以省略不写,不写默认是抽象方法。(只有接口中才能省略,其他情况下不写还是默认为default)
重写接口中方法时,不能使用default访问权限修饰,因为之前本身就是public,不能尝试分配更低的访问权限。
接口中的普通方法要有具体实现必须加上default修饰。普通成员方法必须通过具体子类对象来调用。
(4)静态成员方法可以具体实现。
5、接口实现
public interface IRunning {
void run();
}
public abstract class Animal implements IRunning{
public String name;
public abstract void bark();
}
public class Dog extends Animal {
public String name;
public Dog(String name) {
this.name = name;
}
@Override
public void bark() {
System.out.println(name+"汪汪汪");
}
public static void main(String[] args) {
Animal dog = new Dog("小狗");
dog.run();
}
@Override
public void run() {
System.out.println(name+"四只腿跑");
}
}
创建了一个IRunning接口,一个Animal抽象类作为父类,Dog是它的子类,并且Dog实现了接口。在Dog类中将bark和run抽象方法进行重写。
三、抽象类和接口的区别
抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写), 而接口中不能包含普通方法, 子类必须重写所有的抽象方法.
如之前写的 Animal 例子. 此处的 Animal 中包含一个 name 这样的属性, 这个属性在任何子类中都是存在的. 因此此处的 Animal 只能作为一个抽象类, 而不应该成为一个接口。
NO | 区别 | 抽象类 | 接口 |
1 | 结构组成 | 普通类+抽象方法 | 抽象方法+全局变量 |
2 | 权限 | 各种权限 | public |
3 | 子类使用 | 使用extends关键字继承抽象类 | 使用implements关键字实现接口 |
4 | 关系 | 一个抽象类可以实现若干个接口 | 接口不能继承抽象类但是借口可以使用extends关键字继承多个父接口 |
5 | 子类限制 | 一个子类只能继承一个抽象类 | 一个子类可以实现多个接口 |
相关文章
- Java访问重定向接口
- Java NIO.2 使用Path接口来监听文件、文件夹变化
- 深入理解Java的接口和抽象类
- 你所不知道的库存超限做法 服务器一般达到多少qps比较好[转] JAVA格物致知基础篇:你所不知道的返回码 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading) EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public? 藏在正则表达式里的陷阱 两道面试题,带你解析Java类加载机制
- 【JAVA】Eclipse中开启java和xml智能提示功能(图文,已解决!)
- Java if判断对象为null时,null放在比较运算符的左边还是右边?哪种才是java标准?进来看看你就知道了
- Predicate和Consumer接口– Java 8中java.util.function包下的接口
- 使用json-lib进行Java和JSON之间的转换【转载】
- Java接口 详解(二)
- Java集合框架之一:ArrayList源码分析
- Java中的接口和抽象类
- Java学习-084-java.sql.SQLException: Zero date value prohibited 问题解决
- Java通过接口或者抽象类调用方法的时候,怎么知道调用的是哪个实现类里的方法?
- Java 的抽象特性:抽象类与接口深度解析
- 【JAVA】【NIO】10、Java NIO ServerSocketChannel
- Java 抽象类和接口有什么差别
- Java抽象类与接口的区别
- Java基础:抽象类和接口
- 2014-5-22 java.lang.OutOfMemoryError: Java heap space的一次诊断
- C++虚函数virtual,纯虚函数pure virtual和Java抽象函数abstract,接口interface与抽象类abstract class的比较
- java 抽象类和接口
- Java中java.util.Arrays参考指南
- JAVA 抽象类(Abstract Class) 和 接口(Interface) 的区别