第三讲 抽象
一、 概述
前面说的了继承和多态,今天我继续来说一下我对抽象的理解,希望能大家一点帮助,顺便我也可以总结中学习。
抽象,顾名思义,简单的说就是虚的,看不见、摸不着的。就像我们生活中所说到的动物、水果什么的,动物和水果都有很多种,在这里没有说明确到底是哪一种动物和水果,所以可以说是抽象的。而在Java语言中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。
我们用abstract关键字来修饰,因此,被其修饰的类和方法叫做抽象类和抽象方法。其格式如下:
修饰类:
abstract class 类名{}
修饰方法:
public abstract void eat(); // 注意:不能有方法体,需要用;结束
注意:
1、类里面有抽象方法,类必须是抽象;
2、但是,抽象类里面不一定全都是抽象方法;
3、抽象类不能实例化,就是不能new ,我们只能使用它的子类对象;虽然不能被实例化,但是依然有构造方法,作用是:当子类创建对象的时候,父类可以初始化数据。
4、子类的要求:要么是抽象的,要么覆盖父类中所有的抽象方法。
二、特点
其最大的特点就是:抽象类和抽象方法必须用abstract关键字修饰,抽象类不一定有抽象方法,有抽象方法的类一定是抽象类,抽象类不能实例化。当然,其成员特点也有,而成员特点又分为成员变量、构造方法、成员方法,它们的特点如下:
成员变量:
可以使变量,也可以常量。
构造方法:
有,不能创建对象,只能初始化数据,也就是说不能实例化,用于子类访问父类数据的初始化。
成员方法:
可以有抽象方法,限定子类必须完成某些动作,也可以有非抽象方法,提高代码的复用性。
三、应用举例
1、一个简单的概念性的题。
abstract 修饰的不能和哪些关键字共存?
答:
private:对子类隐藏,而 abstract 必须让子类重写,因此会产生冲突;
final:final表示最终的意思,不能被重写,产生矛盾冲突;
static:静态的,类名调用,没有方法体。
2、A:案例
具体事物:基础班老师,就业班老师
共性:姓名,年龄,讲课。
<pre class="java" name="code">package abstracttest;
/*
抽象类练习:
A:案例
具体事物:基础班老师,就业班老师
共性:姓名,年龄,讲课。
分析:
1.老师分为:基础班老师,就业班老师
2.共性有:姓名,年龄,讲课;可列为抽象变量和抽象方法
*/
public class TeacherTest{
public static void main(String[] args){
Teacher bt = new BaseTeacher("康老师",28);// 多态
bt.teach();
bt.show();
System.out.println("-----------------------");
Teacher wt = new WorkTeacher();// 多态
wt.teach();
}
}
// 抽象类
abstract class Teacher{
// 成员变量
private String name;
private int age;
// 构造方法
Teacher(){}
Teacher(String name,int age){
this.name = name;
this.age = age;
}
public abstract void teach();
public void show(){
System.out.println(name+"----"+age);
}
}
class BaseTeacher extends Teacher{
BaseTeacher(){}
BaseTeacher(String name,int age){
super(name,age);
}
public void teach(){
System.out.println("我们的基础班老师是....");
}
}
class WorkTeacher extends Teacher{
public void teach(){
System.out.println("我们的就业班老师....");
}
}
结果为:
我们的基础班老师是....康老师----28-----------------------我们的就业班老师....
3、B:案例 具体事物:猫,狗 共性:姓名,年龄,吃饭
package abstracttest;
/*
B:案例
具体事物:猫,狗
共性:姓名,年龄,吃饭
*/
public class AnimalTest{
public static void main(String[] args){
Animal a = new Cat("Tom",2);
a.show();
a.eat();
System.out.println("----------");
Animal b = new Dog();
b.eat();
}
}
abstract class Animal{
// 成员变量
private String name;
private int age;
// 构造方法
Animal(){}
Animal(String name,int age){
this.name = name;
this.age = age;
}
// 成员方法
public abstract void eat();
public void show(){
System.out.println(name+"------"+age);
}
}
class Cat extends Animal{
Cat(){}
Cat(String name,int age){
super(name,age);
}
public void eat(){
System.out.println("吃鱼........");
}
}
class Dog extends Animal{
public void eat(){
System.out.println("吃骨头..........");
}
}
结果为:
Tom------2
吃鱼........
----------
吃骨头..........
-----------android培训、java培训、java学习型技术博客、期待与您交流!------------