1 package face_09; 2 /* 3 * 抽象类: 4 * 抽象:笼统,模糊,看不懂!不具体。 5 * 6 * *特点: 7 * 1,方法只有声明没有实现时,该方法就是抽象方法,需要被abstract修饰。 8 * 抽象方法必须定义在抽象类中。该类必须也被abstract修饰。 9 * 2,抽象类不可以被实例化。为什么?因为调用抽象方法没意义。 10 * 3,抽象类必须有其子类覆盖了所有的抽象方法后,该子类才可以实例化。 11 * 否则,这个子类还是抽象类。 12 * *问题: 13 * 1,抽象类中有构造函数吗? 14 * 有,用于给子类对象进行初始化。 15 * 16 * 2,抽象类可以不定义抽象方法吗? 17 * 可以的。但是很少见,目的就是不让该类创建对象。AWT的适配器对象就是这种类 18 * 通常这个类中的方法有方法体,但是却没有内容。 19 * 20 * class Demo{ 21 * void show1(){} 22 * void show2(){} 23 * } 24 * 3,抽象关键字不可以和哪些关键字共存? 25 * private abstract不行 一般抽象方法用于被覆盖,private后私有化不能覆盖 26 * static abstract不行 成员变静态 不需要对象,类名调用方法,但抽象方法调用没意义方法体都没有。 27 * final abstract不行 final修饰不能有子类,两者排斥 28 * 4,抽象类和一般类的异同点。 29 * 相同点: 30 * 抽象类和一般类都是用来描述事物的,都在内部定义了成员。 31 * 不同点: 32 * 1,一般类有足够的信息描述事物。 33 * 抽象类描述事物的信息有可能不足。 34 * 2,一般类中不能定义抽象方法,只能定义非抽象方法。 35 * 抽象类中可以定义抽象方法,同时也可以定义非抽象方法。 36 * 3,一般类可以被实例化。 37 * 抽象类不可以被实例化。 38 * 5,抽象类一定是个父类吗 39 * 是的,因为需要子类覆盖其方法后才可以对子类实例化。 40 */ 41 abstract class Demo{ 42 43 abstract /*抽象*/void show(); 44 45 } 46 class DemoA extends Demo { 47 void show() { 48 //System.out.println("demoa show");这里不覆盖就会有继承上面的抽象方法,该类也必须是抽象类 49 } 50 } 51 class DemoB extends Demo { 52 void show() { 53 System.out.println("demob show"); 54 } 55 } 56 57 abstract class 犬科 { 58 abstract void 吼叫(); 59 } 60 class 狗 extends 犬科 { 61 void 吼叫() { 62 System.out.println("汪汪"); 63 } 64 } 65 class 狼 extends 犬科 { 66 void 吼叫() { 67 System.out.println("嗷嗷"); 68 } 69 } 70 public class AbstractDemo { 71 public static void main(String[] args) { 72 System.out.println("Hello World"); 73 } 74 }