概述
抽象类(abstract)
概念
abstract修饰符可以用来修饰类和方法
用abstract修饰的类表示抽象类,抽象类是不能被实例化的,而没有使用abstract修饰的类称为具体类,具体类可以实例化
用abstract修饰的方法表是抽象方法,抽象方法是没有方法体的,不提供方法的实现,而没有用abstract修饰的方法称为具体方法,具体方法可以具有方法体
特点
- 如果一个类中有抽象方法,那么这个类一定是抽象类,反之不成立
- 子类如果继承了这个类的话要么把类声明为抽象类,或者重写该抽象方法,否则报错
- 抽象类是不能被实例化的(new 对象),只能用子类对象来实现
- 没有抽象构造方法,也没有抽象静态方法
- 抽象类和抽象方法不能和final连用
用法
当一个方法没有必要提供或实现此方法的时候则使用抽象方法
声明抽象方法和抽象类的代码如下
//抽象类
public abstract class TestAbstract {
//抽象方法
public abstract void method();
}
错误示例:
错误1.子类没有重写父类的抽象方法
//抽象类
public abstract class TestAbstract {
//抽象方法
public abstract void method();
}
//继承了一个抽象的父类
class OrdinaryClass extends TestAbstract{
//当我们没有重写父类的抽象方法
// public void method() {
//
System.out.println("重写父类的构造方法");
// }
//应当重写父类的抽象方法,或者子类也声明为抽象类
}
此时父类是一个抽象类,并且含有一个抽象方法,现在我们OrdinaryClass类继承了父类,但是我们并没有去实现重写父类的抽象方法,也没有设置这个类为抽象类,所以在此程序会报错
错误2.有抽象方法并没有声明抽象类
//普通类
public class TestAbstract {
//抽象方法
public abstract void method();
//包含抽象方法的类应当声明为抽象类
}
抽象类可以没有抽象方法,但是包括了抽象方法的类必须被定义为抽象类,否则编译不通过
错误3.抽象构造方法,抽象静态方法
//抽象类
public abstract class TestAbstract {
//抽象构造方法
public abstract TestAbstract();
//编译出错 不能用abstract来修饰构造方法(应去掉构造方法中的abstract)
public static abstract void method();
//编译出错
}
1. 一个抽象的构造器将永远不会被实现,所以它也不能声明为abstract的
2. 因为static修饰的方法是静态方法,其可以直接被类所调用。而abstract修饰的方法为抽象方法,即无方法体的方法,不能够被直接调用,需要在子类或实现类中去编写完整的方法处理逻辑后才能使用。
3. 抽象类中可以有非抽象的构造方法,在创建子类的示例时会自动调用这些构造方法,而单独的抽象类是不能被实例化的,然而可以创建一个引用变量,其类型是一个抽象类,并让他引用非抽象类的子类实例错误4.abstract和final连用
//抽象类
public abstract final class TestAbstract {
//编译出错:final和abstract不能连用(应去掉其中的一个)
//抽象方法
public abstract void method();
}
//抽象类
public abstract class TestAbstract {
//抽象方法
public abstract final void method();
//编译出错:final和abstract不能连用(应去掉其中的一个)
}
抽象方法和抽象类都不能被final修饰,也就是说abstract不能和final修饰符连用,因为抽象类只允许创建子类来实现它的抽象方法,并且只有它的具体子类才能实例化,而final修饰的类是不允许有子类的,而且用final修饰的方法不允许被重写,因此把abstract和final放在一起的话,会导致自相矛盾
最后
以上就是默默楼房为你收集整理的Java基础——抽象类(abstract)抽象类(abstract)的全部内容,希望文章能够帮你解决Java基础——抽象类(abstract)抽象类(abstract)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复