目录
4.详解接口中的static,default,public abstract方法
? ? ? ? 我们知道,Java中的类是对对象的描绘,就像现实中对具体事物的描绘一样,但现实中有一些词语只有抽象的含义,没有具体的事物,在Java中也有这样的描绘(不能描绘对象),便是抽象类和接口,接口可以理解为更加抽象的抽象类,下面我来为大家详解一下两者以及两者的区别。
被abstract修饰的类称为抽象类,语法格式如下:
// 抽象类:被abstract修饰的类
public abstract class Shape {
// 抽象方法:被abstract修饰的方法,没有方法体
abstract public void draw();
abstract void calcArea();
// 抽象类也是类,也可以增加普通方法和属性
public double getArea(){
return area;
}
protected double area; // 面积
}
抽象类中可以包含被abstract修饰的抽象方法,抽象方法在抽象类中仅仅被声明,具体的实现代码可以在继承他的类中被实现。?
抽象类在实例化对象时会直接在编译层面报错。
? ? ? ?Java中类不能实现多继承,为了让一个类继承多个类型,Java中引入了接口,接口也是一种引用数据类型,可以把他当做比抽象类更抽象的引用数据类型
被interface定义的类被称为接口,语法格式如下:
public interface 接口名称{
// 抽象方法
public abstract void method1(); // public abstract 是固定搭配,可以不写
public void method2();
abstract void method3();
void method4();
// 注意:在接口中上述写法都是抽象方法,跟推荐方式4,代码更简洁
}
接口的设计者们在设计接口时就是为了让他被继承,所以最初版的接口之中只能有被public??abstract修饰的方法和被public static final修饰的变量,在之后的jdk发展中引入了可以被static和default修饰的方法。因为初版接口内默认只有这两种东西,所以我们在使用时一般省略public abstract和public static final。
接口可以被类实现多继承,接口和接口之间也可以实现多继承
class Duck extends Animal implements IRunning, ISwimming, IFlying{
...
}
interface IAmphibious extends IRunning, ISwimming {
...
}
class Frog implements IAmphibious {
...
}
?tips:一个类实现多个接口时,每个接口中的抽象方法都要实现,否则类必须设置为抽象类。
在JDK8之前接口中的方法类型只有public abstract方法,在JDK8之后接口中可以添加default或者static修饰的方法。
public abstract:不能拥有自己的方法实现,具体实现完全交给实现类自己完成。
default:default修饰方法只能在接口中使用,在接口中这种方法被称为普通方法,可以直接写方法体。该方法有三种使用途径。
public interface demo {
public default void demoFun(){
System.out.println("我是接口");
}
}
public class Test implements demo {
}
public class Test2 {
public static void main(String[] args) {
Test t = new Test();
t.default();
}
}
?如果一个类同时实现接口A和B,接口A和B中有相同的default方法,这时,该类必须重写接口中的default方法
public interface A {
public default void c(){
System.out.println("方法A");
}
}
public interface B {
public default void c(){
System.out.println("方法B");
}
}
public class Test implements A,B {
@overried
public default void c(){
System.out.println("方法A,B");
}
}
?如果子类继承父类,父类中有b方法,该子类同时实现的接口中也有b方法(被default修饰),那么继承的方法覆盖了实现接口的b方法。
public interface A {
public default void b(){
System.out.println("A方法");
}
}
public class C {
public void b(){
System.out.println("C方法");
}
}
public class Test extends C implements A{
}
Test test=new Test();
test.b()
输出值为:C方法
static: 用法和普通的类中的static方法一样(里面可以有方法体),可以被接口名直接调用使用。
核心区别 : 抽象类中可以包含普通方法和普通字段 , 这样的普通方法和字段可以被子类直接使用 ( 不必重写 ), 而接口中不能包含普通方法, 子类必须重写所有的抽象方法
?