抽象类
抽象类
抽象:笼统 模糊 看不懂!不具体。
这个类怎么就看不懂了?
Demo1和Demo2确实有相同的功能和功能内容一样,发现事物之间的共性,并将事物向上进行抽取,提高代码的复用性
Demo1和Demo2确实有相同的功能,但是功能内容不一样
功能内封装内容,demo必然有显示功能,但是显示内容不一样,故声明体一致,函数体或者说函数内容不一样,也具备共性 声明是相同的,但是内容不一样,也可以向上抽取
抽取了方法的声明,这类事物都具有该功能,但是该功能内容不一样。每一个具体的事物内容都不一样,因为内容不知道,所以不能用大括号结束,只能用分号结束
抽象标识符修饰函数,就称为抽象函数,抽象函数所在的类也必须标识为抽象的。
因为这个类,这个事物中,具备个功能,这个功能是什么怎么去做不知道,事物也就不具体了,--抽象类的由来
狗和狼都有共同的功能,吼叫。犬科具备吼叫,基本功能,叫的声音不确定
当一个类在描述事物的时候,没有足够信息描述这个事物,这个类就是抽象的,功能细节描述不出来。犬科这个事物也不能具体。能明确这个具体细节只能是具体事务。
犬科可能有些功能不是抽象的。抽取的和不抽取有什么不同呢?
如果只会对象做事情,小狗叫,狼叫,但是如果直接使用犬科,不是更简单,子类继承了父类,也有这个功能,用起来很方便
unine -code 都是这个国际码,不管什么语言都可以使用。一般都是英文
抽象类的由来,就是往上抽取,越是往上抽取约不具体,就会出现抽象类,功能是有的,但是功能内容不同,即具体实现方式不一样。
特点
1、方法只有声明没有实现时,该方法就是抽象方法,需要被abstract修饰
抽象方法必须定义在抽象类,该类也必须被abstract修饰
2、抽象类不可以实例化,即不能用new创建对象
不能被实例化的原因:因为调用抽象方法没有意义。实例出来,真真具体的事物也不存在,真在存在的是具体的
new Demo().show();没办法运行
3、抽象类必须有其子类覆盖了所有的抽象方法后,该子类才可以实例化,否则,该子类还是抽象类。(因为继承了抽象类,抽象类的方法也就被抽象出来了) 你集成他就要有他的功能,必须实现它
class Demo(){
abstract /*抽象*/void show();//这个函数看不懂了,一定要做标识,和一般函数不一样
//void show(){
// System.out.println("demo show");
//}
}
class DemoA extends Demo(){
void show(){
System.out.println("demoa show");
}
}
class DemoB extends Demo(){
void show(){
System.out.println("demob show");
}
}
class AbstractDemo(){
public static void main(String[] args) {
void 吼叫();
}
}
分析的是时候先有父类后又子类的
犬科也是事物,也具备功能
abstract class 犬科(){
abstract void 吼叫();
}
class 狗 extends 犬科(){
void 吼叫(){
System.out.println("汪汪");
}
}
class 狼 extends 犬科(){
void 吼叫(){
System.out.println("嗷嗷");
}
}
抽象类细节
1、抽象类中有构造函数嘛?
抽象类不能创建对象,但是抽象类会有子类,抽象类的构造函数可以给其子类对象初始化。有,可以给子类对象初始化
2、抽象类里面可以不定义抽象方法嘛?
可以的,但是很少见。目的就是不让该类创建对象 awt适配器对象就是这种类,为什么产生的。
通常这个类中的方法有方法体,但是没有内容
abstract class Demo(){//这种一般是抽象类,有用,后期讲为什么
void show1();//没有方法体
void show2(){};//有方法体,但是没有内容
}
3、抽象关键字不可以和哪些关键字共存?
private,抽象方法是要被覆盖的,你要是私有化的话,子类不知道,子类对象不能覆盖的方法
static,如果成员变静态,还需要对象嘛,抽象类名调用方法,抽象方法都没有方法体,有什么意义嘛。
final,不能被集成
4、抽象类和一般类异同点
相同:都是描述事物的
1、抽象类和一般类都是描述事物的,都在内部定义了成员
区别:
一般类有足够信息描述事物
抽象类描述事物的信息不足
1、一般类有足够信息描述事物
抽象类描述事物的信息一般不足
2、一般类中,不能定义抽象方法,可以定义非抽象方法
抽象类中可定义抽象方法,也可以定义非抽象方法
3、一般类可以被实例化,抽象类不能被实例化
5、抽象类一定是个父类嘛?
是的,抽象类要被使用,必须由子类去把他实现,去覆盖他的方法。要不然不能实例化用不了
因为需要子类覆盖其方法后才可以对子类实例化
public class AbstractTest {
/*
* 雇员示例:
* 需求:公司中程序员有姓名,工号,薪水,工作内容
* 项目经理除了有除了姓名,工号,薪水,工作内容还有奖金
* 对该需求进行建模
* 照着已有对象,创建模型
*
* 分析:
* 在这个问题领域中,先找出的设计对象,通过名字提炼法,然后看是否封装数据
* 程序员
* 属性:姓名,工号,薪水
* 行为:工作
* 经理
* 属性:姓名,工号,薪水,奖金
* 行为:工作
*
* 重复就要考虑复用
* 程序员和经理不存在直接继承关系。但是程序员和经理却具有共性内容,可以进行抽取,因为他们都是公司的雇员。但是雇员必须具备 姓名,工号,薪水,工作内容
* 将程序员和经理进行抽取,就有了雇员类,建立体系
*
* 先描述雇员
*/
public static void main(String[] args) {
}
}
public abstract class Employee {
private String name;
private String id;
private double pay;
public Employee(String name, String id, double pay) {
super();
this.name = name;
this.id = id;
this.pay = pay;
}
public abstract void work();
}
public class Programmer extends Employee {
public Programmer(String name, String id, double pay) {
super(name, id, pay);
// TODO Auto-generated constructor stub
}
@Override
public void work() {
// TODO Auto-generated method stub
System.out.println("code");
}
}