一 抽象类
1.1 抽象类
- 用abstract关键字来修饰一个类时,这个类叫做抽象类;用abstract来修饰一个方法时,该方法叫做抽象方法
- 含有抽象方法的类必须被声明为抽象类,抽象类必须被继承,抽象方法必须被重写(如果不重写,那么它也是抽象类)
- 抽象类不能被实例化
- 抽象方法只需声明,而不需实现
- 抽象类的构造方法必须有,因为子类还需要调用
1.1.1 抽象类的作用
- 用来被继承,必须有子类
- 模板模式:抽象类是一个模板,子类可以在模板的基础上进行功能的扩展,避免了子类设计的随意性
1.1.2 abstract不能和哪些关键字共存?
- private:不能在子类中直接访问和重写
- fina:final类不能被继承,final不能被重写;abstract需要被继承,abstract需要被重写,所以两者有冲突
- static:因为静态方法是在加载类的时候存放在方法区,在创建对象之前是可以用类型直接调用,调用的这个抽象方法需要创建对象
例如下面一段代码
class Animal {
private String name;
Animal(String name) {
this.name = name;
}
public void Cry() {
//System.out.println("Cry......"); 只需要定义,而无需实现。
}
}
class Cat extends Animal {
private String eyeColor;
Cat(String n, String c) {
super(n);
eyeColor = c;
}
public void Cry() {
System.out.println("Cat Cry......");
}
}
class Dog extends Animal {
private String furColor;
Dog(String n, String c) {
super(n);
furColor = c;
}
public void Cry() {
System.out.println("Dog Cry......");
}
}
public class Abstrack {
public static void main(String[] args) {
Animal c = new Cat("cat","blue");
Animal d = new Dog("dog","black");
c.Cry();
d.Cry();
}
}
如上面的public void Cry() {System.out.println("Cry......");}方法,这个方法在其子类的方法中一定需要重写,所以此时就无需方法实现,而只需要定义即可,定义的目的是让其子类重写
而为了更加精确的定义,所以使用abstrack来限制,如下所示:
abstract class Animal {
private String name;
Animal(String name) {
this.name = name;
}
public abstract void Cry(); //使用abstract限制,称为抽象方法
}
class Cat extends Animal {
private String eyeColor;
Cat(String n, String c) {
super(n);
eyeColor = c;
}
public void Cry() {
System.out.println("Cat Cry......");
}
}
class Dog extends Animal {
private String furColor;
Dog(String n, String c) {
super(n);
furColor = c;
}
public void Cry() {
System.out.println("Dog Cry......");
}
}
public class TestAbstrack {
public static void main(String[] args) {
Animal c = new Cat("cat","blue");
Animal d = new Dog("dog","black");
c.Cry();
d.Cry();
}
}
使用abstract将其声明为抽象方法以后,其类也必须被声明为abstract抽象类