抽象类的定义语法
抽象类可以直接产生实例化对象,并且在普通类之中包含有构造方法、普通方法、static方法、常量、变量的内容。而所谓的抽象类就是指在普通类的结构里面增加抽象方法的组成部分
所有的普通方法上面都会有一个"{}",这个表示方法体,有方法体的方法一定可以被对象直接使用。而抽象方法指的是没有方法体的方法,同时抽象,现时抽象方法还必须使用abstract
关键字进行定义
拥有抽象方法的类一定属于抽象类,抽象类要使用abstract
声明
定义抽象类
abstract class A{ // 定义一个抽象类
public void print(){ // 普通方法
System.out.println("存在普通方法");
}
// 此方法并没有方法体的声明,并且存在有abstract关键字,表示抽象方法
public abstract void func();
}
public class testDemo{
public static void main(String args[]){
A a = new A(); // A是抽象的,无法被实例化
a.print();
a.func();
}
}
使用抽象类
root@079a25844567:/opt/lixinghua/OOP# javac testDemo.java
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8
testDemo.java:12: error: A is abstract; cannot be instantiated
A a = new A();
^
1 error
类A 是抽象的,不能被实例化
不能实例化原因:当一个类的对象被实例化之后,就意味着这个对象可以调用类中的属性和方法了,但是在抽象类里面存在抽象方法,抽象方法没有方法体,没有方法体的方法不能被调用,不能被调用就无法产生实例化对象
对于抽象类的使用原则如下:
抽象类必须有子类,即:每一个抽象类一定要被子类所继承
抽象类的子类必须要覆写抽象类之中的全部抽象方法(强制子类覆写)
抽象类的对象实例化需要依靠子类完成,采用向上转型的方式处理
实例化子类(错误示例)
abstract class A{ // 定义一个抽象类
public void print(){ // 普通方法
System.out.println("存在普通方法");
}
// 此方法并没有方法体的声明,并且存在有abstract关键字,表示抽象方法
public abstract void func();
}
// 一个子类只能够继承一个抽象类,属于单继承局限
class B extends A{ // B类是抽象类的子类并且是一个普通类
}
public class testDemo{
public static void main(String args[]){
}
}
子类报错
B不是抽象的,未覆写A中的抽象方法func()
root@079a25844567:/opt/lixinghua/OOP# javac testDemo.java
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8
testDemo.java:10: error: B is not abstract and does not override abstract method func() in A
class B extends A{ // B类是抽象类的子类并且是一个普通类
^
1 error
实例化子类(正确示例)
abstract class A{ // 定义一个抽象类
public void print(){ // 普通方法
System.out.println("存在普通方法");
}
// 此方法并没有方法体的声明,并且存在有abstract关键字,表示抽象方法
public abstract void func();
}
// 一个子类只能够继承一个抽象类,属于单继承局限
class B extends A{ // B类是抽象类的子类并且是一个普通类
public void func(){
System.out.println("Hello world");
}
}
public class testDemo{
public static void main(String args[]){
A a = new B(); // 向上转型
a.func(); // 被子类所覆写过的方法
}
}
输出结果
root@079a25844567:/opt/lixinghua/OOP# javac testDemo.java
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8
root@079a25844567:/opt/lixinghua/OOP# java testDemo
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8
Hello world
总结
1.抽象类的继承子类里面会有明确的方法覆写要求,而普通类并没有
2.抽象类只比普通类多了一些抽象方法定义,其它的组成部分与普通类完全一样
3.普通类对象可以直接实例化,但是抽象类的对象必须经过向上转型才可以得到实例化对象
虽然一个子类可以继承任意的一个普通类,可是从开发的实际要求来讲,普通不要继承另外一个普通类,只能继承抽象类