abstract可以修饰方法、类。使用abstract修饰的方法和类分别叫做抽象方法和抽象类。
抽象方法的定义:指可以通过abstract关键字声明的方法,这种方法只有方法声明没有方法体。
抽象方法存在的意义:如果所有的子类都对父类的某个或者某些方法做了重写,那么父类中的方法保留方法体就变得没有意义,那么就可以将其定义为抽象方法。
抽象方法的特征:
具体示例如下:
class A{ } abstract class B extends A { //抽象类可以具有成员属性 private String name; //抽象类可以具有构造方法 public B(String name) { this.name = name; } //抽象方法可以重载 public abstract void ma(); public abstract void ma(String str); } abstract class C extends B { public C(String str) { super(str); } //抽象方法可以重载 public abstract void m1(); public abstract void m1(String str); //抽象方法可以被final,static,private修饰吗 //不可以,因为这几个都不能被重写或者继承 /*public abstract final void m2(); public abstract private void m2(); public abstract static void m2();*/ } //final与abstract不能同时声明一个类, //抽象类存在的意义就是为了被继承,设置为final与本意违背 //final abstract class D {}
定义:一个类一旦被abstract修饰,就成为了一个抽象类。
抽象类的特征:
抽象类和其他类的共同点:
由于java只支持单继承,缺少了一定的灵活性。为了弥补这一缺点。sun公司除了限定单继承之外,额外提供了接口的概念,虽然一个类只能继承一个父类,但是可以实现多个接口,从而弥补了java程序的灵活性。
接口使用interface关键字来声明,接口中声明的所有方法都是抽象方法。
接口的特征:
示例如下
/** * 接口声明的方法:1、必须是public abstract 的,而不写默认就是该种形式 * 2、接口中的属性必须是public static final 的,不写就是默认 * 3、接口中不能有构造方法,也无法创建对象 * @author Administrator * */ interface intf01 { //接口中的属性必须是public static final 的,不写就是默认 String name = "intf01"; void m01(); void m02(); } interface intf02 { String str = "intf02"; void m03(); void m04(); } //接口可以多继承 interface intf03 extends intf02, intf01 { void m05(); } class A { } //接口不能继承任何类,抽象类也不行,因为可能包含非抽象方法 //interface intf04 extends A {} //类可以既继承类又实现多个接口,extends在implements前 abstract class Person extends A implements intf01,intf02 { @Override public void m03() { // TODO Auto-generated method stub } @Override public void m04() { // TODO Auto-generated method stub } //抽象类实现接口,则可以不重写抽象方法; //普通方法必须全部实现接口方法 }
抽象类只能单继承,接口可以多继承;
抽象类可以包含抽象方法和非抽象方法,接口所有方法方法都是抽象方法(JDK1.8之前);
抽象类和接口都可以实现多态。
真正开发时,抽象类主要用来满足继承结构树,而接口主要用来混入特性。
abstract class Person1 { public void eat() { System.out.println("吃..."); } public abstract void say(); } interface CodeSkill { public void code(); } interface DriveSkill { public void drive(); } interface CookSkill { public void cook(); } class Student extends Person1 implements CodeSkill, CookSkill, DriveSkill { @Override public void code() { System.out.println("写代码..."); } @Override public void say() { System.out.println("学生在叽叽喳喳的说..."); } @Override public void cook() { System.out.println("做饭..."); } @Override public void drive() { System.out.println("开车..."); } } public class Demo02 { public static void main(String[] args) { //抽象类和接口都可以实现多态 :即抽象类和接口都可以实例化一个继承 //他们的一个类的对象;但是只能访问到抽象类或者接口内的方法 Person1 p = new Student(); //多态 p.eat(); p.say(); //p.drive(); CookSkill cooker = new Student(); //多态 cooker.cook(); } }
原文:https://www.cnblogs.com/chhyan-dream/p/10712726.html