JAVA学习*抽象类
抽象类
在Java中,被abstract
关键字修饰的类被称为抽象类。
特点
1、当一个类继承了抽象类,一定要重写抽象方法!!!
public abstract class Animal {
public int age;
public String name;
//抽象方法
public abstract void func();
//普通类方法
public void test() {
System.out.println("调用Animal类的test()");
}
}
public class Bird extends Animal {
//重写抽象方法
@Override
public void func() {
System.out.println(this.name+"可以飞!");
}
}
public class Fish extends Animal{
@Override
public void func() {
System.out.println(this.name+"可以游泳!");
}
}
public class Dog extends Animal{
@Override
public void func() {
System.out.println(this.name+"可以狗刨!");
}
}
注意:
1、抽象方法是有abstract关键字的方法,并且没有函数体,以分号结尾。
//eg.
public abstract void func();
2、当子类没有重写抽象类时,会报错。
这里提示要么声称Bird类为抽象类,要么重写func()抽象方法。
3、当抽象类继承了抽象类,此时子类抽象类可以不用重写,但子类抽象类的子类一定要把所有的抽象方法都重写了!
例如:
public abstract class Animal {
public int age;
public String name;
public abstract void func();
public void test() {
System.out.println("调用Animal类的test()");
}
}
public abstract class AbstractBird extends Animal{
public abstract void test();
}
public class Bird extends AbstractBird {
@Override
public void func() {
System.out.println(this.name+"可以飞!");
}
@Override
public void test() {
System.out.println("测试");
}
}
在Bird类中一定要重写func()和test()抽象方法。
2、抽象类不能实例化对象
3、抽象方法不能是static、final、private方法
因为static、final、private方法是不能被重写的,而抽象类一定要重写。
4、抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类
5、抽象类中可以有构造方法
public abstract class Animal {
public int age;
public String name;
public Animal(int age, String name) {
this.age = age;
this.name = name;
System.out.println("调用Animal类构造方法");
}
public abstract void func();
public void test() {
System.out.println("调用Animal类的test()");
}
}
public class Bird extends Animal {
@Override
public void func() {
if(this.name!=null){
System.out.println(this.name+"可以飞!");
} else {
System.out.println("name为空");
}
}
public Bird(int age, String name) {
super(age, name);
System.out.println("调用Bird类构造方法");
}
}
public class Test {
public static void main(String[] args) {
Bird bird = new Bird(2,"黑子");
bird.func();
System.out.println("-----------");
Animal animal = new Bird(1,"白白");//发生向上转型
animal.func();//发生多态,调用子类func()方法。
}
}
会先调用父类的构造方法来初始化父类的成员变量,然后再调用子类的构造方法,最后执行子类实现的抽象方法。
输出:
调用Animal类构造方法
调用Bird类构造方法
黑子可以飞!调用Animal类构造方法
调用Bird类构造方法
白白可以飞!
抽象类的意义
1、抽象类不能实例化,其他的很多都和普通类差不多,但通过定义抽象类能帮助我们检测需要由子类完成的方法是否被重写了,编译器会自动检查。
2、虽然抽象类不能实例化,但我们仔细想想,世界上并不存在叫Animal这个生物,这并不需要实例化。抽象类有点像一些事物的共性的总结,普遍性与特殊性的关系。用于对具有相似特征和行为的一类事物进行抽象、概括、总结。