/*
* 抽象类
* 抽象:笼统、模糊、看不懂、不具体;
*
* 特点:
* 1、方法只有声明没有实现时,该方法就是抽象方法,需要被关键字abstract修饰 ;
* 2、抽象方法必须在抽象类中,该类必须也被abstract修饰;
* 3、抽象类不可以被实例化(不可以new),因为调用抽象方法没意义;
* 4、抽象类的子类必须覆盖该抽象类的所有抽象方法后,该子类才可以实例化,否则,该子类必须定义成抽象类;
*
* 问:抽象类中有构造函数吗?
* 答:有,用于给子类对象进行初始化。
*
* 问:抽象类可以不定义抽象方法吗?
* 答:可以,但是很少见,目的就是不让该类创建对象,AWT的适配器对象就是这种类,
* 通常这个类中的方法有方法体,但是却没有内容;
*
* 问:抽象关键字不可以和哪些关键字共存?
* 答:private不可以,因为抽象方法必须被子类覆盖,不能被父类私有化
* static不可以,因为如果成员变静态,就不需要对象,没对象,抽象类就是废物;
* final不可以,因为抽象方法必须被子类覆盖,final表示此方法不能被覆盖;
*
* 问:抽象类和一般类的区别?
* 答:相同点:
* 抽象类和一般类都是用来描述事物的,都在内部定义了成员;
* 不同点:
* 1、一般类有足够的信息描述事物;抽象类描述事物的信息有可能不足;
* 2、一般类中不能定义抽象方法,只能定义非抽象方法;抽象类中可以定义抽象方法,同时也可以定义非抽象方法;
* 3、 一般类可以被实例化;抽象类不可能被实例化;
*
* 问:抽象类一定是个父类吗?
* 答:是的,因为需要子类覆盖其方法后才可以对子类实例化;
*/
public class AbstractDemo {
/**
* @param args
*/
public static void main(String[] args) {
狗1 dog = new 狗1();
dog.吼叫();
dog.行走();
dog.吃();
狼 Wolf= new 狼();
Wolf.吼叫();
Wolf.行走();
}
}
abstract class 犬科{
abstract void 吼叫();
abstract void 行走();
}
//抽象类可以没有抽象方法
abstract class Demo{
void show(){
}
}
abstract class 狗 extends 犬科{
void 吼叫(){
System.out.println("狗旺旺");
}
}
class 狗1 extends 犬科{
void 吼叫(){
System.out.println("狗1旺旺");
}
void 行走(){
System.out.println("狗1行走");
}
void 吃(){
System.out.println("狗1吃");
}
}
class 狼 extends 犬科{
void 吼叫(){
System.out.println("狼嗷嗷");
}
void 行走(){
System.out.println("狼行走");
}
}