抽象类与接口
抽象类
用abstract修饰的类称为抽象类; abstract class 类名{};
用abstract修饰的方法为抽象方法;
抽象方法没有方法体,即没有{};
抽象类可以没有抽象方法,有抽象方法的类一定是抽象类;
抽象类不能实例化;具体是由子类实例化完成的,也体现了抽象类多态。
抽象类可以有构造方法,是用来被子类调用的,程序员自己不能调用。
子类继承抽象类,使用extends;分两种情况:
1、子类仍为抽象类:不完全实现其父类的抽象方法;
2、完全的实现类:重写父类抽象类中的所有抽象方法,可以进行实例化对象。
抽象类的抽象方法定义的非法组合:
1、private+abstract:抽象方法依靠子类去实现,但私有方法在类外就不能访问,也就无法实现;
2、final+abstract:final修饰的方法不能被重写,而抽象方法就是需要子类实现,彼此矛盾;
3、static+abstract:抽象方法是没有实体的,使用类名调用的使用调用的是没有实体的方法,没有作用。
抽象类成员的特点:
成员变量:
即可以是变量,也可以是常量(final);
构造方法:有,用于子类访问抽象类数据的初始化;
成员方法:即可以是抽象的,也可以是非抽象的;
抽象类的成员方法特征: 1、抽象方法,强制要求子类去实现; 2、非抽象方法:子类继承的事情,提高代码的复用性。
接口
定义
接口定义了一种规范,接口规定了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据,也不关心这些类的方法的实现细节,它只规定这批类必须提供某些方法。
接口里的所有方法都是抽象方法,成员变量全部是常量;实现类首先用该实现这些最基本的方法,然后在此基础上进行扩展。
特点
格式:interface 接口名{}
类实现接口用implements关键字。 格式:class 类名 implements 接口名{}
接口没有构造方法,即接口不能实例化。由具体的子类实例化。
接口的子类
1、可以是抽象类,用implements关键字
2、可以是一个接口,用extends关键字
3、可以是一个实现类,实现接口中的所有抽象方法。
总结:
1.接口不能实例化对象
2.子类如果是实现类的话,就必须实现接口中定义的所有抽象方法
3.子类如果不完全实现接口中的抽象方法,那子类就是抽象类
4.接口和接口之间可以继承--extends
接口成员特点
成员变量
1、只能是常量,通过接口名访问静态常量;
2、默认修饰符public static final,其中的任何一个都可以省略,也可以全都省略。
构造方法
没有,因为接口主要是扩展功能的,而没有具体存在,子类的构造方法中可以使用super()。
成员方法
1、只能是抽象方法
2、默认修饰符public abstract,可以省略其中之一,或则都省略。
类与类,类与接口,接口与接口的关系
普通类与普通类--extends
继承关系,只能单继承,但是可以多层继承
普通类与抽象类--extends
继承关系,只能单继承,但是可以多层继承
普通类与接口,抽象类与接口--implements
1、实现关系,可以单实现,也可以多实现。还可以在继承一个类的同时实现多个接口
2、此时应注意:extends 写在前,implements写在后
接口与接口--extends
继承关系,可以单继承,也可以多继承
抽象类和接口区别
成员区别
抽象类 :
变量,常量都可以有;
抽象方法,非抽象方法都可以有;可以有构造方法
接口 :
只有常量;只有抽象方法;没有构造方法
实例:
1 interface ISmoke{ 2 public void smoking(); 3 } 4 abstract class Person{ 5 private String name; 6 private int age; 7 public void setName(String name){ 8 this.name=name; 9 } 10 public void setAge(int age){ 11 this.age=age; 12 } 13 public String getName(){ 14 return name; 15 } 16 public int getAge(){ 17 return age; 18 } 19 public Person(){} 20 public Person(String name,int age){ 21 this.name=name; 22 this.age=age; 23 } 24 public abstract void eat(); 25 public void sleep(){ 26 System.out.println("all person should sleep"); 27 } 28 } 29 class Student extends Person{ 30 public Student(){} 31 public Student(String name,int age){ 32 super(name,age); 33 34 } 35 public void eat(){ 36 System.out.println("students eat noodle"); 37 } 38 } 39 class Teacher extends Person{ 40 public Teacher (){} 41 public Teacher(String name,int age){ 42 super(name,age); 43 } 44 public void eat(){ 45 System.out.println("teacher eat rice"); 46 } 47 } 48 class SmokStudent extends Student implements ISmoke{ 49 public SmokStudent(){}; 50 public SmokStudent(String name,int age){ 51 super(name,age); 52 } 53 public void smoking(){ 54 System.out.println("i'm student,but i can smoking"); 55 } 56 57 } 58 class PersonDemo{ 59 public static void main(String[] args){ 60 Person p=new Student("tom",23); 61 p.eat(); 62 p.sleep(); 63 System.out.println("name: "+p.getName()+" age:"+p.getAge()); 64 System.out.println("------------"); 65 SmokStudent sm=new SmokStudent("tomtma",35); 66 System.out.println("name: "+sm.getName()+" age:"+sm.getAge()); 67 sm.eat(); 68 sm.sleep(); 69 sm.smoking(); 70 } 71 }