Java之抽象类


1. 思考

例子:

描述狗,行为:吼叫。
描述狼,行为:吼叫。

代码实现:

class Dog
{
	void 吼叫()
	{
		System.out.println("汪汪汪汪");
	}
}

class Wolf
{
	void 吼叫()
	{
		System.out.println("嗷嗷嗷嗷");
	}
}

可以发现:

发现他们之间有共性,可以进行向上抽取。
抽取它们的所属共性类型:犬科。

代码实现:

class 犬科
{
	void 吼叫(){}; 
}

class Dog extends 犬科
{
	void 吼叫()
	{
		System.out.println("汪汪汪汪");
	}
}

class Wolf extends 犬科
{
	void 吼叫()
	{
		System.out.println("嗷嗷嗷嗷");
	}
}

发现一个问题:

犬科这类事物:都具备吼叫行为,但是具体怎么叫,是不确定的,是由具体的子类来明确的。
这时在描述犬科时,发现了有些功能不具体,这些不具体的功能,需要通过java中的关键字abstract(抽象)在类中标识出来。

注意:

定义了抽象函数的类也必须被abstract关键字修饰,被abstract关键字修饰的类是抽象类。

怎么标识?

用关键字abstract修饰,并分号;结束

代码示例:

abstract class 犬科
{
	abstract void 吼叫(); //抽象函数。需要abstract修饰,并分号;结束
}

class Dog extends 犬科
{
	void 吼叫()
	{
		System.out.println("汪汪汪汪");
	}
}

class Wolf extends 犬科
{
	void 吼叫()
	{
		System.out.println("嗷嗷嗷嗷");
	}
}

抽象类:在描述事物时,没有足够的信息描述一个事物,这时该事物就是抽象事物。

2. 抽象类的特点

  • 抽象类和抽象方法都需要被abstract修饰。抽象方法一定要定义在抽象类中。
  • 抽象类不可以创建实例,原因:调用抽象方法没有意义。
  • 只有覆盖了抽象类中所有的抽象方法后,其子类才可以实例化。否则该子类还是一个抽象类。
  • 之所以继承抽象类,更多的是在思想,是面对共性类型操作会更简单。

3. 抽象类细节问题

3.1 抽象类一定是个父类?
是的,因为不断抽取而来的。
3.2 抽象类是否有构造函数?
有,虽然不能给自己的对象初始化,但是可以给自己的子类对象初始化。
抽象类和一般类的异同点:
相同:
    1,它们都是用来描述事物的。
    2,它们之中都可以定义属性和行为。

不同:
    1,一般类可以具体的描述事物。
        抽象类描述事物的信息不具体
    2,抽象类中可以多定义一个成员:抽象函数。
    3,一般类可以创建对象,而抽象类不能创建对象。
3.3 抽象类中是否可以不定义抽象方法。
是可以的,那这个抽象类的存在到底有什么意义呢?仅仅是不让该类创建对象。
3.4 抽象关键字abstract不可以和哪些关键字共存?
  • final:final修饰不能覆盖,而abstract必须覆盖。
  • private:只对父类自己可见。
  • static:随着类加载而加载,只能被类调用,那调用也没有意义。

4. 抽象类练习

需求:

公司中程序员有姓名,工号,薪水,工作内容。
项目经理除了有姓名,工号,薪水,还有奖金,工作内容。
对给出需求进行数据建模。

在问题领域中先找寻其中涉及的对象。

程序员
    属性:姓名,工号,薪水
    行为:工作

项目经理
    属性:姓名,工号,薪水,奖金
    行为:工作

这些对象是否有关系呢?因为发现了他们之间的共性,应该存在着关系。

可以将他们的共性向上抽取到共性类型:员工。
员工:
    属性:姓名,工号,薪水
    行为:工作

发现员工的工作内容本身就不具体。应该是抽象的,由具体的子类来体现的。具体代码:

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 bonus;
	public Manager(String name,String id,double pay,double bonus)
	{
		super(name,id,pay);
		this.bonus = bonus;
	}
	public void work()
	{
		System.out.println("manage");
	}
}
class AbstractTest 
{
	public static void main(String[] args) 
	{
		System.out.println("Hello World!");
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值