JAVA自学教程之(继承下:抽象类abstract)



JAVA自学教程之(继承下:抽象类abstract)。

抽象:模糊 == 看不懂

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

 

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

 

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

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

 

  1. abstract class C
  2. {
  3.     abstract void show();
  4. }
  5. class A extends C
  6. {
  7.     void show()
  8.     {
  9.         System.out.println(“A”);
  10.     }
  11. }
  12. class B extends C
  13. {
  14.     void show()
  15.     {
  16.         System.out.println(“B”);
  17.     }
  18. }
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");
	}
}

 


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

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

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

 

 

  1. abstract class 犬科
  2. {
  3.     abstract void sing();
  4.     //四条腿,两个眼睛,跑,跳….
  5. }
  6. class 狗 extends 犬科
  7. {
  8.     void sing()
  9.     {
  10.         System.out.println(“嗷嗷叫”);
  11.     }
  12.     //。。。。
  13. }
  14. class 狼 extends 犬科
  15. {
  16.     void show()
  17.     {
  18.         System.out.println(“汪汪叫”);
  19.     }
  20.     //。。。
  21. }
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
练习:
题目描述:
需求:公司里有程序员,程序员有姓名、工号、薪水、工作内容 项目经理,有有姓名、工号、薪水、工作内容,还有奖金 对给定的需求进行数据建模。

  1. /*
  2. * 分析:
  3. * 找出涉及对象。
  4. *      名次提炼法:
  5. * 程序员:姓名、工号、薪水、工作内容  行为:工作
  6. * 经理:姓名、工号、薪水、工作内容、奖金  行为:工作
  7. *
  8. * 程序员和经理不存在直接的继承关系(经理不一定就会写程序)
  9. * 但是他们有共性,因为他们都是公司的员工,所以可以进行抽取
  10. */
  11. //描述员工
  12. abstract class MAN
  13. {
  14.     private String name;
  15.     String id;
  16.     double pay;
  17.     MAN(String name,String id,double pay)
  18.     {
  19.         this.name = name;
  20.         this.id = id;
  21.         this.pay = pay;
  22.     }
  23.     public void set(String name)//因为是私有的,所以采用set、get来进行数据的输入和输出
  24.     {
  25.         this.name = name;
  26.     }
  27.     public double get(String name)
  28.     {
  29.         return pay;
  30.     }
  31.     public abstract void work();//怎么工作,确定不了,所以加abstract
  32. }
  33. class programer extends MAN
  34. {
  35.     public programer(String name ,String id,double pay)
  36.     {
  37.         super(name, id, pay);
  38.     }
  39.     public void work()
  40.     {
  41.         System.out.println(“work…..”);
  42.     }
  43. }
  44. class Manger extends MAN
  45. {
  46.   private   int bonus;
  47.     Manger(String name ,String id,double pay,int bouns)
  48.     {
  49.     super(name, id, pay);
  50.     this.bonus = bouns;
  51.     }
  52.     public void  work()
  53.     {
  54.         System.out.print(“mange….”);
  55.     }
  56. }
  57. public class Main
  58. {
  59.     public static void main(String[] args)
  60.     {
  61.         Manger BLF = new Manger(“张三”, “110″, 8000, 500);
  62.         BLF.work();
  63.         BLF.set(“张三”);
  64.         System.out.println(BLF.get(“张三”));
  65.     }
  66. }