一、抽象类
1、为子类提供通用表达形式的类,使子类可以通过动态绑定机制调用与基类声明的签名相符的衍生类方法。抽象类只提供一种形式,不提供实施的细节。
2、抽象类中的抽象方法只有声明,没有方法体。一个类如果有一个或多个抽象方法,该类必须用abstract关键字声明为抽象类。
3、抽象类不能通过new类实例化,只能作为其他类的基类,可以被继承。
4、抽象类中可以有自己的构造方法,可以含有非抽象的成员或方法,可以含有抽象的成员或方法,也可以不含有抽象的成员或方法。
5、若一个非抽象类继承了抽象类,那么该类必须要重写抽象类中的抽象方法。
6、抽象类可以被抽象类继承,结果还是抽象类。
7、抽象类不能同时又是final,因为final的类不能被继承。
package practice;
/**
* 假如我们在开发一个系统时需要对员工进行建模,员工包含 3 个属性:
姓名、工号以及工资。经理也是员工,除了含有员工的属性外,另为还有一个
奖金属性。请使用继承的思想设计出员工类和经理类。要求类中提供必要的方
法进行属性访问。
员工类:name id pay
经理类:继承了员工,并有自己特有的bonus。
* @author USER
*
*/
abstract class Employee {
private String name;
private String id;
private float pay;
Employee(String name,String id,float pay)
{
this.name=name;
this.id=id;
this.pay=pay;
}
public abstract void work();//Abstract methods do not specify a body
}
class Manager extends Employee
{
private double bonus;
Manager(String name, String id, float pay,double bonus) {
super(name, id, pay);
this.bonus=bonus;
}
public void work()
{
System.out.println("Manager work");
}
}
class Boss extends Employee
{
Boss(String name, String id, float pay) {
super(name, id, pay);
// TODO Auto-generated constructor stub
}
public void work()
{
System.out.println("Boss work");
}
}
public class MyAbstract
{
public static void main(String[] args) {
System.out.println("abstract class");
//Employee e =new Employee(); Cannot instantiate the type Employee
Manager m =new Manager("小明", "002", 1200, 500);
m.work();//Manager work
Boss boss=new Boss("小苏", "001", 2000);
boss.work();//Boss work
}
}
二、接口
1、接口是一种更加抽象的抽象类:用interface关键字声明,我们经常需要表达这样的意思:x从属于a,,也从属于b,也从属于c。此时,就可以通过接口实现一个类(抽象基类或普通基类)的多继承。
2、接口中的成员变量默认是public、static、final类型的(都可以省略),必须为显示初始化,且一般都是大写的常量(单词间用“_”分隔)
3、接口中的方法默认都是public、abstract类型的(都可以省略),只有方法声明,没有方法体。
4、接口中只能包含public static final类型的成员变量和public abstract类型的方法,不能包含其他类型的成员变量和方法。
5、接口中没有构造方法,不能实例化。
6、在类中实现接口通过implements关键字,类的继承是单继承,类继承接口是多继承。
interface shape{
public static final float PI = 3.14159f;
public abstract float getArea(float r);
}
class square implements shape{
public float getArea(float radius) {
float area = PI * radius *radius;
return area;
}
}
public class TestInterface {
public static void main(String[] args) {
square s = new square();
float f = s.getArea(4);
System.out.println(f);
}
}