1.什么是抽象:
比如:图形有正方形、三角形、圆形等。这些具体的图形为子类,然而父类是个抽象的图形概念,
在父类中定义一个计算图形面积的方法,但却不知道这个方法具体是执行哪个图形的,这就是抽象方法。
定义一个父类为动物,其中定义一个方法为吃东西,
子类中有猫子类和狗子类,在父类中的动物吃东西,也没有具体到是哪个动物吃东西,所以这是一个抽象方法。
注:如果父类当中的方法不确定如何进行{}方法实现,那么这就应该是一个抽象方法。
2.抽象方法:就是加上abstract关键字,然后去掉大括号,直接分号结束。
抽象类:抽象方法所在的类,必须是抽象类才行。在class之前写上abstract即可。
如何使用抽象类和抽象方法:
1.不能直接创建new抽象类对象。
2.必须用一个子类来继承抽象父类。
3.子类必须覆盖重写抽象父类当中所有的抽象方法。
覆盖重写(实现):去掉抽象方法的abstract关键字,然后补上方法体大括号。
4.创建子类对象进行使用。
package cn.itcast.day09.demo11;
/**
* @Author: Jason
* @Date: 2019/7/21 18:23
* @Version 1.0
*/
public abstract class Animal {
//这就是一个抽象方法,代表吃东西,但是具体吃什么(大括号的内容)不确定。
public abstract void eat();
//这是普通的成员方法
public void normalMethod(){
}
}
package cn.itcast.day09.demo11;
/**
* @Author: Jason
* @Date: 2019/7/21 18:44
* @Version 1.0
*/
// 2.必须用一个子类来继承抽象父类。
public class Cat extends Animal{
// 3.子类必须覆盖重写抽象父类当中所有的抽象方法。
// 覆盖重写(实现):去掉抽象方法的abstract关键字,然后补上方法体大括号。
@Override
public void eat(){
System.out.println("猫吃鱼!");
}
}
package cn.itcast.day09.demo11;
/**
* @Author: Jason
* @Date: 2019/7/21 18:42
* @Version 1.0
*/
public class DemoMain {
public static void main(String[] args) {
// 1.不能直接创建new抽象类对象。
// Animal animal = new Animal(); //错误写法! 不能直接创建抽象类对象
// 4.创建子类对象进行使用。
Cat cat = new Cat();
cat.eat();
}
}
3.抽象方法和抽象类的注意事项:
1.抽象类不能创建对象,如果创建,会报错。只能创建其非抽象子类的对象。
2.抽象类中,可以有构造方法,是供子类创建对象时,初始父类成员使用的。
package cn.itcast.day09.demo11.demo12;
/**
* @Author: Jason
* @Date: 2019/7/21 20:56
* @Version 1.0
*/
public abstract class Fu {
public Fu(){
System.out.println("抽象父类的构造方法执行!");
}
public abstract void eat();
}
package cn.itcast.day09.demo11.demo12;
/**
* @Author: Jason
* @Date: 2019/7/21 20:56
* @Version 1.0
*/
public class Zi extends Fu {
public Zi(){
// super(); 通过super来访问父类抽象类
System.out.println("子类构造方法执行!");
}
@Override
public void eat() {
System.out.println("吃饭吧!");
}
}
package cn.itcast.day09.demo11.demo12;
/**
* @Author: Jason
* @Date: 2019/7/21 21:01
* @Version 1.0
*/
public class DemoMain {
public static void main(String[] args) {
//父类不能new 在子类中通过super 访问
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 sleep() {
System.out.println("狗狗睡觉!");
}
// public abstract void eat();
}
public class Dog2H extends Dog {
@Override
public void eat() {
System.out.println("2哈吃骨头!");
}
}
public class DogGolden extends Dog{
@Override
public void eat() {
System.out.println("金毛吃大骨头!");
}
}
package cn.itcast.day09.java.demo13;
/**
* @Author: Jason
* @Date: 2019/7/21 21:41
* @Version 1.0
*/
public class DemoMain {
public static void main(String[] args) {
// Animal animal = new Animal() ; 错误的写法 抽象类不能直接创建
// Dog dog = new Dog(); 同上
Dog2H hh = new Dog2H(); //普通类 可以直接new 对象
hh.eat();
hh.sleep();
System.out.println("===================");
DogGolden dogGolden = new DogGolden();
dogGolden.eat();
dogGolden.sleep();
}
}