什么是抽象类?什么时候用?什么是接口?抽象类与接口的区别?

什么是抽象类?
Java语言中,用abstract 关键字来修饰一个类时,这个类叫作抽象类。抽象类是它的所有子类的公共属性的集合,是包含一个或多个抽象方法的类。抽象类可以看作是对类的进一步抽象。在面向对象领域,抽象类主要用来进行类型隐藏。
为什么要用抽象类?它存在的意义是什么?
无法完整描述一个类,只能抽象化概念来使用
例如:首先,有一个父类Animal,接着有两个子类,分别是鸟Bird和狗Dog,如下:

public class Animal{
    
    
  public void bark(){
    
    }
}
public class Bird extends Animal{
    
    
  public void bark(){
    
    
    System.out.println("叽叽喳喳~");
  }
}
public class Dog extends Animal{
    
    
  public void bark(){
    
    
    System.out.println("汪汪汪~");
  }
}

可以看到,父类Animal有一个叫唤的方法bark(),两个子类都继承了这个方法,并进行了重写,Bird是叽叽喳喳叫,Dog是汪汪叫,现在的问题是Animal怎么叫?它的bark()方法体里应该输出什么样的叫声,是“汪汪”还是“叽叽喳喳”?

显然,动物是个抽象的集合名词,我们并不知道动物Animal怎么叫,所以,bark()方法在父类中实现不了,或者说实现了没有任何意义,bark()方法只能在子类中根据具体情况去实现。这样的话就可以把父类Animal中的bark()方法声明为abstract抽象方法,此时这个类也成了abstract抽象类。
至此,也就可以回答第一个问题,为什么要用抽象类?抽象类自己并不能实例化,它存在的意义就是为了让子类继承。对于一个父类,它的某个方法在父类中实现没有任何意义,必需在子类中根据具体情况实现,那么这个方法可以声明为abstract抽象方法,此时这个父类也成了abstract抽象类。
抽象类怎么用?
Java中规定用abstract来修饰抽象方法和抽象类。上面的Animal类写成如下形式:

 public abstract class Animal{
    
    
   public abstract void bark();
}

什么是接口?
接口就是一个规范,类似于硬件上面的接口,在电脑主板上的PCI插槽的规范就类似于Java接口,只要是遵循PCI接口的卡,不过是什么牌子的都可以插入到PCI插槽中。所以接口就是一个规范。接口就是某个事物对外提供的一些功能的说明。我们还可以利用接口实现多态功能,同时接口也弥补了Java单一继承的弱点,也就是类可以实现多个接口。

我们使用interface关键字定义接口,一般使用接口声明方法或常量,接口中的方法只能是声明,不能是具体的实现,这一点和抽象类是不一样的。接口是更高级别的抽象。接口的定义格式是:

[访问控制符]interface <接口名> {
类型标识符final 符号常量名n = 常数;
返回值类型 方法名([参数列表]);

}

public interface NameOfInterface
{
    
    
   //任何类型 final, static 字段
   //抽象方法
}

什么是接口?

接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。

除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。

Java里面由于不允许多重继承,所以如果要实现多个类的功能,则可以通过实现多个接口来实现。

接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。

举个最简单的例子,数据库的3种操作,mysql,mysqli以及pdo,它们都可以操作数据库,但是它们的操作方法又不一样,这时候如果我想在我的网站系统里同时加入这3种数据库操作并可以随意选择,而且使用它的人只需要知道一种统一的操作方法怎么办?没错,这时候你就要用接口来开发了。首先你定义一个接口比如叫Db,Db里有3个方法connect,query,close,然后你写3个类mysql,mysqli,pdo都实现这个接口的3个方法(可能数据库的连接不叫connect方法,但是你实现连接的方法已经封装在connect里了)。这时候外面只需要用Db这个接口,他都只需要调用connect,query,close这三个方法就行,而不用管你mysql,mysqli,pdo里都有什么方法,这也就实现了3种数据库随意切换,但是你代码不用改,因为你调用的只有connect,query,close这三个方法

怎么区别抽象类与接口?
抽象类和接口的使用就是is和has的区别:比如人相对于男人,小孩,女人就是is,那么就应该是抽象类,因为他们都是人,有人所有的特点。而可行动相对于人,汽车,飞机就是has,那么就是接口,因为他们有这样的功能,但不具有is的特征。

接口和抽象类的特点区分
1.抽象类里面可以有非抽象方法。但接口里只能有抽象方法,接口体现的是一种规范,抽象类体现的是模板式设计。

2.接口(interface)是抽像类的变体。在接口中,所有方法都是抽像的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽像的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对像上调用接口的方法。由于有抽像类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof运算符可以用来决定某对象的类是否实现了接口

3.接口里不可以定义静态方法,抽象类里可以。接口里的变量全部为静态常量,抽象类里可以有普通变量。

4.接口里不可以有构造函数和初始化块,抽象类里可以有。

5.一个类可以实现多个接口,但只能继承一个抽象类。
请添加图片描述

嘿嘿!喜欢的点个赞再走呗!!!

猜你喜欢

转载自blog.csdn.net/weixin_43474701/article/details/126245838