java基础知识——19.抽象与接口

Posted L纸鸢

tags:

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

这篇文章我们来学习一下抽象与接口

目录

1.抽象

1.1 引出

1.2 抽象方法与抽象类

1.3 实际演示

2.接口

2.1接口的由来

2.2 接口的介绍

2.2.1接口的定义和使用

2.2.2 接口中成员的特点

2.2.3 接口和类之间的关系

2.2.4 实际演示

2.3 接口小结

3.小结


1.抽象

首先,我们来看一下抽象,抽象分为抽象类与抽象方法,二者其实都差不多,下面,我们来看一下。

1.1 引出

抽象是面向对象的一部分,为了说明抽象的由来,我们先来回顾一下面向对象的三大特征。

首先是封装,就是将变量和方法给封装起来,当做类,当做一个模板。然后是继承,就是当有许多相同的类时,重复写很麻烦,我们抽取它们相同的变量和方法,将其封装起来,当做父类,然后其余的类继承它,写上自己独有的变量和方法,或者是重写父类的方法。多态呢,就是父类引用指向子类对象。

抽象是在继承的基础上提出的。在继承中我们会遇到这样一个问题,我们把一个方法抽取到父类中,如果写上具体的内容,那么有的子类可能就不适用了。为了解决这个,我们是在父类中的方法中随便写一点,然后子类继承时重写方法。但是这个方法有一个小小的弊端。就是当别人使用时,不一定知道要重写这个方法。那怎么办呢?继承后强制其重写方法,不写就报错。这就是抽象方法。有抽象方法的类叫抽象类

1.2 抽象方法与抽象类

抽象方法:共性的行为(方法)抽取到父类之后。由于每一个子类执行的内容是不一样的,所以,在父类中不能确定具体的方法体。该方法就可以定义为抽象方法

抽象类:如果一个类中存在抽象方法,那么该类就必须声明为抽象类

抽象方法定义格式:

    public abstract void work();

注意:抽象方法不加 ,即不写方法体。

抽象类定义格式:

public abstract class  Person 

注意:抽象类是在class前面加上 abstract 

抽象类与抽象方法的注意事项:

  • 抽象类不能实例化
  • 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
  • 抽象类可以有构造方法
  • 抽象类的子类,要么重写父类中的所有抽象方法,要么本身也是抽象类

1.3 实际演示

下面实际演示一下抽象类与抽象方法的使用:

Person类:

package Day0402;

public abstract class  Person 

    private String name;
    private int age;

    //作用:当创建子类对象的时候,给属性进行赋值
    public Person() 
    

    public Person(String name, int age) 
        this.name = name;
        this.age = age;
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public int getAge() 
        return age;
    

    public void setAge(int age) 
        this.age = age;
    

    public abstract void work();

    public void sleep()
        System.out.println("睡觉");
    

Student类:

package Day0402;

public class Student extends Person

    public Student() 
    

    public Student(String name, int age) 
        super(name, age);
    

    @Override
    public void work() 
        System.out.println("学习");
    

测试类:

package Day0402;

public class Test 
    public static void main(String[] args) 
        Student student = new Student("张三",20);
        System.out.println(student.getAge());
        System.out.println(student.getName());
    

结果:

 很简单,说白了,就是强制重写方法的继承

2.接口

下面,我们来介绍一下接口

2.1接口的由来

首先,我们来介绍一下接口的由来

要说接口的由来,就必须要再提一下前面讲的面向对象的三大特征。我们将变量与方法进行封装,封装成一个类,需要时直接new这个类的对象。而对同一类型的类,我们可以抽取里面相同的变量与方法,将其封装成父类,然后其余的类再继承它就行。但是有一个问题,就是所有在子类中,如果有90%有这个方法,10%没有这个方法,请问要不要把这个方法写到父类中?如果写的话,那就说明10%没有这个方法的类也会继承这个方法,这明显不合适。如果不写,那就要在剩下的90%的类中每一个都单独的写这个方法,属实比较麻烦。怎么办呢?用接口。接口就是一种规则,是对方法的抽象

下面通过一个简单的案例,来讲一下接口在实际中的应用

就比如我们定义一个搬家的方法,你传入搬家的工具,它给你实现搬家的功能。我们可以在参数列表中定义车,只要是车的子类都可以(因为多态),但是你不能传入搬家公司,因为它不是车的子类。

那怎么解决呢?我们来思考问题,我们要实现的是搬家的功能,不管你用什么方法,只要能搬家就行。所以现在搬家就是一种功能,是一种方法,是一种规则,我们可以定义一个接口,实现对方法的抽象,我不管你怎么搬,只要搬了,那就行。

接口与抽象类的不同点:

乍一看,接口与抽象类好像一样,但仔细想想,它们是不同的。抽象类是里面有抽象方法,当继承时,所以子类都会继承重写这个方法,意思就是,所有子类都有,但是具体到每一个子类中,却又不相同,那就是抽象类。而接口却是,有点类有,有的类没有,那就定义接口。接口实际上是对方法的抽象。

