接口、抽象类和实现类

接口、抽象类和实现类

1. 接口是最抽象的一层,不需要进行任何实现;抽象层可以实现部分接口方法,也可以自定义方法;实现类必须实现所有方法。
2. 接口能被类(抽象类和具体类)实现,区别在于抽象类实现接口,可以实现该接口的方法,也可以不实现该接口的方法;具体类必须实现接口的所有方法
3. 接口可以被接口继承,但不允许被类继承
4. 类之间可以相互继承,而且只能单继承
5. abstract是抽象的意思,在java中,规定只能修饰类或者方法,所以不能修饰属性。被abstract修饰的内容都是暂未被实现的,比如类、方法。属性之所以不能被abstract修饰,是因为属性不存在"尚未被实现"的状态。比如你可能会联想到int age; 或是String name; 但可惜的是,在申明变量时,int会默认给age赋予初始值0,String会默认给name赋予初始值""。因此属性达不到"尚未被实现的状态",从而不能被abstract修饰。
6. 抽象类和普通类在于:抽象类不能进行实例化,一方面抽象方法类似于接口的方法;另一方面,非抽象方法又和普通类方法相同,所以它兼备接口和普通类两种特型。
7. 由于抽象类不能实例化,因此一般是作为父类,由子类进行扩充和实例化,因此,在抽象类的所有protected级别以上的方法或变量,均可以在子类中调用。

  1. 新建2个接口Context和Invocation
    Context
package com.whc.abs;

/**
 * 接口是最抽象的一层,只定义需要实现的接口函数及功能
 *
 * @author Administrator
 * @date 2019/4/11
 */
public interface Context {

    // 接口中定义的成员变量默认为static
    String name = "admin";
    int age = 18;
    
    Object getName();
    Object getAge();
    void set();
}

另一个接口Invocation

package com.whc.abs;

/**
 * @author Administrator
 * @date 2019/4/11
 */
public interface Invocation {
    Object getSrc();
    Object getTar();
    Object getCreateTime();
    Object getCreator();
}

新建一个抽象类AbstractContext

package com.whc.abs;

import java.util.Date;

/**
 * 抽象类实现接口,可以有抽象方法也可以具体实现
 *
 * @author Administrator
 * @date 2019/4/11
 */
public abstract class AbstractContext implements Context, Invocation {

   /**
     * 覆盖接口类的属性name
     */
    public String name = "admin1";

    /**
     * 抽象类可以写新定义的方法
     *
     * @return
     */
    protected String getAccount(){
        return "100";
    }

    /**
     * 可以在抽象类实现接口的方法
     *
     * @return
     */
    @Override
    public Object getName(){
        return "admin";
    }

    /**
     * 抽象类中可以定义类似接口函数,但必须加上abstract字段
     *
     * @return
     */
    abstract Object getEmail();

    /**
     * 抽象类实现接口的方法
     *
     * @return
     */
    @Override
    public Object getCreateTime() {
        return new Date();
    }

    /**
     * 抽象类实现接口的方法
     *
     * @return
     */
    @Override
    public Object getCreator() {
        return "administrator";
    }
}

抽象类实现类AbstractContextImpl

package com.whc.abs;

/**
 * @author Administrator
 * @date 2019/4/11
 */
public class AbstractContextImpl extends AbstractContext {

    /**
     * 可以在实现类中覆盖抽象类已有的方法
     *
     * @return
     */
    @Override
    public Object getName() {
        return "guest";
    }

    /**
     * 接口中的方法需要实现
     *
     * @return
     */
    @Override
    public Object getAge() {
        return "25";
    }

    /**
     * 接口中的方法需要实现
     */
    @Override
    public void set() {

    }

    /**
     * 接口中的方法需要实现
     *
     * @return
     */
    @Override
    Object getEmail() {
        return null;
    }

    /**
     * 接口中的方法需要实现
     *
     * @return
     */
    @Override
    public Object getSrc() {
        return null;
    }

    /**
     * 接口中的方法需要实现
     *
     * @return
     */
    @Override
    public Object getTar() {
        return null;
    }

    public static void main(String[] args) {
        AbstractContext context = new AbstractContextImpl();
        System.out.println(context.name);//访问的是AbstractContext的name成员,它覆盖了接口类的静态成员name
        System.out.println(context.age);//访问的是接口定义静态变量age
        System.out.println(context.getAccount());//访问的是抽象类自定义实现的方法
        System.out.println(context.getName());//访问的是本实现类的方法,因为实现类对抽象类的方法进行了覆盖
        System.out.println(context.getAge());//访问的是本实现类的方法,实现了Context接口的方法
    }

}

输出结果:

admin1
18
100
guest
25

github地址:

https://github.com/wuhc2006/springboot-practice/tree/master/springboot-thread/src/main/java/com/whc/abs

猜你喜欢

转载自blog.csdn.net/gaotanpan3666/article/details/89279104