码迷,mamicode.com
首页 > 其他好文 > 详细

抽象类和接口抽象类和接口

时间:2021-01-05 10:56:48      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:final   private   strong   出现   完全   面试题   作用   efault   lan   

抽象类

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

在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();//使用这个方法告诉调用子类和调用父接口的哪一个默认方法
    }
}

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

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

抽象类和接口抽象类和接口

标签:final   private   strong   出现   完全   面试题   作用   efault   lan   

原文地址:https://www.cnblogs.com/muhexiong/p/14220113.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!