一抽象类
1抽象类的产生
当编写一个类时,我们往往会为该类定义一些方法,这些方法是用来描述该类的功能具体实现方式,那么这些方法都有具体的方法体。
但是有的时候,某个父类只是知道子类应该包含怎么样的方法,但是无法准确知道子类如何实现这些方法。比如一个图形类应该有一个求周长的方法,但是不同的图形求周长的算法不一样。那该怎么办呢?
分析事物时,发现了共性内容,就出现向上抽取。会有这样一种特殊情况,就是方法功能声明相同,但方法功能主体不同。那么这时也可以抽取,但只抽取方法声明,不抽取方法主体。那么此方法就是一个抽象方法。
2抽象方法定义的格式:
public abstract 返回值类型 方法名(参数);
抽象类定义的格式:
abstract class 类名 {
}
abstract class Animal{
public abstract void cry();//叫声
}
class Cat extends Animal {
public void cry() {
System.out.println("喵喵");
}
}
class Dog extends Animal{
public void cry() {
System.out.println("汪汪");
}
}
public class Test4 {
public static void main(String[] args) {
Cat c=new Cat();
c.cry();
Dog d=new Dog();
d.cry();
}
}
输出:
喵喵
汪汪
3抽象类的特点
a、抽象类和抽象方法都需要被abstract修饰。抽象方法一定要定义在抽象类中。
b、抽象类不可以直接创建对象,原因:调用抽象方法没有意义。
c、只有覆盖了抽象类中所有的抽象方法后,其子类才可以创建对象。否则该子类还是一个抽象类。
之所以继承抽象类,更多的是在思想,是面对共性类型操作会更简单
4抽象类的细节问题
a、抽象类一定是个父类?
是的,因为不断抽取而来的。
b、抽象类中是否可以不定义抽象方法。
是可以的,那这个抽象类的存在到底有什么意义呢?不让该类创建对象,方法可以直接让子类去使用
抽象类中可以没有抽象方法,但是该类也不能被实例化,也就是说不能new,抽象方法必须在抽象类中。
抽象方法:用abstract修饰的方法(注:抽象方法只有方法声明没有方法体,抽象方法必须在抽象类中,抽象类不能被实例化,不管里面有没有抽象方法),但是抽象类中的构造方法和普通类的构造方法相同,没有什么特殊的,抽象类中的构造方法是供子类构造方法使用的),子类继承该抽象类,会继承父类的抽象方法,要重写它的抽象方法(实现了方法的真正的功能)。如果子类值只重写了部分父类的构造方法,子类还是抽象类(因为里面含有抽象方法),必须用abstarct修饰(注:抽象类是不能创建对象的。
问题1没有抽象方法的抽象类是否可以创建对象?
//不能。抽象类是不能实例化对象的
abstract class A{
public void f() {
System.out.println("f()");
}
}
public class Test2 {
public static void main(String[] args) {
A a=new A();//报错
}
}