抽象类
特点:
1.抽象类中可以有构造方法
2.抽象类中可以存在普通属性,方法,静态属性和方法。
3.抽象类中可以存在抽象方法。 抽象方法不能有方法体
4.如果一个类中有一个抽象方法,那么当前类一定是抽象类;抽象类中不一定有抽象方法。
5.抽象类中的抽象方法,需要有子类实现,如果子类不实现,则子类也需要定义为抽象的。
6.抽象类不能被实例化,抽象类和抽象方法必须被abstract修饰
7.抽象类方法中默认的访问权限jdk1.8之前是protected之后是default
8.抽象类中可以有main方法
9.抽象类中可以有static方法,但是不能有default方法
关键字使用注意:
1.抽象类中的抽象方法(其前有abstract修饰)不能用private、default、static、synchronized、native访问修饰符修饰。 (public和protected可以)
2.外部类的修饰符只能是不写,接口的修饰符只能是不写或者public
3.接口种的变量默认是public static final的,所以接口的成员变量必须赋值。方法默认是public abstract的。
4.抽象类中的非抽象方法可以被重写
5.抽象类可以有构造方法,只是不能实例化
6.抽象类不能多继承
接口
1.在接口中只有方法的声明,没有方法体。
2.在接口中只有【常量】,因为定义的变量,在编译的时候都会默认加上public static final
3.在接口中的方法,永远都被public来修饰。
4.接口中没有构造方法,也不能实例化接口的对象。(所以接口不能继承类)
5.接口可以实现多继承
6.接口中定义的方法都需要有实现类来实现,如果实现类不能实现接口中的所有方法则实现类定义为抽象类。
7.接口可以继承接口,用extends
8.接口中方法访问修饰符默认是public abstract的,但是JDK1.8之后接口中可以有static方法或者default方法,但是这两种方法必须有方法体。
9.接口中的方法用static修饰之后,就不能用abstract修饰了
10.接口中可以有main方法
在JDK1.8之前的版本(不包括JDK1.8),接口中不能有静态方法,抽象类中因为有普通方法,故也可以有静态方法。
在JDK1.8后(包括JDK1.8),在抽象类中依旧可以有静态方法,同时在接口中也可以定义静态方法了。
接口可以继承接口,而且可以继承多个接口,但是不能实现接口,因为接口中的方法全部是抽象的,无法实现;
如果是Java 7以及以前的版本,那么接口中可以包含的内容有:1. 常量;2. 抽象方法
如果是Java 8,还可以额外包含有:3. 默认方法;4. 静态方法
如果是Java 9,还可以额外包含有:5. 私有方法
抽象类可以实现接口,可以继承具体类,可以继承抽象类,也可以继承有构造器的实体类。
抽象类中可以有静态main方法;抽象类里可以没有抽象方法,没有抽象方法的抽象类就是不想让别人实例化它;
另外,抽象类可以有构造方法,只是不能直接创建抽象类的实例对象而已。在继承了抽象类的子类中通过super(参数列表)调用抽象类中的构造方法,可以用于实例化抽象类的字段。
当抽象类只有有参构造时,子类(包括抽象类和非抽象类)必须定义有参构造,调用super(参数)
下面总结常见的抽象类与接口的区别:
1.抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象;
2.接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现(java8中 接口可以有实现方法 使用default或static修饰);
3.接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量;
4.抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个类实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类;
5.抽象方法要被实现,所以不能是静态static的,也不能是私有private的,也不能被final修饰(试想一下,静态方法可以被类名直接调用,而类名直接调用一个没有实现的抽象方法没有意义)。
标签:子类,可以,接口,详解,抽象,抽象类,方法 From: https://www.cnblogs.com/wxdxb/p/18534616