【14-10】面向对象-抽象类的产生
/*
描述狗,行为,吼叫。
描述狼,行为,吼叫。
发现他们之间有共性,可以进行向上抽取。
当然是抽取他们的所属共性类型,犬科。
犬科这类事物,都具备吼叫行为,但是具体怎么叫,是不确定的,是由具体子类来明确的。
这时在描述犬科时,发现了有些功能不具体,这些不具体的功能,需要在类中标识出来,通过Java关键字abstract(抽象).
定义了抽象函数的类也必须被abstract关键字修饰,被abstract关键字修饰的类是抽象类
*/
/*
抽象类的特点。
1,抽象类和抽象方法都需要被abstract修饰。
抽象方法一定要定义在抽象类中。
2,抽象类不可以创建实例,原因,调用抽象方法没有意义。
3,只有覆盖了抽象类中所有的抽象方法后,其子类才可以实例化。
否则该子类还是一个抽象类。
之所以继承,更多是在于思想,是面对共性类型操作会更简单。
*/
/*
细节问题:
1,抽象类是父类吗?
是的,因为是不断抽取而来的。
2,抽象类是否有构造函数呢?
有,虽然不能给自己的对象初始化,但是可以给自己的子类对象初始化。
抽象类和一般类的异同点:
相同:
1,它们都是用来描述事物,
2,它们之中都可以定义属性和行为。
不同:
1,一般类可以具体的描述事物。
抽象类描述事物的信息不具体。
2,抽象类中可以多定义一个成员,抽象函数。
3,一般类可以创建对象,抽象类不能创建对象。
3,抽象类中是否可以不定义抽象方法。
是可以的,那这个抽象类存在到底有什么意义呢?仅仅是不让该类创建对象。
4,抽象关键字abstract不可以和哪些关键字共存?
1,final (被final修饰的类不能有子类,而抽象类的定义就是为了子类继承它)
2,private(子类要继承抽象类的全部方法才可以创建对象,一旦被private了 子类就不知道了)
3,static (有了静态修饰的方法后,就可以被类名直接调用,而调用抽象类的抽象方法是没有用的)
*/
abstract class Q
{
public abstract void houjiao();
}
class Dog extends Q
{
public void houjiao()
{
System.out.println("汪汪汪汪");
}
}
class Wolf extends Q
{
public void houjiao()
{
System.out.println("嗷嗷嗷嗷");
}
}
class Test
{
public static void main(String[] args)
{
Wolf wolf = new Wolf();
wolf.houjiao();
}
}
【14-11】面向对象-抽象类的练习
*
需求:公司中程序员有姓名,工号,薪水,工作内容。
项目经理除了有姓名,工号,薪水,工作内容,还有奖金。
对给出需求进行数据建模。
在问题领域中先找寻其中的对象。
程序员:
属性:姓名,工号,薪水
行为:工作
项目经理:
属性:姓名,工号,薪水,奖金
行为:工作
经过分析发现:程序员和经理都属于员工
员工:
属性:姓名,工号,薪水
行为:工作
但是员工的工作本身具有不具体性,应该是抽象,由具体的子类来体现
*/
abstract class Employee
{
private String name;
private String id;
private double pay;
public Employee(String name,String id,double pay)
{
this.name = name;
this.id = id;
this.pay = pay;
}
public abstract void work();
}
//程序员
class Programmer extends Employee
{
public Programmer(String name,String id,double pay)
{
super(name,id,pay);
}
public void work()
{
System.out.println("code...");
}
}
//项目经理
class Manager extends Employee
{
private double bouns;
public Manager(String name,String id,double pay,double bouns)
{
super(name,id,pay);
this.bouns = bouns;
}
public void work()
{
System.out.println("manage");
}
}
class AbstractTest
{
public static void main(String[] agrs)
{
System.out.println("");
}
}