特点:
    (1)抽象类和抽象方法否需要使用abstract关键字修饰。

    • 抽象类:abstract class 类名 {}
    • 抽象方法:abstract public 返回值类型 方法名 (参数列表){ }

    (2)抽象类和抽象方法的关系

    • 抽象方法必须存在于抽象类中
    • 抽象类中可以没有抽象方法

    (3)抽象类不可以创建对象

    • 可以由子类来继承抽象类,从而创建对象
    • 抽象类是用于被继承的类

    (4)抽象类和其子类的关系

    • 抽象类的子类只有在全部重写完抽象方法之后才是一个普通类
    • 如果子类没有重写完抽象方法,那么这个子类也是一个抽象类,需要用abstract修饰

    代码如下:

    1. package com.bxw.demo.abstract_;
    2. // 创建一个抽象类
    3. public class AbstractClassTest {
    4. public static void main(String[] args) {
    5. // 创建对象
    6. // new AbstractClass() 抽象类是无法创建对象的(匿名内部类除外)
    7. // 不完全重写的子类也是一个抽象类,因此也无法创建对象
    8. // 完全继承的子类可以创建对象,并给抽象类的普通成员变量赋值
    9. Zi2 zi2 = new Zi2("小白",23); // 直接赋值
    10. // 输出
    11. System.out.println(zi2);
    12. // 单个输出
    13. System.out.println(zi2.getName() + "-----" + zi2.getAge());
    14. }
    15. }
    16. abstract class AbstractClass{
    17. // 抽象类中可以定义成员变量
    18. private int age;
    19. private String name;
    20. // 抽象类中的抽象方法必须使用abstract修饰
    21. // 抽象类中的抽象方法不能有方法体
    22. abstract public void test1();
    23. abstract public void test2();
    24. // 抽象类中也可以有构造方法
    25. // 用于子类对父类的成员变量赋值
    26. public AbstractClass(){}
    27. public AbstractClass(String name, int age){
    28. this.name = name;
    29. this.age = age;
    30. }
    31. // 创建get、set公共访问方式
    32. public int getAge() {
    33. return age;
    34. }
    35. public void setAge(int age) {
    36. this.age = age;
    37. }
    38. public String getName() {
    39. return name;
    40. }
    41. public void setName(String name) {
    42. this.name = name;
    43. }
    44. // 重写toString方法,用来输出对象
    45. @Override
    46. public String toString() {
    47. return "AbstractClass{" +
    48. "age=" + age +
    49. ", name='" + name + '\'' +
    50. '}';
    51. }
    52. }
    53. // 创建一个子类继承抽象类(不完全重写抽象方法)
    54. abstract class Zi extends AbstractClass { // 不完全重写抽象方法,那么这个子类还是一个抽象类
    55. @Override
    56. public void test1() {
    57. }
    58. }
    59. // 创建一个子类继承抽象类(完全重写抽象方法)
    60. class Zi2 extends AbstractClass{
    61. @Override
    62. public void test1() {
    63. }
    64. @Override
    65. public void test2() {
    66. }
    67. public Zi2() {
    68. }
    69. // 创建构造方法,为父类成员变量赋值
    70. public Zi2(String name, int age) {
    71. super(name, age);
    72. }
    73. }

    总结:
    (1)抽象类中的抽象方法不可以有方法体
    (2)抽象类中可以创建普通方法
    (3)抽象类中可以有成员变量