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