抽象类与接口的区别
1.抽象类
在Java中被abstract关键字修饰的类称为抽象类,被abstract关键字修饰的方法称为抽象方法
1.语法 :Java中接口和抽象类的定义语法分别为interface与abstract关键字。
2.抽象类的特点:
(1)抽象方法只有方法的声明,没有方法体
(2)抽象类不能被实例化只能被继承;
(3)包含抽象方法的一定是抽象类,但是抽象类不一定含有抽象方法;
(4)抽象类中的抽象方法的修饰符只能为public或者protected,默认为public;
(5)一个子类继承一个抽象类,则子类必须实现父类抽象方法,否则子类也必须定义为抽象类;
(6)抽象类可以包含属性、方法、构造方法,但是构造方法不能用于实例化,主要用途是被子类调用。
2.接口
Java中接口使用interface关键字修饰,特点为:
(1)接口可以包含变量、方法;变量被隐式指定为public static final,方法被隐式指定为public abstract(JDK1.8之前);
(2)接口支持多继承,即一个接口可以extends多个接口,间接的解决了Java中类的单继承问题;
(3)一个类可以实现多个接口;
(4)JDK1.8中对接口增加了新的特性:
I、默认方法(default method):JDK 1.8允许给接口添加非抽象的方法实现,但必须使用default关键字修饰;定义了default的方法可以不被实现子类所实现,但只能被实现子类的对象调用;如果子类实现了多个接口,并且这些接口包含一样的默认方法,则子类必须重写默认方法;
II、静态方法(static method):JDK 1.8中允许使用static关键字修饰一个方法,并提供实现,称为接口静态方法。接口静态方法只能通过接口调用(接口名.静态方法名)。
下面展示一些 示例代码
。
/**
* Java基础之接口与抽象类的区别
* @author feng
*
*/
/**
* 抽象类:在Java中被abstract关键字修饰的类称为抽象类,被abstract关键字修饰的方法称为抽象方法,
* 抽象方法只有方法的声明,没有方法体。
* 抽象类的特点:
* 1.抽象类不能被实例化只能被继承;
* 2.包含抽象方法的一定是抽象类,但是抽象类不一定含有抽象方法;
* 3.抽象类中的抽象方法的修饰符只能为public或者protected,默认为public;
* 4.一个子类继承一个抽象类,则子类必须实现父类抽象方法,否则子类也必须定义为抽象类;
* 5.抽象类可以包含属性、方法、构造方法,但是构造方法不能用于实例化,主要用途是被子类调用。
*/
public abstract class SoftwareUser {
private String name;
private Integer age;
public SoftwareUser() {
}
public SoftwareUser(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
// 抽象类中的抽象方法的修饰符只能为public或者protected,默认为public
// 抽象方法只有方法的声明,没有方法体
// The abstract method code in type SoftwareUser can only set a visibility modifier, one of public or protected
//private abstract void code(); // error
public abstract void code1();
protected abstract void code2();
// 包含抽象方法的一定是抽象类,但是抽象类不一定含有抽象方法
private void eat() {
System.out.println("敲代码是为了吃饭!");
}
public static void main(String[] args) {
// 抽象类不能被实例化只能被继承
// Cannot instantiate the type SoftwareUser
// SoftwareUser softwareUser = new SoftwareUser(); // error
}
}
子类
public class WebUser extends SoftwareUser implements BigDataInterface{
// 一个子类继承一个抽象类,则子类必须实现父类抽象方法,否则子类也必须定义为抽象类
@Override
public void code1() {
// TODO Auto-generated method stub
System.out.println("code1");
}
@Override
protected void code2() {
// TODO Auto-generated method stub
}
public static void main(String[] args) {
SoftwareUser user1 = new WebUser();
user1.code1();
WebUser user2 = new WebUser();
user2.code1();
}
@Override
public void updateByUserId() {
// TODO Auto-generated method stub
}
}
接口
/**
* Java基础之接口与抽象类的区别
* @author feng
*
*/
// a、接口可以包含变量、方法;变量被隐式指定为public static final,方法被隐式指定为public abstract(JDK1.8之前);
// b、接口支持多继承,即一个接口可以extends多个接口,间接的解决了Java中类的单继承问题;
// c、一个类可以实现多个接口;
// JDK1.8中对接口增加了新的特性:
//(1)、默认方法(default method):JDK 1.8允许给接口添加非抽象的方法实现,但必须使用default关键字修饰;
//定义了default的方法可以不被实现子类所实现,但只能被实现子类的对象调用;
//如果子类实现了多个接口,并且这些接口包含一样的默认方法,则子类必须重写默认方法;
//(2)、静态方法(static method):
//JDK 1.8中允许使用static关键字修饰一个方法,并提供实现,称为接口静态方法。
//接口静态方法只能通过接口调用(接口名.静态方法名)。
public interface BigDataInterface {
public static final String name = "zs";
public static final Integer age = 23;
public static void eat() {
System.out.println("大数据也要吃饭!");
}
default void run() {
System.out.println("大数据也要跑路!");
}
void updateByUserId();
}