抽象类的概念:
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。在Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。
抽象类的特点:
抽象类必须用abstract关键系修饰。
抽象类中不一定有抽象方法,但有抽象方法的类必须定义为抽象方法,(有抽象方法的类一定是抽象类)。
抽象类不能实例化,即无法构造对象(Animal a = new Animal();
示例:
abstract class Employee{
private String name;
private String id;
private int salary;
public Employee(){}
public Employee(String name, String id, int salary) {
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) {
this.salary = salary;
}
public abstract void work();
}
class Programmer extends Employee{
public Programmer(){}
public Programmer (String name,String id , int salary){
super(name, id, salary);
}
@Override
public void work() {
System.out.println("码代码");
}
}
class Manager extends Employee{
private int Money; //bonus 奖金
public int getMoney() {
return Money;
}
public void setMoney(int money) {
Money = money;
}
public Manager(){}
public Manager (String name,String id , int salary){
super(name, id, salary);
this.Money=Money;
}
@Override
public void work() {
System.out.println("跟客户谈需求");
}
}
public class chouxiang_test {
public static void main(String[] args) {
Employee emp = new Programmer();
emp.setId("123");
emp.setName("狗蛋儿");
emp.setSalary(123123);
System.out.println(emp.getName()+"--"+emp.getId()+"--"+emp.getSalary());
System.out.println("------------------------------------");
Employee emp2 = new Manager();
emp2.setId("13");
emp2.setName("狗儿");
emp2.setSalary(12323);
((Manager) emp2).setMoney(798789);
System.out.println(emp2.getName()+"--"+emp2.getId()+"--"+emp2.getSalary()+"--"+((Manager) emp2).getMoney());
}
}
抽象类不能和private,final,static组合,
错误示例:
abstract class Fu{
private abstract void show(){
}
}
public class chouxiang_test {
public static void main(String[] args) {
}
}
报错信息:
错误示例二:
abstract class Fu{
final abstract void show(){
}
}
public class chouxiang_test {
public static void main(String[] args) {
}
}
报错信息:
示例三:
因为抽象是没有方法体的,而static是可以直接通过类名访问的,但是,访问一个没有方法体的方法,没有任何意义,所以不能组合。