/*
接口:
接口中可以含有 变量和方法。
1.接口中的变量会被隐式指定为public static final变量
2.方法会被隐式指定为public abstract方法且只能是public abstract方法
并且接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法但接口支持多继承。
而抽象类:
在讲抽象类之前,要先讲讲抽象方法,抽象方法是一种特殊的方法:
它只有声明,而没有具体的实现。
而当一个类中有了抽象方法,他就是一个抽象类了,
抽象类必须被abstract修饰。抽象类中有静态代码块和静态方法,也可以有成员变量和方法。但方法必须是被实现的。
*/
package cn.ys.test;
public abstract class TestFinalAbstract {
//final与abstract不能同时修饰同一个类
final double value =11111;
static int s =111111;
static {
int via=0;
}
public static void test() {
}
public void test1(String a) {
}
abstract void TestFinalAbstract();
abstract void TestFinalAbstract1();
}
class TestExtendAbstract extends TestFinalAbstract implements TestInterface{
void TestFinalAbstract() {
}
void TestFinalAbstract1() {
}
public void Test() {
}
}
/*而两者的区别可以这么来讲:
一、从表面上来看:接口比抽象类更加的抽象
1.接口中不能有方法的实现,静态代码块,
而抽象类可以有实现的方法(包括静态方法),静态代码块;
2.接口的成员变量只能是public static final修饰的,而抽象类不是;
3.接口支持多继承,java中类以及抽象类都不支持,而类支持多接口实现
二、设计层面来看
1.抽象类的是为了描述一个类,也就是一类对象的抽象,
而接口是对对象行为的抽象
打个比方: 对于老虎,兔子 这两个对象 我们可以建立一个抽象类叫Animals
而老虎和兔子都能跑 而跑只是一种特性,定义成为一个类并不合适
这时我们可以定义一个接口 RunInterface
提供一个run()方法给人调用
2.从理论上来看,抽象类并没有接口灵活,继承了抽象类的方法的功能拓展有限,
因为抽象类不支持多继承。
假设有一个抽象类为
*/
abstract class Man {
abstract void run();
abstract void say();
}
/* 当有类继承他之后,我们又想实现 eat()吃饭这个行为;
这时该怎么办呢?重新设计抽象类吗? 在开发中这样明显效率极低。
这时接口的好处就体现出来了我们定义一个接口,并进行接口的实现
*/
interface EatInterface{
void eat();
}
class Son extends Man implements EatInterface{
void run() {
}
void say() {
}
public void eat() {
}
}
/*
那如果我的功能还要进行拓展呢?
假设我还想实现追求女生这个功能呢?哈哈哈哈
这个时候类支持多实现的好处就出来了
*/
interface Man1 {
abstract void run();
abstract void say();
}
interface PursueGirls{
abstract void action();
}
class Son1 implements EatInterface, Man1,PursueGirls {
public void eat() {
}
public void run() {
}
public void say() {
}
public void action() {
}
}