1 抽象的概念
2 抽象方法和抽象类的定义格式
定义一个Animal类
/*
抽象方法:就是加上abstract关键字,然后去掉大括号直接分号结束
抽象类:抽象方法所在的类必须是抽象类才行。在class之前写上abstract即可
*/
public abstract class Animal{
//这是一个抽象方法,代表吃东西,但是具体吃什么(大括号的内容)不确定。
public abstract void eat();
//这是普通的成员方法
public void normalMethod(){
}
}
3 抽象方法和抽象类的使用
- 创建Animal类
/*
抽象方法:就是加上abstract关键字,然后去掉大括号直接分号结束
抽象类:抽象方法所在的类必须是抽象类才行。在class之前写上abstract即可
如何使用抽象类和抽象方法:
1. 不能直接创建new抽象对象
2. 必须用一个子类来继承抽象父类
3. 子类必须覆盖重写抽象父类当中所有的抽象方法:
覆盖重写(实现):子类去掉抽象方法的abstract关键字,补上方法体和大括号
4. 创建子类对象进行使用
*/
public abstract class Animal{
//这是一个抽象方法,代表吃东西,但是具体吃什么(大括号的内容)不确定。
public abstract void eat();
}
- 创建Animal的子类Cat
public class Cat extends Animal {
@Override//1.
public void eat() {//2.
System.out.println("猫吃鱼");
}
}
- 调用
public class DemoMain {
public static void main(String[] args) {
//Animal animal = new Animal();错误写法,不能直接创建new抽象对象
//4.
Cat cat = new Cat();
cat.eat();//猫吃鱼
}
}
4 抽象方法和抽象类的注意事项
对注意事项2的理解
- 父类
public abstract class Fu {
//构造方法
public Fu(){
System.out.println("抽象父类的构造方法执行");
}
//抽象方法
public abstract void eat();
}
- 子类
public class Zi extends Fu {
//构造方法
public Zi(){
//默认赠送一个super
System.out.println("子类构造方法");
}
//覆盖父类抽象方法
@Override
public void eat() {
System.out.println("吃饭饭");
}
}
- 调用
/*
对注意事项2的理解:
类的构造方法是在创建对象(new)的时候执行的
虽然父类也有构造方法,但是由于父类是抽象类,所以父类Animal不可以创建对象(new),
因此构造方法若想执行必须要通过子类Cat的构造方法中的super来执行
*/
public class DemoMain {
public static void main(String[] args) {
Zi zi = new Zi();
zi.eat();
// 抽象父类的构造方法执行
// 子类构造方法
// 吃饭饭
}
}
注意事项3的理解
/*
一个抽象类不一定含有抽象方法,
只要保证抽象方法所在的类是抽象的即可。
这样没有抽象方法的抽象类,也不能直接创建对象,在一些特殊的常景下有用
*/
public abstract class MyAbstract {
}
注意事项4的理解
- 父类
//最高的抽象父类
public abstract class Animal {
public abstract void eat();
public abstract void sleep();
}
- 子类
public abstract class Dog extends Animal{
@Override
public void eat(){
System.out.println("狗吃骨头");
}
//到目前为止依然报错,原因:这里默认继承了父亲的
//public abstract void sleep();这依然是一个抽象方法
//抽象方法所在的类必须为抽象类,所以若想不报错则要让子类变成抽象类,添加abstract
}
- 子子类
public class DogGolden extends Dog {
@Override
public void sleep() {
System.out.println("呼呼呼...");
}
}
public class Dog2H extends Dog {
@Override
public void sleep() {
System.out.println("嘿嘿嘿...");
}
}
- 调用
public class DemoMain {
public static void main(String[] args) {
// Animal animal = new Animal();
// Dog dog = new Dog();
Dog2H dog2H = new Dog2H();
dog2H.eat();
dog2H.sleep();
DogGolden dogGolden = new DogGolden();
dogGolden.eat();
dogGolden.sleep();
}
}