一、抽象的概述
如果父类当中的方法不确定如何进行{ }方法体实现,那么这就应该是一个抽象方法
二、抽象方法和抽象类的定义格式
抽象方法:就是加上abstract关键字,然后去掉大括号,直接分号结束
抽象类:抽象方法所在的类必须是抽象类,在class之前加上abstract即可
package Day09;
/*
抽象方法:就是加上abstract关键字,然后去掉大括号,直接分号结束
抽象类:抽象方法所在的类必须是抽象类,在class之前加上abstract即可
*/
public abstract class Animal {
//这是一个抽象方法,代表吃东西但是具体吃什么(大括号的内容)不确定
public abstract void eat();
//普通的成员方法
public void normalMethod() {
}
}
三、抽象方法和抽象类的使用
如何使用抽象类和抽象方法
1、不能直接创建new抽象类对象。抽象对象不能单独存在
2、必须用一个子类继承抽象父类
3、子类必须覆盖重写抽象父类当中的所有抽象方法。
4、创建子类对象进行使用
覆盖重写(实现):子类去掉抽象方法的abstract关键字,然后补上方法体大括号
定义抽象类Animal
package Day09;
/*
抽象方法:就是加上abstract关键字,然后去掉大括号,直接分号结束
抽象类:抽象方法所在的类必须是抽象类,在class之前加上abstract即可
如何使用抽象类和抽象方法
1、不能直接创建new抽象类对象。抽象不能单独存在
2、必须用一个子类继承抽象父类
3、子类必须覆盖重写抽象父类当中的所有抽象方法。
4、创建子类对象进行使用
覆盖重写(实现):子类去掉抽象方法的abstract关键字,然后补上方法体大括号
*/
public abstract class Animal {
//这是一个抽象方法,代表吃东西但是具体吃什么(大括号的内容)不确定
public abstract void eat();
//普通的成员方法
public void normalMethod() {
}
}
创建子类cat
package Day09;
public class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃鱼");//须覆盖重写抽象父类当中的所有抽象方法。
};
}
使用子类对象
package Day09;
public class DemoMain {
public static void main(String[] args) {
//Animal animal=new Animal();//错误写法!不能直接创建抽象类对象
Cat cat =new Cat();
cat.eat();
}
}
四、抽象类和抽象方法的注意事项
1、抽象类不能创建对象
2、抽象类中可以有构造方法,是提供子类创建对象时,初始化父类成员使用的
子类的构造方法中有默认的super(),需要访问父类构造方法
定义抽象父类
package Day09_Demo02;
//定义一个抽象父类
public abstract class Fu {
public Fu() {
System.out.println("抽象父类构造方法执行!");
}
public abstract void eat();
}
定义抽象子类
package Day09_Demo02;
public class Zi extends Fu {
public Zi() {
//super();调用父类构造方法
System.out.println("子类构造方法执行");
}
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("吃饭");
}
}
使用抽象子类
package Day09_Demo02;
public class DemoMain {
public static void main(String[] args) {
Zi zi=new Zi();
zi.eat();
}
}
/*抽象父类构造方法执行!
子类构造方法执行
吃饭
*/
3、抽象类中,不一定包含包含抽象方法,但是有抽象方法的类必定是抽象类
package Day09_Demo02;
//定义一个不含抽象方法的抽象类
//没有抽象方法的抽象类也不能直接创建对象,在一些特殊场景下有用途
public abstract class MyAbstract {
}
4、抽象类的子类必须重写抽象父类中所有的抽象方法
否则编译报错,除非该子类也是抽象类
代码示例:
爷爷类抽象对象
package Day09_Demo03;
//最高的抽象父类
public abstract class Animal {
public abstract void eat();
public abstract void sleep();
}
父亲类抽象对象
package Day09_Demo03;
//子类也是一个抽象类
public abstract class Dog extends Animal{
@Override
public void eat(){
System.out.println("狗吃骨头");
}
//public abstract void sleep();
}
子类抽象对象
package Day09_Demo03;
public class DogGolden extends Dog {
@Override
public void sleep() {
System.out.println("睡觉觉");
}
}
另一个子类抽象对象
package Day09_Demo03;
public class Dog2Ha extends Dog{
public void sleep() {
System.out.println("二哈睡觉");
}
}
调用示例
package Day09_Demo03;
public class DemoMain {
public static void main(String[] args) {
//Animal animal=new Animal();//错误,Animal是一个抽象类
//Dog dog=new Dog();//错误,Dog也是一个抽象类
Dog2Ha ha=new Dog2Ha();//Dog2H是一个普通类,可以直接用new创建
ha.eat();
ha.sleep();
DogGolden golden=new DogGolden();
golden.eat();
golden.sleep();
}
}
/*输出结果:
狗吃骨头
二哈睡觉
狗吃骨头
睡觉觉*/