java 为什么有抽象类和接口

1.抽象类

class Animal            //创建一个动物类:父类
{
    String name;
    int age;
    public void cry()    //动物会叫
    {
        System.out.println("不知道怎么叫!");    //可是我们不知道它怎么叫
    }
}
class Dog extends Animal    //狗继承了动物类
{
    @Override
    public void cry()    //狗类重写了方法
    {
        System.out.println("汪!汪!");
    }
}
class Cat extends Animal    //猫继承了动物类
{
    @Override
    public void cry()    //猫类重写了方法
    {
        System.out.println("喵!喵!");
    }
}

  猫和狗类虽然继承并重写了父类方法,但是父类方法的方法体一点用都没有!!!
  结果:这就是  父类方法的不确定性 。所以用抽象类来把父类的设计的抽象,以至于它都没有任何具体的事例
  当父类的方法不能够确定时,可以用abstract关键字修饰该方法,被abstarct修饰的方法是抽象方法,被abstract修饰的类叫抽象类。
所以上面的程序可以改为:

abstract class Animal        //抽象类
{
    String name;
    int age;
    abstract public void cry();    //抽象方法,不需要实现这个方法
 
}
class Dog extends Animal
{
    @Override
    public void cry()
    {
        System.out.println("汪!汪!");
    }
}
class Cat extends Animal
{
    @Override
    public void cry()
    {
        System.out.println("喵!喵!");
    }
}

  抽象类需要注意的几点:

(1)抽象类不能被实例化(抽象类必须由子类覆盖定义了父类的所有抽象方法后,子类才能实例化,否则这个子类还是抽象类)。

(2)有抽象方法的类,一定是抽象类,但是抽象类可以没有抽象方法。

(3)当一个类继承的父类是抽象类的话,需要我们把抽象类中的所有抽象方法全部实现。

(4)抽象方法不能有方法体

something:
    1.抽象类中除了抽象方法,还可能有许多一般方法,你可以继承后直接拿去用,提高效率。
    2.抽象类中,已经实现的方法是为了代码复用;待实现的方法是为了限制子类的功能。
    3.简单来说就是设计模式中的模板模式(Template Pattern)。
    4.如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

 

2.接口

public interface Test {
    void delete(String name);
}

public interface Test001 {
    void update(String name);
}

public class ITestImpl implements Test, Test001 {
    @Override
    public void delete(String name) {
    System.out.println("删除");
    }

    @Override
    public void update(String name) {
    System.out.println("更新");
    }
}

  接口的格式是被interface修饰的,不是用class修饰的,接口也是抽象的,使用方法和抽象类有点类似,那为什么要用接口呢?

  接口解决了抽象类的痛点,因为java都是单继承不能实现多继承,接口刚好可以弥补,实现了一个“伪多继承”,实际开发项目都是基于接口来设计的。

注意:接口不能直接使用,必须要有一个"实现类"来"实现"该接口,实现接口中的所有抽象方法

 

3.抽象类和接口的共同点和区别:

共同点 :
  1.都不能被实例化。
  2.都可以包含抽象方法。
  3.都可以有默认实现的方法(Java 8 可以用 default 关键字在接口中定义默认方法)。
  4.实现接口或继承抽象类的普通子类都必须实现这些抽象方法。
区别 :
  1.接口主要用于对类的行为进行约束,你实现了某个接口就具有了对应的行为。
  2.抽象类主要用于代码复用,强调的是所属关系。一个类只能继承一个类,但是可以实现多个接口。
  3.接口中的成员变量只能是 public static final 类型的,不能被修改且必须有初始值,而抽象类的成员变量默认 default,可在子类中被重新定义,也可被重新赋值。
  4.抽象类可以包含普通方法和代码块,接口里只能包含抽象方法,静态方法和默认方法。
  5.抽象类可以有构造方法,而接口没有。
public interface UserService {
   String say();

   default void Hello(){//默认方法
       System.out.println("this is interface Hello()");
   };    
}
@Service
public class UserServiceImpls implements UserService {
    //必须实现
    @Override
    public String say() {
        return "null";
    }
    //可选实现
    @Override
    public void Hello() {
        System.out.println("this is implements Hello()");
    }
}

  调用抽象类中非抽象方法:静态方法类名.方法(static)/  super.方法 (普通方法)

上表格:

参数 抽象类 接口
默认的方法实现 可以有默认的方法实现
Java 8 可以用 default 关键字在接口中定义默认方法
实现 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现
构造器 抽象类可以有 接口不能有构造器
与正常Java类的区别 除了不能实例化抽象类之外,它和普通Java类没有任何区别 接口是完全不同的类型
访问修饰符 抽象方法可以有publicprotecteddefault这些修饰符

接口方法默认修饰符是public,不可以使用其它修饰符

(接口中的变量会被指定为public static final,而方法会被指定为public abstract)

main方法 抽象方法可以有main方法,可以运行它 接口没有main方法,不能运行它
多继承 抽象方法可以继承一个类和实现多个接口 接口只可以继承一个或多个其它接口
速度 它比接口速度要快 接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法
添加新方法 如果往抽象类中添加新的方法,可以给它提供默认的实现。因此不需要改变现在的代码。 如果往接口中添加方法,那么必须改变实现该接口的类。
posted @ 2023-04-17 19:54  壹索007  阅读(73)  评论(0编辑  收藏  举报