2.2 接口的介绍

下面,我们来详细的介绍一下接口

2.2.1接口的定义和使用

接口的定义格式:public interface 接口名

接口的使用:

  • 接口不能实例化(就是你不能new出一个实例接口,如果非要new,那必须重写里面的方法)
  • 接口和类之间是实现关系,通过 implements 关键字表示,格式如下:
  • public class 类名 implements 接口名  
  • 接口的子类(即实现类),要么重写接口中的所有抽象方法,要么是接口类

注意事项:

接口和类之间是实现关系,可以单实现,也可以多实现,例如:

public class 类名 implements 接口名1,接口名2

实现类还可以继承一个类的同时实现多个接口。例如:

public class 类名 extends 父类 implements 接口名1,接口名2

2.2.2 接口中成员的特点

成员无非就是成员变量,成员方法等内容

成员变量:接口中的变量只能是常量,且默认修饰符为:public static final

构造方法:没有

成员方法:只能是抽象方法;默认修饰符为 public abstract

JDK7以前:接口中只能定义抽象方法

JDK8的新特性:接口中可以定义有方法体的方法

JDK9的新特性:接口中可以定义私有方法

2.2.3 接口和类之间的关系

类和类之间的关系:继承关系,只能是单继承,不能是多继承,但是可以多层继承

类和接口的关系:实现关系,可以是单实现,也可以是多实现,还可以在继承一个类的同时实现多个接口

接口和接口的关系:继承关系,可以是单继承,也可以是多继承

2.2.4 实际演示

下面来实际演示一下:

 

2.3 接口小结

下面,来小结一下接口。

接口的语法规则简单,重点是要理解。接口说白了就是一种规则,是对方法的抽象,是方法的集合,接口实现了java没有的多继承功能。一般来说,接口里面全是抽象方法,我们把所有的方法都放到接口里面,然后让实现类来实现接口,并赋予实现类那些方法的功能,这样一想,是带点强制性的。并且,也可以用接口的引用指向实现类的对象

3.小结

这篇文章,我们学了抽象类和接口。从宏观层面说,抽象类是属于类的封装,接口是属于方法的封装,二者的共同属性是继承,而因为有了继承,就会出现多态现象。翻来覆去,就是那6个字:封装,继承,多态封装是最最根本的思想,封装之后出现了继承,而多态就是为了解决继承的遗留问题而提出的

Java——基础知识——抽象类与抽象方法接口

如有不妥之处欢迎指正



抽象方法

  • 没有方法体的方法
  • 抽象方法要求结尾必须加分号
  • 修饰符必须带有abstract
  • 必须在抽象类内,抽象类内不一定全是抽象方法
abstract class A
{
   abstract public void f();
}

抽象类

  • 不能实例化对象的类
  • 利用抽象类可以更加方便地对类进行分类
  • 抽象类通常是一个类组最顶层的父类
  • 抽象类内可以有非抽象方法
abstract class A
{
   abstract public void f();  //抽象方法
   
   public void f2()           //非抽象方法
   {
       
   }
   
   int a;
}

接口(interface)

更加严格的抽象方法

接口要求

  • 接口中的属性(成员变量)必须是public static final 的
  • 接口中定义的方法必须是 public abstract
  • 以上修饰符可以省略不写
  • 接口中的属性不能被更改
  • 一个类只能实现(implements)某个接口,不能继承接口
  • 接口可以继承接口,且可以一次继承多个接口
  • 一个类只实现了一个接口的部分方法,那么该类必须被声明为抽象类
  • 一个类可以在继承某个父类的同时实现某个或多个接口,但是extends关键字必须在implements之前
  • 不可以new接口(对接口实例化),但是可以定义一个接口引用类型的变量并将其指向实现接口的对象,以达到多态的目的

定义接口

interface It
{
    int i=20;
    abstract void f();
}

接口的实现和使用

interface It
{
    int i=20;
    abstract void f();
}

class A implements It  //实现接口
{
   public void f()
   {
       System.out.printf("%d\\n",i);
   }
}

class B extends A implements It		//先继承再实现
{

}

public class Main
{
    public static void main(String [] args)
    {
        A a = new A();

        a.f();
    }
}

接口的继承

interface A
{
    
}

interface B extends A
{
    
}

interface C extends B //C接口此时拥有A和B接口的所有属性
{
    
}

interface D
{

}

class I implements B,D  //I此时实现了ABCD接口
{
   
}

以上是关于java基础知识——19.抽象与接口的主要内容,如果未能解决你的问题,请参考以下文章

Java基础知识回顾-19(Collect接口,Iterator迭代器与增强for循环)

“全栈2019”Java第六十三章:接口与抽象方法详解

Java开发不得不会!java问答社区源码

No_16_0229 Java基础学习第九天

Java——基础知识——抽象类与抽象方法接口

java基础知识-11:抽象类与接口