抽象类
在了解抽象类之前,先来了解一下抽象方法。抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽象方法的声明格式为:
abstract void fun();
抽象方法必须用abstract关键字进行修饰。如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。
abstract class test{
public abstract void fun();
}
从这里可以看出,抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情。对于一个父类,如果它的某个方法在父类中实现出来没有任何意义,必须根据子类的实际需求来进行不同的实现,那么就可以将这个方法声明为abstract方法,此时这个类也就成为abstract类了。
包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和普通的成员方法。注意,抽象类和普通类的主要有三点区别:
1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。
2)抽象类不能用来创建对象;
3)如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。
4 ) 抽象类不能与一些关键字共存
private:abstract是表明希望被覆盖的,但是private,子类看不到。
static:如果是static就需要创建对象,但abstract不需要创建对象(没有意义)
final:final表示不能被子类覆盖,abstract表名希望被覆盖
在其他方面,抽象类和普通的类并没有区别。
抽象类的简单练习
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Coder c = new Coder("lele","007",8000);
c.work();
Manage m = new Manage("zz","008",9000,200);
m.work();
}
}
abstract class Employee{
public String name;
public String id;
public int Salary;
public Employee() {} //空参构造
public Employee(String name, String id, int salary) {
//super();
this.name = name;
this.id = id;
this.Salary = salary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public int getSalary() {
return Salary;
}
public void setSalary(int salary) {
Salary = salary;
}
public abstract void work();
}
class Manage extends Employee{
private Integer prize;
public Manage() {} //空参构造
public Manage(String name, String id, int salary,Integer prize) {
super(name,id,salary);
this.prize = prize;
}
public void work() {
System.out.println("我是经理"+this.getName()+",我的工号是"+this.getId()+"我的工资"+this.getSalary()+"我的奖金"+this.prize);
}
}
class Coder extends Employee{
public Coder() {} //空参构造
public Coder(String name, String id, int salary) {
//super();
this.name = name;
this.id = id;
this.Salary = salary;
}
public void work() {
System.out.println("我是程序员"+this.getName()+",我的工号是"+this.getId()+"我的工资"+this.getSalary());
}
}
接口
接口描述了实现了它的类拥有什么功能。因为Java是强类型的,所以有些操作必须用接口去约束和标记。接口作为类的能力的证明,它表明了实现了接口的类能做什么。
类似与class,interface也是java中的一种引用类型。
接口中的成员
接口中的所有的成员,缺省情况下都是public的,也必须是public,无论是方法,还是字段。因为接口就是规定了API,如果实现的类不公开接口中的API,怎么能叫API呢?
一般情况下,接口中可以 定义方法 和 字段。
接口中的字段,必须(默认)为 public static final 。在定义的接口中必须初始化,因为是final。它们将成为类中的静态常量字段
接口中的方法,必须(默认)为 public abstract 。只需在接口中定义即可,不能实现(让实现了接口的类去实现)。将成为类中的public 实例方法 , 实现了接口的类必须实现接口中定义的方法。
1)一个类不写继承任何类默认继承Object类
2)接口中不能定义非抽象方法
public void print(){
} //不能定义非抽象方法
void print();//默认加了abstract,public 因此在重写中权限应该是public
3)接口中没有构造方法
interface myInter{
public static final int num = 10;
}
class Imptest /*extends Object*/ implements myInter{
public void print() {
System.out.println(num);
}
}
a,类与类:只能单继承,可以多层继承
b,类与接口:可以单实现,也可以多实现,并且在继承一个类的同时实现多个接口
c,接口与接口:可以单继承,可以多继承
抽象类与接口的区别
A:成员区别
- 抽象类
- 成员变量:可以变量,可以常量
- 构造方法:有
- 成员方法:可以抽象,可以非抽象
- 接口
- 成员变量:只可以常量
- 成员方法:只可以抽象
B:关系区别
- 类与类:继承,单继承
- 类与接口:实现,单实现,多实现
- 接口与接口:继承,单继承,多继承
C:设计理念区别
- 抽象类:被继承体现的是:“is a”的关系。抽象类中定义的是该继承体系的共性功能
- 接口: 被实现体体现的是:“like a”的关系。接口中定义的是继承体系的扩展功能