抽象类和接口
Posted 张同学吧
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了抽象类和接口相关的知识,希望对你有一定的参考价值。
抽象类
抽象类概念
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果
一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类
抽象类形式
public abstract class Animal{
abstract void animalAbstract(); //定义抽象方法,没有方法体
// 抽象类也是类,也可以增加普通方法和属性
public void Move(){
......
}
protected String type
}
abstract是抽象类的关键字
抽象类特征
- 抽象类不能直接实例化对象
- 抽象方法没有访问限定符,默认为public
- 抽象方法不能被final和static修饰,因为抽象类是必须要被子类继承,并且要被子类重写
- 只要类中有一个抽象方法,那么这个类就被称为抽象类
引出接口
继承抽象类的子类都需要把父类中的抽象方法重写,但这样一来程序中就会有太多冗余的代码。同时局限性很大,举个例子:
比如在Animal抽象类中,定义了swim()抽象方法,但并不是所有动物都会游泳。当一些子类不需要重写swim ()方法时也不得不要重写swim(),但时又不能把swim()方法放在另外一个类中(java规定类不能同时继承多个父类),为了解决这些问题,接口便诞生了。
接口
1.接口简介
接口是抽象类的一种延伸,是一个纯粹的抽象类。接口中所有的方法都没有方法体。就上述问题,如果我们把swim()方法封装到一个接口中,需要使用swim()方法的类实现这个接口,同时也可以继承Animal类。
定义
public interface 接口名称{
// 抽象方法
}
提示:
- 创建接口时, 接口的命名一般以大写字母 I 开头.
- 接口的命名一般使用 “形容词” 词性的单词.
- 阿里编码规范中约定, 接口中的方法和属性不要加任何修饰符号, 保持代码的简洁性
一个类实现一个接口时,可以使用implement关键字
public class Bird extends Animal implements swim{
...//
}
2.接口特性
- 接口类型是一种引用类型,但是不能直接new接口的实例
- 在接口中,方法必须被定义为public或者abstract形式,即使不将该方法声明为public形式,它也是public。其他修饰权限不被java认可。
- 在接口中定义的任何字段都是final和static的。
- 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现
- 接口虽然不是类,但是接口编译完成后字节码文件的后缀格式也是.class
- 重写接口中方法时,不能使用default访问权限修饰
- 接口中不能有静态代码块和构造方法
当然一个类可以实现多个接口,代码举例:
定义动物类
class Animal {
protected String name;
public Animal(String name) {
this.name = name;
}
}
public interface IMove { //动物移动接口
void move();
}
public interface IEat { //动物进食接口
void eat();
}
public interface ISwim { //动物游泳接口
void swim();
}
public interface IFly { //动物飞行接口
void fly();
}
猫,可以走路可以进食
class Cat extends Animal implements IEat, IMove {
public Cat(String name) {
super(name);
}
@Override
public void eat() {
System.out.println(this.name + "在吃鱼");
}
@Override
public void move() {
System.out.println(this.name + "敏捷地跑");
}
}
狗,可以走路可以进食可以游泳
class Dog extends Animal implements IWalk,IEat,ISwim{
public Dog(String name) {
super(name);
}
@Override
public void eat() {
System.out.println(this.name + "在啃骨头");
}
@Override
public void move() {
System.out.println(this.name + "飞快地跑");
}
@Override
public void swim() {
System.out.println(this.name + "在狗刨");
}
}
青蛙,可以游泳可以走路
class Frog extends Animal implements IWalk, ISwim, IEat{
public Frog(String name) {
super(name);
}
@Override
public void run() {
System.out.println(this.name + "往前跳");
}
@Override
public void swim() {
System.out.println(this.name + "蹬腿游");
}
@Override
public void eat() {
System.out.println(this.name + "吃飞虫");
}
}
class Bird extends Animal implements IEat,IWalk,IFly{
public Bird(String name) {
super(name);
}
@Override
public void eat() {
System.out.println(this.name + "在吃虫子");
}
@Override
public void fly() {
System.out.println(this.name + "自由的飞翔");
}
}
注意:一个类实现多个接口时,每个接口中的抽象方法都要实现,否则类必须设置为抽象类
上面的代码展示了 Java 面向对象编程中最常见的用法: 一个类继承一个父类, 同时实现多种接口…继承表达的含义是 is - a语义, 而接口表达的含义是 具有 xxx 特性 .
这样设计有什么好处呢? 时刻牢记多态的好处, 让程序猿忘记类型. 有了接口之后, 类的使用者就不必关注具体类型,
而只关注某个类是否具备某种能力.
接口间的继承
在Java中,类和类之间是单继承的,即一个类只能有一个父类,但是一个类与接口之间是多实现的,即一个类可以
实现多个接口,接口与接口之间可以多继承。即:用接口可以达到多继承的目的。
接口可以继承一个接口, 达到复用的效果. 使用 extends 关键字.
interface IRunning {
void run();
}
interface ISwimming {
void swim();
}
// 两栖的动物, 既能跑, 也能游
interface IAmphibious extends IRunning, ISwimming {
class Frog implements IAmphibious {
...
}
}
接口间的继承相当于把多个接口合并在一起
以上是关于抽象类和接口的主要内容,如果未能解决你的问题,请参考以下文章