接口和抽象类

一、java中的接口和抽象类

1.1java中的接口

public interface DialogListener {
    public static final String t="";
    void cancel();
    void show(String str, String str2);
}

在日常的代码书写过程中我们经常会定义类似于这样的接口。但是我们需要注意:
就像String默认是final修饰的一样,接口中定义的方法都是默认用public abstract修饰的 。
此外接口中的变量也是默认用public static final修饰的。

java对接口的限制还是比较大的,默认修饰意味着只能这么来,接口没有构造,不能实例化,声明的抽象方法还不能有方法体,不能有静态代码块。

可能是java设计人员觉得自己对接口的设计太苛刻了些,所以从java8开始支持默认方法和静态方法。

 default void showWaittingDialog(){
        System.out.println("this is a default method");
    };
    static void a(){
        System.out.println("this is a static method");
    }

1.2 java中的抽象类

抽象类的一般定义
public abstract class Dialog {
	private String name;
	private int size;
	public Dialog() {
		// TODO Auto-generated constructor stub
	}
	public void show() {
		System.out.println("this is my dialog");
	}
        public abstract void error();
        static void a() {
		System.out.println("this is a static method");
	}
}

我们可以看到定义一个抽象类好像和平时我们定义一个类没多大区别,只是多了一个abstract关键字。
但是实际上一个抽象类和普通类的区别还是蛮大的。
1.首先我们要明白我们定义抽象类是干嘛的,不就是为了有子类可以继承嘛。所以抽象类的权限修饰符要大于private,不然它就没办法继承了呀。
2.普通类里面不能声明抽象方法,抽象类里面可以包含抽象方法(包含的抽象方法不可以有方法体),也可以不包含。
3.抽象类的子类必须实现抽象类中的抽象方法(除非抽象类的子类还是抽象类,总之当普通类继承抽象类的时候要实现抽象类的抽象方法)

可能有人会觉得,接口和抽象类它们只存在一个就可以满足我们的开发需要了(我怎么可以唯心的打出这句话,罪过),接口和抽象类在日常开发中用的我都想吐了,它们的共存的最大原因就是java中类的单继承和接口的多实现。

1.3 java8接口和抽象类的区别

1.抽象类中的成员变量访问权限不做限制,接口中的成员变量只能用public static final修饰。
2.抽象类中的方法的访问权限可以是大于private的类型,接口中的抽象方法只能是public类型。
3.抽象类中可以有普通方法,静态代码块,构造方法,接口中这些都没有。
4.抽象类的单继承,接口的多实现。

二、kotlin中的接口和抽象类

2.1 kotlin中的接口

kotlin中的接口和java几乎一样

interface Test {
    val name:String
    fun cancel()
    fun show(str:String,str2:String)
    fun showDialog(){      //默认方法
        println("this is a default method")
    }
}

我们可以看到,上例中kotlin接口的定义的函数除了形式上和java中的定义不一样,还有声明静态函数外,其它和java是相同的。

2.2 kotlin中的抽象类

abstract class Dialog {
    abstract val name:String//抽象属性
    val size: Int=10//具体属性
    abstract fun error()
}

kotlin中的抽象类在官网文档中并没有给出明确的解释,但是从它具体的语法结构上我们不难看出kotlin中抽象类的特点
kotlin的抽象类可以声明抽象属性,具体属性和抽象函数。
其它的就是kotlin本身的语法上的特点。