抽象:模糊 == 看不懂
继承:发现事物之间的共性关系,并向上抽取,以提高代码的复用性
事物里都具备这个功能,但是这个功能是什么,怎么去做,不知道,这就涉及到了抽象
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("张三"));
}
}