-
什么是抽象类:
抽象类只不过是在普通类的基础上增加了抽象方法,并且这个类需要用abstract关键字来修饰。那么什么是抽象方法,抽象方法就是定义了一个方法但并不去实现它,即没有方法体,因为抽象类实现这个方法并没有什么意义,抽象方法要使用abstract关键字来修饰。
比如说,我们定义一个Animal的抽象类,里面定义一个eat的抽象方法,我们都知道各种动物吃各种不同的食物,那么是让Animal类是实现吃竹子,还是吃鱼,对吧,所以是不是让Animal这个类实现eat方法就没有意义,让其子类重写父类的eat方法就好了。
我们来看一个例子:
abstract class Animal{
private String name;
//普通方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//抽象方法,没有方法体,{}中的为方法体
public abstract void eat();
}
class Cat extends Animal {
//子类重写eat方法
@Override
public void eat() {
System.out.println("我喜欢吃小鱼干!");
}
}
class Dog extends Animal {
//子类重写eat方法
@Override
public void eat() {
System.out.println("我喜欢啃骨头!");
}
}
public class Test {
public static void main(String[] args) {
Animal animal = new Dog();
animal.eat();
}
}
我们可以发现,抽象类就只是比普通类多了抽象方法。
- 现在看看要想使用抽象类,应该注意写什么:
-
抽象类不能实例化,因为它的抽象方法没有方法体。
-
抽象类必须有子类,并且这个子类需要实现抽象类中的所有抽象方法,在重写抽象类的方法时,需要注意抽象方法的访问权限,一定要大于等于抽象方法的访问权限。
abstract default void print(); 此时子类要是重写这个方法就只能用public或者default关键字修饰
-
有一种情况子类可以不用全部实现抽象类的方法,那就是这个子类也是抽象类,那么没有实现的方法就交给这个抽象类的子类去实现就好了。
-
抽象类的对象可以通过对象的多态性利用子类为其实例化;
Animal animal = new Dog();
-
抽象方法不能用private关键字修饰,private修饰的属性和方法对于子类来说是隐式继承的,子类并不知道父类有private修饰的属性和方法,抽象方法存在的目的就是为了子类去实现它,私有化就没有意义了,所以抽象方法不能私有化。
-
抽象类中可以不定义抽象方法,但是这个抽象类仍然不能直接实例化。
-
抽象类不能使用final修饰,因为final修饰的类不能有子类,而抽象类必须有子类。
我们看一段特殊的代码:
abstract class A{
public A(){
this.print();//3.调用被子类重写的print方法
}
public abstract void print();
}
class B extends A{
private int num = 10;
public B(int num){
//super(); 隐含这句调用父类构造方法的句子 2.调用父类构造
this.num = num;//5.为类中的属性初始化
}
@Override
public void print() {
System.out.println(this.num);//4.这是的num还是初始值0,打印输出
}
}
public class TestDemo {
public static void main(String[] args) {
new B(30);//1.调用子类构造方法
}
}
输出结果为0
写这个代码的作用是让大家了解抽象类内部怎样调用的,与普通类的调用是一样的,所以大家不要被抽象类的表面所迷惑。