抽象:模糊 == 看不懂

继承:发现事物之间的共性关系,并向上抽取,以提高代码的复用性


事物里都具备这个功能,但是这个功能是什么,怎么去做,不知道,这就涉及到了抽象


1、继承:A,B两个类,都有show的功能,实现方式也一样那么就可以向上抽取其共性,做新类,使A,B继承于新类。

2、抽象:A,B两个类,都有show的功能,但是功能的实现方式不一样,那么向上抽取其方法生明,但是内容不一样,那么就用关键字abstract标识,表示抽象函数,那么这个类也必须用abstract标识,表示抽象类


abstract class C
{
	abstract void show();
}
class A extends C
{
	void show()
	{
		System.out.println("A");
	}
}
class B extends C
{
	void show()
	{
		System.out.println("B");
	}
}



狗和狼都会吠叫,他们都属于犬科,犬科都有吠叫功能

犬科作为一类事物,他们都具备一个吠叫的功能,但是怎么叫确定不了,这方法就教抽象。

当一个类描述一个事物时,没有足够的信息来描述这个事物,这个类就是抽象的


abstract class 犬科
{
	abstract void sing();
	//四条腿,两个眼睛,跑,跳....
}
class 狗 extends 犬科
{
	void sing()
	{
		System.out.println("嗷嗷叫");
	}
	//。。。。
}
class 狼 extends 犬科
{
	void show()
	{
		System.out.println("汪汪叫");
	}
	//。。。
}



PS:java支持多国语言,灰常强大,开发禁用


特点:

1:方法只有声明没有具体实现时,该方法就是抽象方法,需要被abstract修饰。
  抽象方法必须定义在抽象类中,该类必须也被abstract修饰
2:抽象类不可以被实例化(不可以new)。为什么?因为调用抽象方法没意义。new 犬科...对象是什么,存在么?

3:抽象类必须有其子类覆盖了所有的抽象方法后,该子类才可以被实例化,否则该子类还是抽象类。一只狗没有涵盖基本的犬类特征,那么他就不是一只狗。


抽象类的五大问题:


1、抽象类有构造函数吗?

有,用于给子类对象进行初始化

2、抽象类可以不定义抽象方法吗?
可以
很少见,目的就是让这个类创建对象,AWT的适配器就是这样的类
通常这个类中的方法,有方法体但是没有内容
class D
{
void show1(){}//空方法体,有没有方法体就看有没有大括号
void show2(){}
}

3、抽象关键字不可以和哪些关键字共存?

private,因为子类要继承抽象类, 私有后,子类就不知道,不知道,子类就覆盖不了
static,如果成员变静态,就不需要对象了,直接调用类名就可以了,但是抽象类没有方法体,调用没意义
final,abstract void show();->你可以覆盖我,final  abstract void show();->你不能覆盖我
class D{},你可以有儿子,final class D{},你不可以有儿子

4、抽象类和一般类的异同点?
相同点:
抽象类和一般类都是描述事物的,都在内部定义了成员

不同点:
1、一般类有足够的信息描述事物,抽象类描述事物的信息一般都不足
2、一般类中不能定义抽象方法,只能定义非抽象方法
抽象类中可以定义抽象方法,同时也可以定义非抽象方法
一般类可以被实例化,抽象类不可以实例化

5、抽象类一定是父类吗?

是的,如果要使用这个抽象类那么一定会有类来继承该类,那么就是父类
所以抽象类需要子类覆盖其方法后才可以对子类实例化

abstract class A{......}//A是一个抽象类
// class B extends A  //如果B没有覆盖A所有的抽象方法,那么B还是一个抽象类
abstract class B extends A {.....}
那么要想使用B,就必须有子类来继承B,才能使用B

练习:

题目描述:


需求:公司里有程序员,程序员有姓名、工号、薪水、工作内容
项目经理,有有姓名、工号、薪水、工作内容,还有奖金
对给定的需求进行数据建模。


/*
 * 分析:
 * 找出涉及对象。
 * 		名次提炼法:
 * 程序员:姓名、工号、薪水、工作内容  行为:工作
 * 经理:姓名、工号、薪水、工作内容、奖金  行为:工作
 * 
 * 程序员和经理不存在直接的继承关系(经理不一定就会写程序)
 * 但是他们有共性,因为他们都是公司的员工,所以可以进行抽取 
 */

//描述员工
abstract class MAN
{
	private String name;
	String id;
	double pay;
	MAN(String name,String id,double pay)
	{
		this.name = name;
		this.id = id;
		this.pay = pay;
	}
	public void set(String name)//因为是私有的,所以采用set、get来进行数据的输入和输出
	{
		this.name = name;
	}
	public double get(String name)
	{
		return pay;
	}
	public abstract void work();//怎么工作,确定不了,所以加abstract
}
class programer extends MAN
{
	public programer(String name ,String id,double pay)
	{
		super(name, id, pay);
		
	}
	public void work()
	{
		System.out.println("work.....");
	}
}

class Manger extends MAN
{
  private	int bonus;
	Manger(String name ,String id,double pay,int bouns) 
	{
	super(name, id, pay);
	this.bonus = bouns;
	}
	public void  work() 
	{
		System.out.print("mange....");
	}
}

public class Main
{
	public static void main(String[] args)
	{
		Manger BLF = new Manger("张三", "110", 8000, 500);
		BLF.work();
		BLF.set("张三");
		
		System.out.println(BLF.get("张三"));
	}
}