目录
1.抽象类
1.1抽象类概述
1.2抽象类的特点
1.3抽象类的成员特点
1.抽象类
回想一下前面学习过的猫狗案例,我们提取出了一个动物类,这个时候我们可以通过Anima a = new Animal();来创建一个动物类对象。其实这个是不对的,因为我说一个动物,你不知道我说的哪个动物,只有看到了具体的动物才知道这是什么动物,所以动物本身并不是具体的一个事物,而是一个抽象的事物。只有真正的例如:猫、狗;它们才是具体的事物,所以说我们前面的设计是有问题的。同理我们也可以想一想不同的动物它吃的是不同的食物,所以呢我们也不应该在动物类中给出具体的吃的方法实现,只应该给出一个吃的方法声明,不给方法体。接下来就要说一下:
1.1抽象类概述
在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。
直接代码演示:
public abstract class Animal {
//1.动物类里面有一个eat方法
//4.注释调eat方法
// public void eat(){
// System.out.println("吃东西");
// }
public abstract void eat();//抽象法不能有主体所以要分号结尾
}
class AnimalDemo {
public static void main(String[] args) {
//2.在测试类里面创建了动物对象,并调用了eat方法
//6.定义好抽象方法后这里会报错,因为:动物类是抽象的;不能创建对象
//7. Animal a = new Animal();(先了解一下,怎么改后面来说)
//7. a.eat();//吃东西
}
}
1.2抽象类的特点
先到程序中演示再小结:
public abstract class Animal {
//2.类和方法都要加上abstract,才不会报错
public abstract void eat();
//3.再写一个方法
public void sleep(){
System.out.println("睡觉");
}
}
class Cat extends Animal{
//8.继承之后会报错,只要重写方法后就好了
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
//14.让他继承自Animal
abstract class Dog extends Animal{
}
class AnimalDemo {
public static void main(String[] args) {
//6.类有了,创建对象
// Animal a = new Animal();
//9.现在创建对象就要采用多态的形式:
Animal a = new Cat();
//10.调用重写方法和动物类的非抽象方法
a.eat();//猫吃鱼
a.sleep();//睡觉
}
}
小结抽象类的特点:
- 抽象类和抽象方法必须使用abstract关键字修饰。
public abstract class类名 { }
public abstract void 方法名();
- 抽象类中不一定有抽象方法,由抽象方法的类一定是抽象类
- 抽象类不能实例化
抽象类如何实现实例化呢?
参照多态的方式,通过子类对象实例化,这叫抽象类多态。
- 抽象类的子类
要么重写抽象类中的所有抽象方法。
要么是抽象类。
1.3抽象类的成员特点
先到程序中演示再小结:
public abstract class Animal {
//1.研究抽象类里面可以有那些成员,看看抽象类和其他类是否一样
private int age = 20;//没问题
private final String city = "北京";//也没问题
public void show(){
//4.在方法内来更改变量/常量的值
age = 40;//没有问题,因为这里没用final修饰
// city = "四川";//报错,因为city是常量
System.out.println(age);
System.out.println(city);
}
//5.来一个抽象方法
public abstract void eat();//也是可以的,说明抽象类中也是包含抽象方法的
//6.由此可见,抽象类中的方法可以是抽象的也可以是非抽象的。
//7.验证抽象类里面是否可以有构造方法
public Animal(){
//8.没报错,说明它可以有构造方法
}
//10.写一个带参的构造方法
public Animal(int age) {
this.age = age;
}
//12.eat抽象方法有什么用呢?新建一个类→13.
}
class Cat extends Animal{
//14.改写后就没有问题了
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
class AnimalDemo {
public static void main(String[] args) {
//15.创建一个对象,调用方法
Animal a = new Cat();
a.show();//这里输出的是Animal里非抽象方法show的内容
a.eat();//这里输出的是Animal子类Cat中重写的eat方法
}
}
小结抽象类的成员特点:
- 抽象类可以有成员变量
可以是变量;
也可以是常量。
- 抽象类可以有构造方法
有构造方法,但是不能实例化;
那么构造方法的作用是什么呢?
用于子类访问父类数据的初始化。
- 抽象类可以有成员方法
可以有抽象方法:限定子类必须完成某些动作。
也可以有非抽象方法:提高代码复用性。



