1. 抽象类和抽象方法(abstract)的基本代码
用关键字abstract修饰的类称为abstract类(抽象类)。 例如:
abstract class A {
//......
}
用关键字abstract修饰的方法称为abstract方法(抽象方法)
例如:
abstract int min(int x,int y);
2. abstract类有如下特点
●和普通的类相比,abstract类里可以有abstract方法。也可以没有。对于abstract方法,只允许声明,不允许具体实现,而且不允许使用final修饰abstract方法。
final关键字:加上之后该方法就不能被重写。
而抽象方法(abstract)---就是用来被重写的
●对于abstract类,不能使用new运算符创建该类的对象,只能产生其子类,由子类继承该抽象类并创建对象、实现抽象方法。 ●如果一个类是abstract类的子类,它必须具体实现父类的所有的abstract方法。
●抽象类中可以写构造方法。
例如:
public abstract class PayServiceAbstract implements PayService {
public abstract void realPay(PayParams payParams);
}
public class AliPayServiceAbstractImpl extends PayServiceAbstract {
@Override
public void realPay(PayParams payParams) {
System.out.println("支付宝支付处理中...");
}
}
3. 理解抽象类的关键:
-
抽象类可以抽象出行为标准(代码模版),这些行为标准、代码模版用抽象方法来表示,即抽象类封装了其子类必须要有的行为标准
-
抽象类就是一个模版!!!!----- 可以用在设计模版模式中。
-
抽象类声明的对象可以成为其子类的对象的上转型对象,调用子类重写的方法,即体现子类根据抽象类里的行为标准给出的具体行为。
4. 上转型对象
-
如果B类是A类的子类或间接子类,当用B类创建对象b并将这个对象b的引用赋给A类对象a时,如:
A a; a = new B(); // 或者 B b = new B(); a = b;
则称A类对象a是子类B对象b的上转型对象。
特点
-
属性访问:
-
上转型对象(如上述的a)不能操作子类B新增加的成员变量,即失去了对子类新增属性的直接访问、调用能力。但它可以操作子类继承或隐藏的成员变量。
-
它可以调用子类继承的或重写的方法。如果子类重写了父类的某个方法,则上转型对象调用该方法时,实际执行的是子类重写后的版本。
-
-
类型转换:
-
上转型是自动的,不需要显式地进行类型转换。
-
但如果需要将上转型对象再转换回其原始子类类型(即下转型),则需要显式地进行类型转换,并可能需要使用
instanceof
操作符来检查类型是否匹配,以避免ClassCastException
。
-
示例
以Java IO流为例,FileOutputStream
是OutputStream
的子类。当我们创建FileOutputStream
对象并将其引用赋值给OutputStream
类型的变量时,就发生了上转型:
OutputStream output;
output = new FileOutputStream(filename);
在这里,output
就是FileOutputStream
对象的一个上转型对象。
使用场景
-
当我们不需要直接访问子类的特有属性和方法,而只需要使用父类定义的通用功能时,可以使用上转型来提高代码的通用性和扩展性。
-
在实现多态时,经常会使用上转型来允许父类类型的变量引用不同类型的子类对象,并在运行时根据对象的实际类型执行相应的方法。