1.抽象类
1.1抽象类定义规则如下:
(1)抽象类和抽象方法都必须用abstract关键字来修饰;
(2)抽象类不能直接实例化,也就是不能直接用new关键字去产生对象;
Book book=new Book(); //若Book是抽象的,则语法错误,因为无法被实例化 |
(3)抽象类定义时抽象方法只需声明,而不需要实现;
abstract class Book{ private String title=”java”; public void print(){ System.out.println(title); } public abstract void fun(); //没有方法体,是一个抽象方法 } |
(4)含有抽象方法的类必须被声明为抽象类,抽象类的子类必须实现所有的抽象方法(覆写所有抽象方法)后才能被实例化,否则这个子类还是抽象类。
1.2抽象类的使用原则:
(1)抽象类通常专门用来做父类,因此抽象类必须有子类,子类使用extends继承抽象类,一个子类只能继承一个抽象类;
(2)子类必须实现抽象类之中的全部抽象方法;
(3)如果想要实例化抽象类的对象,则可以使用子类进行对象的向上转型类完成。
abstract class Person{ String name; int age; public abstract string talk(); //声明一个抽象方法talk() } class Student extends Person(){ public Student (String name,int age){ this.name=name; this.age=age; } public String talk(){ //实现抽象方法talk() return “学生->姓名:”+this.name”,年龄:”+this.age; } } class AbstractDemo{ public static void main(String[] args){ Student s=new Student(“张三”,20); System.out.println(s.talk()); //调用被实现过得方法 } } |
1.3抽象类的特征:
(1)抽象类也可以有构造方法,但这些构造方法必须在子类中被调用,并且子类实例化对象的时候依然满足类继承的关系,先默认调用父类的构造方法,再调用子类的构造方法。抽象类的构造方法不能被外部类实例化对象调用。
abstract class Person{ String name; int age; public Person(String name,int age){ //定义构造方法 this.name=name; this.age=age; } public abstract string talk(); } class Student extends Person(){ public Student (String name,int age){ super(name,age); //必须明确调用抽象类的构造方法 } public String talk(){ return “学生->姓名:”+this.name”,年龄:”+this.age; } } |
(2)抽象类不能够使用final定义。因为使用final定义的类不能有子类,而抽象类使用的时候必须有子类,这是一个矛盾的问题。
(3)Static声明,抽象类内外不同。在外部抽象类上无法使用static声明,但是内部抽象类却可以使用static定义,使用static定义的内部抽象类就可以表示一个外部类。
abstract class Book{ public abstract void print(); //定义抽象方法 static abstract class CD{ //静态内部抽象类 Public abstract void get(); //抽象方法 } } class JavaCD extends Book.CD{ //继承抽象方法 public void get(){ System.out,println(“java”); } } public class StaticInnerAbstractClass{ public static void main(String args[]){ Book.CD cd=new JavaCD(); cd.get(); } } |
(4)抽象类中可以没有抽象方法,但即便没有抽象方法,也不能在外部通过new实例化。
2.接口
2.1接口的基本概念
接口的宗旨在于定义由多个继承类共同遵守的“契约”。接口的所有成员访问类型都必须为public,接口里的方法默认为abstract类,即接口中的方法为“抽象方法”。接口允许定义默认方法(default方法)。
带默认方法的接口定义例:
interface A{ public static final String INFO=”hello world”; //全局常量 public abstract void print(); //抽象方法 default public void otherprint(){ //带方法体的默认方法 System.out.println(“default methods!”); //默认方法的方法体 } } |
接口必须遵守的原则:
- 接口必须有子类,子类依靠implement关键字可以同时实现多个接口;
- 接口的子类必须实现接口之中的全部抽象方法;
- 接口可以利用对象多态性,利用子类实现对象的实例化。
PS:接口的数据成员必须赋初值,且不能再被更改,所以声明数据成员的关键字final可省略,抽象方法声明的关键字abstract也可以省略。
3.抽象类和接口对比
抽象类与接口相同点:
- 都是抽象类型;
- 都可以有实现方法;
- 都可以不需要实现类或者继承者去实现所有方法;
抽象类和接口不同点:
- 抽象类不可以多重继承,接口可以;
- 抽象类和接口所反映出的设计理念不同。抽象类属于“模板设计模式”,表示的是“is-a”关系;接口属于“代理设计模式”,表示的是“like-a”关系;
- 接口中定义的变量默认为public static final型,且必须给初值,所以实现类中不能重新定义,也不能改变其值;抽象类中的变量值可以在子类中重新定义,也可以重新赋值。
4.继承抽象类和继承普通类最大的区别
(1)在普通类中所有的方法都是有方法体的,如果有一些方法希望由子类来实现的时候,子类即使不实现也不会出现错误;
(2)抽象类中的抽象方法在语法上就必须要求子类进行实现,这样就可以强制子类做一些固定操作。