1.abstract
问题引入
用前面学习的内容,实现下面案例,需求如下:
定义猫类(Cat)和狗类(Dog)
猫类成员方法:eat:猫吃鱼狗类成员方法:eat:狗吃肉
sleep:躺着睡sleep:趴着睡
根据前面所学基本内容(继承、重写),代码实现如下:
.chap07.test;
//基类
classAnimal{
publicvoideat(){
System.out.println("吃饭,吃的东西不确定...");}
publicvoidsleep(){
System.out.println("睡觉,姿势不确定...");}
}
//子类Cat,重写方法
classCatextendsAnimal{ @Override
publicvoideat(){
System.out.println("猫吃鱼");}
@Override
publicvoidsleep(){
System.out.println("躺着睡");
}
}
//子类Dog,重写方法
classDogextendsAnimal{ @Override
publicvoideat(){
System.out.println("狗吃肉");
}
@Override
publicvoidsleep(){
System.out.println("趴着睡");
}
}
publicclassTest011_Animal{
publicstaticvoidmain(String[]args){ Animala=newAnimal();
a.eat();a.sleep();System.out.println("-------------");
Animalc=newCat();c.eat();
c.sleep();
System.out.println("-------------");
Animald=newDog();d.eat();
d.sleep();
}
}运行效果:
思考,上述代码能够完成相应业务,但是否存在不合理的地方?父类Animal中eat、sleep,这两个方法的功能是不明确的,如何通过代码体现这种不明确
实际开发中,一般不会实例化Animal类对象,主要用Animal声明引用指向子类对象,如何通过代码保证Animal类不能实例化对象上述问题,我们可以借助抽象方法和抽象类来实现!
抽象概述抽象,简单可理解为不具体、高度概括的,专业描述为:抽象是一种将复杂的概念和现实世界问题简化为更易于理解和处理的表示方法。在计算机科学和编程中,抽象是一种关注问题的本质和关键特征,而忽略具体实现细节的方法。在面向对象编程中,抽象是通过定义类、接口和方法来实现的,本章我们重点讨论抽象方法和抽象类,具体描述如下。
抽象方法:将共性的行为(方法)抽取到父类之后,发现该方法的实现逻辑无法在父类中给出具体的实现,就可以将该方法定义为抽象方法。
抽象类:如果一个类中存在抽象方法,那么该类就必须声明为抽象类。
抽象特点抽象方法和抽象类必须使用abstract关键字修饰实现
//抽象方法定义格式
publicabstract返回值类型方法名(参数列表);
//特别注意:抽象方法只有方法声明,没有方法的实现
//抽象类定义格式
[权限修饰符]abstractclass类名{
0或多个数据成员0或多个构造方法
0或多个成员方法}
抽象类和抽象方法的关系:使用abstract修饰的类就是抽象类抽象类可以包含,也可以不包含抽象方法包含抽象方法的类,一定要声明为抽象类
抽象类和普通类区别:抽象类必须使用abstract修饰符抽象类相对普通类,多了包含抽象方法的能力抽象类相对普通类,失去了实例化创建对象的能力
抽象类和普通类相同点:符合继承关系特点,能够使用多态机制子类可以重写从抽象类继承的方法
实例化子类对象需要借助父类构造器实现父类部分的初始化
基础案例:要求:定义一个形状类Shape,包含抽象方法getArea(),再定义其子类Circle,重写抽象方法并进行功能测试。(该案例对抽象方法、抽象类基本知识点进行考核)
.chap07.test;
//因为该类中包含了抽象方法,则该类必须声明为抽象类
//定义形状类
abstractclassShape{ privateStringname;
publicShape(){ System.out.println("Shape()...");
}
publicShape(Stringname){
System.out.println("Shape(String)...");
this.name=name;
}
//定义抽象方法,获取形状的面积
//因为现在形状不确定,获取面积的功能实现也是不确定的,故而定义为抽象方法
publicabstractdoublegetArea();}
//正常子类:必须重写所有抽象方法
classCircleextendsShape{
//半径
privateintr;
publicCircle(){
//super();System.out.println("Circle()...");
}
//子类构造器需要借助抽象父类构造器,完成父类部分的初始化
publicCircle(Stringname,intr){ super(name);
System.out.println("Circle(String,int)...");this.r=r;
}
//重写抽象方法
@Override
publicdoublegetArea(){ return3.14*r*r;
}
}
//抽象类抽象方法基础测试
publicclassTest013_AbstractBasic{
publicstaticvoidmain(String[]args){
5//1.抽象类不能实例化对象,下面一行编译报错
//Shapep=newShape();//error
//2.抽象类引用可以指向子类(非抽象类)对象Shapep=newCircle("圆",2);/
/3.实际开发中,主要多态应用
doublearea=p.getArea();
System.out.println("area:"+area);
}
}
//程序运行效果:Shape(String)...Circle(String,int)...area:12.56
动物案例结合抽象类、抽象方法基础内容补充,改良优化动物案例。
案例如下:
抽象父类Animal:
13.chap07.bean;
//该类中包含抽象方法,故而必须声明为抽象类
publicabstractclassAnimal{
//抽象类可以包含数据成员privateStringcolor;privateintage;//抽象类中可以包含抽象方法
18publicAnimal(){}
publicAnimal(Stringcolor,intage){ this.color=color;
this.age=age;}@Override
publicStringtoString(){
return"Animal[color="+color+",age="+age+"]";
}
//因为eat和sleep在父类中无法确定其具体功能,故而设置为抽象方法
publicabstractvoideat();publicabstractvoidsleep();24}正常子类Cat:
.chap07.bean;
publicclassCatextends