java抽象类(abstrace)和接口(interface)
抽象方法
抽象方法定义了一个通用的标准,约定起子类根据自身特性重写(@Override)这些方法。
抽象方法的表达方法:
[权限修饰符] abstract 返回数据类型 抽象方法名();
注意这里抽象方法的关键词在权限修饰符和返回数据类型之间。
抽象的方法可以不用实现,说人话就是你这个方法定义了一个返回数据类型,但是你要是说你这个方法是抽象的方法,那你就不用特意的去应付一个返回的数据,因为你已经说了这是一个抽象的方法,编译器看见了也不会多bb。
如果你创建了一个包含抽象方法的类,那么你就必须说这个类是个抽象类
抽象类的定义方法
声明抽象类的表达方式:
//其中权限修饰符和abstract的位置可以相互调换
[权限修饰符] abstract class 抽象类名{}
抽象类的特点
1.抽象类必须被继承
2.抽象类中可以有抽象方法也可以有非抽象方法
3.抽象类不能被实例化,既不能使用new运算符创建对象,只有他的非抽象子类能够new一个对象。
例如:
Pet p=new Pet();//error 因为抽象类不能被实例化
Pet p=new Cat();//success 因为它可以指向子类对象
4.抽象的子类必须重写所有父类的抽象方法,否则这个子类还是一个抽象类(很有道理的废话)
案例分析
有了前面的知识作为铺垫,接下来让我们来分析一下本案例的实现。
首先分析定义类的需求:
开发人员的静态属性为姓名 工号 薪水 工作
项目经理包括的静态属性为姓名 工号 薪水 奖金 工作
地区经理的包括的静态行为为姓名 工号 薪水 奖金 股票分红 工作
三者可以抽取出来的共性内容是姓名 工号 薪水 工作
其中 他们的工作各不相同,所以 将工作定义为抽象类 ,子类再重写即可
package jiekou;
abstract public class Employee {
private String name;
private int id;
private double salary;
Employee(String name, int id, double salary)
{
this.name = name;
this.id = id;
this.salary = salary;
}
public String getName()
{
return name;
}
public int getId() {
return id;
}
public double getSalary()
{
return salary;
}
abstract public void work();
public static void main(String[] args) {
Manager jack;
jack=new Manager("jack",123456,9999.9);
jack.work();
Programmer jeff;
jeff=new Programmer("jeff",123457,19999.9);
jeff.work();
}
}
Manager.java
package jiekou;
public class Manager extends Employee
{
public Manager(String name, int id,double salary)
{
super(name, id,salary);
}
public void work()
{
System.out.println("i am a Manager");
System.out.println(getName()+getId()+getSalary());
}
}
Progermmer.java
package jiekou;
public class Programmer extends Employee{
public Programmer(String name,int id,double salary)
{
super(name,id,salary);
}
@Override
public void work()
{
System.out.println("this is a programmer,i am working!");
System.out.println("programmer"+getName()+" id:"+getId()+" who has "+getSalary()+"$ per month");
}
}
AeraManager.java
package jiekou;
public class AeraManager extends Employee
{
public AeraManager(String name,int id,double salary)
{
super(name,id,salary);
}
public void work()
{
System.out.println("i am a AreaManager");
System.out.println(getId()+getName()+getSalary());
}
}
运行结果:
/Users/Admin/Library/Java/JavaVirtualMachines/openjdk-15.0.2/Contents/Home/bin/java -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=57248:/Applications/IntelliJ IDEA.app/Contents/bin -Dfile.encoding=UTF-8 -classpath /Users/Admin/IdeaProjects/study/out/production/study jiekou.Employee
i am a Manager
jack1234569999.9
this is a programmer,i am working!
programmerjeff id:123457 who has 19999.9$ per month
进程已结束,退出代码为 0
总结
通过以上案例,熟悉了抽象接口的使用,并了解了抽象接口应在何时使用。