一*抽象类:
1.1抽象类概念:
在面向对象的概念中,所有对象都是通过类来描述的,但是反过来,并不是多又累都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘具体的对象,这样的类就是抽象类。
总的来说:父类中的方法没有具体的实现,需要子类对父类的方法进行重写去实现具体的功能或者行为。像这种没有实际工作的方法,我们可以把它设计为一个抽象方法,而包含了抽象方法的类我们称为抽象类。
1.2抽象类语法:
在java中,一个类如果被 abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法。而抽象方法不用给出具体的实现体。即没有{...}代码块。
例1:定义抽象类和抽象方法:
public abstract class Shape{//定义一个Shape抽象类
public String name;//成员变量
public abstract void draw();//抽象方法
private abstract void method();//报错
void calArea(){//普通方法
System.out.println("计算面积!");
}
public Shape(){//无参构造方法
System.out.println("Shape构造方法!");
}
public Shape(String name) {//有参构造方法
this.name = name;
}
}
注意:抽象类也是类,内部可以包含普通方法和属性,甚至构造方法。
1.3抽象类特性:
1.抽象类不能直接实例化对象。
2.抽象方法不能是private的,且如果没加访问限定符时,默认时public的。
3.抽象方法不能被final和static修饰,因为抽象方法要被子类重写。
4.抽象类必要要被子类继承,且子类必须要重写父类的抽象方法,除非子类也是抽象类,可以不用重写,但出来混迟早要还的,如果下一个类继续继承这个抽象类,就要把所有的抽象方法都要重写。
5.抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类。
6.抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量。
7.抽象类的作用相当于多了一重编译器的校检。
例2:抽象方法和抽象类的定义和访问
abstract class Shape{
public String name;
public abstract void draw();
// public static abstract void methodA();报错,static不能修饰抽象方法
//public abstract final void methodA();报错,final不能修饰抽象方法
void calArea(){
System.out.println("calArea普通方法!");
}
public Shape(){
System.out.println("Shape无参构造方法!");
}
public Shape(String name) {
this.name = name;
System.out.println("Shape有参构造方法!");
}
}
class Flower extends Shape{
@Override
public void draw() {
System.out.println("❀");
}
}
class Triangle extends Shape{
@Override
public void draw() {
System.out.println("△");
}
}
class Circular extends Shape{
@Override
public void draw() {
System.out.println("○");
}
}
public class Test1 {
public static void draw(Shape shape){
shape.draw();
}
public static void main(String[] args) {
Shape shape=new Circular();
shape.draw();
Shape shape1=new Flower();
shape1.draw();
Shape shape2=new Triangle() ;
shape2.draw();
// Shape shape4=new Shape();报错,抽象类的不能实例化
}
}