抽象类
定义:抽象类前使用 abstract 关键字修饰,该类为抽象类
抽象类需要注意的几点:
1.抽象类是约束子类必须要有什么样的方法,而并不关注子类是如何实现的;
2.抽象类的应用场景:
a) 在某些情况下,父类只是知道子类应该包含怎样的方法,但不关心这些子类如何具体实现这些方法,达到动态多态的效果;
b) 从多个具有部分相同特征的类中,抽象出共性从而创建出抽象类,然后以这个抽象类作为子类的模板,从而避免子类设计的随机性;
3.抽象类中定义的抽象方法,只有声明,不能有实现。所以抽象方法没有方法体,而且是以分号结束,其中抽象方法必须用abstract关键字进行修饰;
public abstract class Telephone {
//抽象方法,方法体是以分号结束,只有声明,不要具体实现;
public abstract void call();
}
4.抽象类中既可以包含抽象方法,也可以包含普通方法,抽象类也可以没有抽象方法;
易错点:有抽象方法的类一定是抽象类,但是抽象类中不一定有抽象方法;
public abstract class Telephone {
public abstract void call();
public void message(){
System.out.println("这是一个抽象类中的普通方法");
}
}
public abstract class Telephone {
public void message(){
System.out.println("这是一个抽象类中的普通方法");
}
public void toMessage(){
System.out.println("没有抽象方法的抽象类");
}
}
5.抽象类不能直接创建,因为抽象类中无具体的实现方法,所以不能用抽象类创建对象。常见解决创建对象的方法有两种,以上述 Telephone类为例:
//父类
public abstract class Telephone {
public void message(){
System.out.println("我是抽象类中的普通方法");
}
public abstract void call();
}
//子类
public class Phone extends Telephone{
//继承了抽象类,必须重写抽象方法
public void call(){
System.out.println("子类重写了抽象类中的抽象方法");
}
public void sell(){
System.out.println("子类可以拥有自己的私有方法");
}
}
以上是父类和子类的定义,下面看mian函数里创建对象:
第一种方法:在创建的对象的时候就实现抽象类中的抽象方法:
public class Main {
public static void main(String[] args) {
Telephone t = new Telephone() {
@Override
public void call() {
System.out.println("第一种创建抽象类对象的方法");
}
};
t.call();
}
}
运行结果:第一种创建抽象类对象的方法
第二种方法:通过定义引用变量来指向子类对象:
public class Main {
public static void main(String[] args) {
Telephone t = new Phone();
t.call();
}
}
运行结果:子类重写了抽象类中的抽象方法;
抽象类与普通类的区别
区别主要有三点:
1. 抽象方法必须为public 或者 protect 。因为如果抽象方法被private修饰的方法,子类是没法实现该抽象方法。缺省的情况下默认为public;
2. 抽象类不能用来创建对象;
3. 如果一个类继承了抽象类,那么该子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则子类也定义为abstract 类
public abstract class Phone extends Telephone{
public void sell(){
System.out.println("子类可以拥有自己的私有方法");
}
}