1.抽象类
1.1抽象类的概念
概念:在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
1.2抽象类的语法
// 抽象类:被abstract修饰的类 public abstract class Shape { // 抽象方法:被abstract修饰的方法,没有方法体 abstract public void draw(); abstract void calcArea(); // 抽象类也是类,也可以增加普通方法和属性 public double getArea(){ return area; } protected double area; // 面积 }
注意:抽象类也是类,内部可以包含普通方法和属性,甚至构造方法
1.3 抽象类特性
1.抽象类不能实例对象
abstract class Shape { } public class Test_11_17 { public static void main(String[] args) { Shape shape=new Shape();//error } }
2. 抽象方法不能是 private 的
abstract class Shape { abstract private void draw();//error } public class Test_11_17 { public static void main(String[] args) { } }
注释:抽象方法不能用private修饰这就很好理解,private修饰符的访问权限是同意个包的同一类,抽象类不能实例化因此就自相矛盾了,并且抽象类的意义主要是对方法重写,如果用private修饰符修饰完全没给子类重写的机会。
3. 抽象方法不能被final和static修饰,因为抽象方法要被子类重写
public abstract class Shape { abstract final void methodA(); abstract public static void methodB(); }
4. 抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,如果不重写父类中的方法子类也要修改成抽象类使用 abstract 修饰。
abstract class Shape { abstract public void draw(); } class Circle extends Shape { @Override public void draw() { System.out.println("⚪"); } } public class Test_11_17 { public static void main(String[] args) { Circle circle=new Circle(); circle.draw(); }
5. 抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类
6. 抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量
1.4抽象类的作用
抽象类本身不能被实例化, 要想使用, 只能创建该抽象类的子类. 然后让子类重写抽象类中的抽象方法.
普通的类也可以被继承, 普通的方法也可以被重写, 为啥非得用抽象类和抽象方法呢?
确实如此. 但是使用抽象类相当于多了一重编译器的校验. 使用抽象类的场景就如上面的代码, 实际工作不应该由父类完成, 而应由子类完成. 那么此时如果不小心误用成父类 了, 使用普通类编译器是不会报错的. 但是父类是抽象类就会在实例化的时候提示错误, 让我们尽早发现问题. 很多语法存在的意义都是为了 "预防出错", 例如我们曾经用过的 final 也是类似. 创建的变量用户不去修改, 不就相当于常量嘛? 但是加上 final 能够在不小心误修改的时候, 让编译器及时提醒我们. 充分利用编译器的校验, 在实际开发中是非常有意义的.