抽象类:抽象方法所在的类。抽象类可以包含抽象方法。也可以不包含抽象方法。
抽象方法:abstract修饰的方法。不用大括号。抽象方法必须在抽象类中。
public abstract class Animal {
public abstract void eat();
public void method() {
System.out.println("普通方法");
}
}
注意:
- 抽象类不能实例化对象,必须用一个子类继承抽象类。
- 子类必须覆盖重写父类中所有的抽象方法。(子类去掉父类方法中的abstract关键字,然后补上方法体大括号)
- 创建子类对象。
public abstract class Animal {//声明一个抽象类
public abstract void eat();//抽象方法
public void method() {//普通方法
System.out.println("普通方法");
}
}
public class Cat extends Animal{//子类继承抽象父类
@Override
public void eat() {
//覆盖重写父类中的抽象方法方法,这里因为不是抽象方法,子类也不是抽象类,可实例化。
System.out.print("猫吃鱼");
}
}
public class TestAbstract {
public static void main(String[] args) {
Cat cat = new Cat();//实例化子类对象
cat.eat();//调用子类方法
}
}
//猫吃鱼
其他注意:
- 抽象类可以有构造方法,这是供子类实例对象时调用的。
- 抽象类的子类必须重写父类中所有的抽象方法。除非子类也声明为抽象类。
public abstract class Fu {
public Fu() {
System.out.println("这是父类构造方法");//自己没办法实例调用,供子类调用
}
public abstract void eat();//父类中的抽象方发1
public abstract void drink();//父类中的抽象方发2
}
public class Zi extends Fu {
public Zi() {
//这里默认调用了了父类的构造方法
System.out.println("这是子类中的构造方法");
}
@Override
public void eat() {
System.out.println("吃苹果");
}
@Override
public void drink() {
System.out.println("喝可乐");//覆盖重写了父类中所有的抽象方发
}
}
public class TestAbstract {
public static void main(String[] args) {
Zi child = new Zi();
child.eat();
child.drink();
}
}
//这是父类构造方法
//这是子类中的构造方法
//吃苹果
//喝可乐