java 8中抽象类与接口的异同

1.java 8中抽象类与接口的异同

相同点:

1)都是抽象类型;

2)都可以有实现方法(以前接口不行);

3)都可以不需要实现类或者继承者去实现所有方法,(以前不行,现在接口中默认方法不需要实现者实现)

不同点:

1)抽象类不可以多重继承,接口可以(无论是多重类型继承还是多重行为继承);

2)抽象类和接口所反映出的设计理念不同。其实抽象类表示的是"is-a"关系,接口表示的是"like-a"关系;

3)接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值;抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。

  接口实例:

public interface Test {
    //接口中的常量定义(必须为其赋值)
     String str = "abd";
     //抽象方法的定义(没有具体的实现)
     String hello();
    //java8新增的默认方法(默认方法实现类可以实现也可以不实现,不实现也能直接调用接口的默认方法)
     default  void meme() {
         System.out.println("测试默认方法");
     }
     //默认方法的重载
     default  void meme(String a) {
         System.out.println("测试默认方法111");
     }
     //包含方法的实现的静态方法(实现类不能重写此方法)
     static  void geg(){
         System.out.println("这是一个静态的方法!!!");
     };
}

实现类:
public class TestImpl implements  Test{
    @Override
    public void meme(String a) {
    }
    @Override
    public void meme() {
        System.out.println("111");
    }
    @Override
    public String hello() {
        return null;
    }
    public static void main(String[] args) {
        TestImpl test = new TestImpl();
        test.meme();
    }
}

抽象类实例:

/**
 *  1.抽象类可以被继承
 *  2.当继承的父类是抽象类时,需要将抽象类中的所有抽象方法全部实现。
 *  3.抽象类中不一定要包含abstrace方法。也就是了,抽象中可以没有abstract方法。
 *  4.一旦类中包含了abstract方法,那类该类必须声明为abstract类。
 *  5.用abstract修饰的类,即抽象类;用abstract修饰的方法,即抽象方法。
 *  6.抽象类不能被实例化。因为抽象类中方法未具体化,这是一种不完整的类,所以直接实例化也就没有意义了。
 */
public  abstract   class StaticTest {
    //抽象类中变量的定义,默认为friendly类型
     String str;
    //抽象方法(只有包含抽象)
    abstract void dada();
     //抽象类中也可以包含普通方法
     public void hehe(){
         System.out.println("第一个方法");
     };
    //抽象类中也可以包含普通方法
     static  void gogo(){
     }
}