抽象类和接口

如果你不相信努力和时光,那么成果就会是第一个选择辜负你的。不要去否定你自己的过去,也不要用你的过去牵扯你现在的努力和对未来的展望。不是因为拥有希望你才去努力,而是去努力了,你才有可能看到希望的光芒。抽象类和接口,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

抽象类

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

在java语言中使用abstract class来定义抽象类

public abstract class MyAbsClasss {

    private int age;

    public MyAbsClasss(){
        this.age = 10;
    }

    public abstract void m2();
    
     //其他包的子类可以访问,相对比较安全
    protected abstract void m1();

    //如果不加修饰符的话,其他包的类如果想要继承这个类的话就不能成功,
    //因为子类必须实现抽象方法,但是default的实现又无法访问
    abstract void m3();
    
   	//private abstract m4(); //编译无法通过,抽象方法必须被继承

}

抽象类的作用是:抽象类是用来捕捉子类的通用特性的,是被用来创建继承层级里子类的模板

综述,抽象类有如下限制 :

  1. 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。

  2. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。

  3. 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。

  4. 构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。

  5. 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。

接口

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

接口里面只是包含方法和静态常量:

public interface MyInterface {

    //public static final  可以省略
    int A = 10;

    //public 可省略
    void getA();

    //接口中不能使用protected,因为接口设计的目的就是对所有类公开
    //protected getB();
}

一道面试题

抽象类和接口的区别是什么?

  1. 接口支持多继承,类只是支持单继承

  2. 从属性和方法两个角度来回答:

    • 接口只能声明常量,抽象类可以声明类变量,成员变量,常量

      public abstract class MyAbsClasss {
      
          private int age;
          protected static String name;
          public static final String gender = "qqq";
      }
      
      public interface MyInterface {
      
          //public static final  可以省略
          int A = 10;
      }
      
    • 接口只能声明抽象方法(1.8之前,1.8之后可以声明静态方法和default方法),抽象类可以声明所有类型的方法

      public interface A {
          void m();
          default void m1(){
              System.out.println("A");
          }
          static void m2(){  
          }
      }
      
      public abstract class AbstractClass {
          public void m1(){
          }
          private void m3(){
          }
          private static void m4() {
          }
          protected void m5(){
          }
          public static void m2(){
          }
      }
      

接口的多实现:

如果接口只有抽象方法的话可以完全不必考虑子类的多继承,但是从jdk1.8之后添加了static和default方法,静态方法无需担心子类的问题,因为静态方法不能被重写,但是default方法却出现了一个小矛盾。试想:如果我们现在有两个接口A和B,里面都实现了**m1()**方法,那么子类C同时继承接口A和B会不会出现什么问题呢?

public interface A {
    default void m1(){
        System.out.println("A");
    }
}
public interface B {
    default void m1(){
        System.out.println("B");
    }
}
//如果不重写m1方法的话,是无法编译通过的
public class C implements A,B {
    @Override
    public void m1() {
		 A.super.m1();//使用这个方法告诉调用子类和调用父接口的哪一个默认方法
    }
}

接口为什么多继承,类为什么单继承?

  • 接口的定义里面只有抽象方法,里面没有方法的具体实现,所以继承多个接口的话只要自己重写方法就可以了,不用考虑相同实现的方法的方法体之间的矛盾
  • 类之间如果允许多继承的话,两个类中有相同的属性和方法该怎么办? 如果不要父类的属性或者方法不就不叫继承了嘛!!!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/202496.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!