【JavaSE】Java入门七(抽象类和接口详解)
目录
4.详解接口中的static,default,public abstract方法
抽象类和接口?
? ? ? ? 我们知道,Java中的类是对对象的描绘,就像现实中对具体事物的描绘一样,但现实中有一些词语只有抽象的含义,没有具体的事物,在Java中也有这样的描绘(不能描绘对象),便是抽象类和接口,接口可以理解为更加抽象的抽象类,下面我来为大家详解一下两者以及两者的区别。
1. 什么是抽象类
被abstract修饰的类称为抽象类,语法格式如下:
// 抽象类:被abstract修饰的类
public abstract class Shape {
// 抽象方法:被abstract修饰的方法,没有方法体
abstract public void draw();
abstract void calcArea();
// 抽象类也是类,也可以增加普通方法和属性
public double getArea(){
return area;
}
protected double area; // 面积
}
抽象类中可以包含被abstract修饰的抽象方法,抽象方法在抽象类中仅仅被声明,具体的实现代码可以在继承他的类中被实现。?
2.抽象类的特点
- 抽象类不能直接实例化对象
- 抽象方法不能是private的
- 抽象方法不能被final和static修饰,因为抽象方法要被子类重写
- 抽象类必须要被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类必须用abstract修饰
- 抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类
- 抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量
抽象类在实例化对象时会直接在编译层面报错。
3.什么是接口
? ? ? ?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。
接口可以被类实现多继承,接口和接口之间也可以实现多继承
- 类继承接口通过implements关键字
class Duck extends Animal implements IRunning, ISwimming, IFlying{ ... }
- 接口之间继承通过extends关键字
interface IAmphibious extends IRunning, ISwimming { ... } class Frog implements IAmphibious { ... }
?tips:一个类实现多个接口时,每个接口中的抽象方法都要实现,否则类必须设置为抽象类。
4.详解接口中的static,default,public abstract方法
在JDK8之前接口中的方法类型只有public abstract方法,在JDK8之后接口中可以添加default或者static修饰的方法。
public abstract:不能拥有自己的方法实现,具体实现完全交给实现类自己完成。
default:default修饰方法只能在接口中使用,在接口中这种方法被称为普通方法,可以直接写方法体。该方法有三种使用途径。
- 实现类继承接口中的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方法一样(里面可以有方法体),可以被接口名直接调用使用。
5.抽象类和接口的区别(面试题)
核心区别 : 抽象类中可以包含普通方法和普通字段 , 这样的普通方法和字段可以被子类直接使用 ( 不必重写 ), 而接口中不能包含普通方法, 子类必须重写所有的抽象方法
?
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!