抽象类:
abstract:修饰符,只能修饰类和普通的方法。
用abstract关键字修饰的类就是抽象类,用abstract修饰的方法叫做抽象方法。在抽象类中允许方法不进行具体的实现。抽象方法不是一个完整的方法,只做方法的声明,没有方法体。
抽象类的作用:抽象类是为了实现多态,并优化继承结构。
例如 抽象类Pet:
package com.bxit1; /** * 宠物的抽象类 * @author QJ */ public abstract class Pet { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public Pet(String name) { super(); this.name = name; } //抽象方法 public abstract void eat(); } |
子类:
package com.bxit1; public class Pig extends Pet{ public Pig(String name) { super(name); // TODO Auto-generated constructor stub } //实现父类的方法 @Override public void eat() { System.out.println("小猪在吃草"); } } |
说明:抽象类可能只提供一个类的部分实现,因此抽象类不能被实例化,抽象类可以有成员变量(成员变量也叫实例变量),以及一个或多个构造方法,这些构造方法不能被客户端调用来创建实例,抽象类的构造方法可以被子类用super来调用。
抽象类可以同时拥有抽象方法和具体方法,抽象类使所有的子类都可以有一些共同的实现,而不同的子类可以在此基础上对抽象方法做具体的实现。
注意: 1抽象方法只能定义在抽象类中。
2抽象类中不一定有抽象的方法。
3抽象类中可以有具体的方法和自己的私有属性。
4 抽象类不可以被实例化(不能创建对象),它是专门用来被继承的。
5当一个类继承一个抽象类,该类必须实现抽象类中的抽象方法(前提条件:抽象类中有抽象方法)。
6抽象方法不可以被final 修饰。抽象类也不可以被final修饰。
抽象类的设计原则:
- 抽象类是用来继承的,只要有可能,不要从具体类继承。
- 假设有2个具体类,类A和类B,类B是类A的子类,那么一个最简单的修改方案是应当建立一个抽象类C(或者接口),然后让类A和类B分别去继承抽象类C.
抽象类应当拥有尽可能多的共同代码。以提高代码的复用率。
接口:
接口:就是规定了一系列的规则、标准、动作等,不做具体的实现。
一个类中如果不存在数据,只存在抽象方法时,就可以声明为接口,接口使用interface来声明。
例如:
package com.bxit1; /** * 定义一个接口 * @author QJ * */ public interface Fly{ //String name=""; //飞行的方法 /*public abstract*/ void fly(); } |
注意:1.在接口中的所有方法都默认是public abstract修饰的。
2.在接口中只能有抽象的方法,不能有具体的方法。
3.在接口中定义的属性默认为public final修饰。(一般情况接口中是不建议定义属性的)。
4.在接口中的属性和方法都不能使用private修饰。
5.接口与类是并列的概念,类可以被继承,接口只能被类实现。
实现接口使用关键字implements,一个类同时可以实现多个接口中的方法,实现多个接口时,接口之间用逗号分隔。
定义接口的语法:
[修饰符] class 类名 implements 接口名1,接口名2,...{ //类结构 } |
例如:
package com.bxit1; public class Bird implements Fly{ @Override public void fly() { System.out.println("鸟在飞!"); } } |
接口和抽象类的区别:
1.抽象类定义的时候使用abstract class,接口使用interface定义。
2.抽象类中可以有自己私有的属性,但是接口中不能有私有的属性,接口中的属性默认都是public final修饰
3.抽象类中可以有具体的方法,还可以没有抽象方法,但是接口中不能有具体的方法,必须都是抽象的方法。
4.抽象类只能单继承,但是接口可以多继承。
5.抽象类可以实现接口,但是接口不能够实现接口。
6.在一般情况下,在使用继承的时候,优先考虑接口,再考虑抽象类。
7.接口主要针对的是行为特性。抽象类侧重点还是类。
注意:抽象类可以实现接口,但是在抽象类中可以不对接口中的方法进行具体实现,
如果不在抽象类中实现,则将方法的实现交给子类。
抽象类和接口的好处:
1、重要性:在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力。
2、简单、规范性:如果一个项目比较庞大,那么就需要一个能理清所有业务的架构师来定义一些主要的接口,这些接口不仅告诉开发人员你需要实现那些业务,而且也将命名规范限制住了(防止一些开发人员随便命名导致别的程序员无法看明白)。
3、维护、拓展性:比如你要做一个画板程序,其中里面有一个面板类,主要负责绘画功能,然后你就这样定义了这个类。
可是在不久将来,你突然发现这个类满足不了你了,然后你又要重新设计这个类,更糟糕是你可能要放弃这个类,那么其他地方可能有引用他,这样修改起来很麻烦。
如果你一开始定义一个接口,把绘制功能放在接口里,然后定义类时实现这个接口,然后你只要用这个接口去引用实现它的类就行了,以后要换的话只不过是引用另一个类而已,这样就达到维护、拓展的方便性。
4、安全、严密性:接口是实现软件松耦合的重要手段,它描叙了系统对外的所有服务,而不涉及任何具体的实现细节。这样就比较安全、严密一些(一般软件服务商考虑的比较多)。