抽象类和接口

Posted 张同学吧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了抽象类和接口相关的知识,希望对你有一定的参考价值。

抽象类

抽象类概念

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果
一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类

抽象类形式

public abstract class Animal{
	abstract void animalAbstract();   //定义抽象方法,没有方法体
	
	// 抽象类也是类,也可以增加普通方法和属性
	public void Move(){
		......
	}
	
	protected String type
}

abstract是抽象类的关键字

抽象类特征

  1. 抽象类不能直接实例化对象
  2. 抽象方法没有访问限定符,默认为public
  3. 抽象方法不能被final和static修饰,因为抽象类是必须要被子类继承,并且要被子类重写
  4. 只要类中有一个抽象方法,那么这个类就被称为抽象类

引出接口

继承抽象类的子类都需要把父类中的抽象方法重写,但这样一来程序中就会有太多冗余的代码。同时局限性很大,举个例子:
比如在Animal抽象类中,定义了swim()抽象方法,但并不是所有动物都会游泳。当一些子类不需要重写swim ()方法时也不得不要重写swim(),但时又不能把swim()方法放在另外一个类中(java规定类不能同时继承多个父类),为了解决这些问题,接口便诞生了。

接口

1.接口简介

接口是抽象类的一种延伸,是一个纯粹的抽象类。接口中所有的方法都没有方法体。就上述问题,如果我们把swim()方法封装到一个接口中,需要使用swim()方法的类实现这个接口,同时也可以继承Animal类。

定义

public interface 接口名称{
	// 抽象方法
}

提示:

  1. 创建接口时, 接口的命名一般以大写字母 I 开头.
  2. 接口的命名一般使用 “形容词” 词性的单词.
  3. 阿里编码规范中约定, 接口中的方法和属性不要加任何修饰符号, 保持代码的简洁性

一个类实现一个接口时,可以使用implement关键字

public class Bird extends Animal implements swim{
	...//
}

2.接口特性

  1. 接口类型是一种引用类型,但是不能直接new接口的实例
  2. 在接口中,方法必须被定义为public或者abstract形式,即使不将该方法声明为public形式,它也是public。其他修饰权限不被java认可。
  3. 在接口中定义的任何字段都是final和static的
  4. 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现
  5. 接口虽然不是类,但是接口编译完成后字节码文件的后缀格式也是.class
  6. 重写接口中方法时,不能使用default访问权限修饰
  7. 接口中不能有静态代码块和构造方法

当然一个类可以实现多个接口,代码举例:

定义动物类

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 {
	...
	}
}

接口间的继承相当于把多个接口合并在一起

以上是关于抽象类和接口的主要内容,如果未能解决你的问题,请参考以下文章

聊聊抽象类和接口

抽象类和接口的异同

抽象类和接口在一起?

java 抽象类和接口的差别

抽象类和接口

Java学习笔记—抽象类和接口