转载声明:文章来源https://blog.csdn.net/2302_76521583/article/details/140128770
一、关键字:abstract(抽象)
举例 : 车可以跑,但具体几个轮子,怎么跑,不同的车(自行车、汽车)不同配置,所以可以将车定义为抽象类
public abstract class Car{ //抽象类:车
public abstract void run(); //抽象方法:跑
}
//自行车
class bicycle extends Car {
@override
public void run(){
System.out.println("骑行")
}
}
(一)抽象类
1、用abstract关键字来表达
(public)abstract class 类名{ } //表达形式
2、不能被实例化,也就是说,不能直接new 一个抽象类,但有自己的构造方法。
原因:抽象类本身代表一个类型,无法确定为一个具体的对象,所以不能实例化就合乎情理了,只能由它的继承类实例化。
3、抽象类 VS 接口(interface)
接口中不能有实例方法去实现业务逻辑
抽象类中可以有实例方法,并实现业务逻辑,比如我们可以在抽象类中创建和销毁一个线程池
4、不能使用final关键字修饰
原因:需要通过继承去实现抽象方法,而final修饰的类是无法被继承
(二)抽象方法
1、不能直接调用。
原因:抽象方法没有主体(没有{ }包起来的业务逻辑),跟接口中的方法有点类似。
2、不能用private修饰。
原因:抽象方法必须被子类实现(覆写),而private权限对于子类来说是不能访问的,所以就会产生矛盾
3、不能用static修饰。
原因:如果用static修饰,就能直接通过类名调用,而抽象方法压根就没有主体,没有任何业务逻辑,这样就毫无意义了。
(三)抽象类与抽象方法
1.抽象类中可以没有抽象方法,但有抽象方法的类一定是抽象类(为了此类不能被实例化)
2.如果A类继承了B抽象类,那么A必须覆写B中的全部抽象方法。
当然不全部覆写也可以,但这个子类就必须也是抽象类(这样做就无意义了)
//抽象类Car
public abstract class Car{
// 实例方法
public void example(){
}
//抽象方法 run1 、run2
public abstract void run1();
public abstract void run2();
}
// 子类bicycle
class bicycle extends Car{ //通过继承实现抽象方法
@override //必须覆写全部抽象方法
public void run1(){
}
@override
public void run2(){
}
}
帖子还没人回复快来抢沙发