1、多态性
多态性时面像对象中的第三大主要特征,多态性是在继承性的基础之上扩展出来的,可以实现父子类之间的相互转换问题。
实现模式:
1)方法的多态性:
方法的重载:同一个方法名称可以根据传入的参数的类型或个数的不同实现不同功能的实行
方法的覆写:同一个方法可能根据使用的子类的不同有不同的实现
2)对象的多态性:父子实例之间的转换处理
对象向上转型:父类 父类实例 = 子类实例;(自动完成转换)
简单操作:
package Test;
class Base{
public void connect(){
System.out.println("数据库");
}
}
class OracleBase extends Base{
public void connect() {
System.out.println("Oracle数据库");
}
}
class MysqlBase extends Base{
public void connect() {
System.out.println("mysql数据库");
}
}
public class Demo4 {
public static void main(String[] args) {
fun(new OracleBase()); //Base base = new OracleBase();
fun(new MysqlBase()); //Base base = new MysqlBase();
//结果:Oracle数据库
// mysql数据库
}
public static void fun(Base base){
base.connect();
}
}
特点:在于可以堆参数进行统一的设计,增强代码的维护
对象向下转型:子类 子类实例 = (子类)父类实例;(强制完成转换)
简单操作:
package Test;
class Base{
public void connect(){
System.out.println("正常数据数据库存储数据");
}
}
class OracleBase extends Base{
public String edit() {
return "修改数据";
}
public String del() {
return "删除数据";
}
}
public class Demo4 {
public static void main(String[] args) {
System.out.println("正常情况下数据库存储数据");
Base base = new OracleBase(); //向上转型
base.connect();
System.out.println("现在父类的实例想用子类的增加删除功能");
OracleBase oracleBase = (OracleBase)base; //向下转型——强转
System.out.println(oracleBase.edit());
System.out.println(oracleBase.del());
//结果:正常情况下数据库存储数据
//正常数据数据库存储数据
//现在父类的实例想用子类的增加删除功能
//修改数据
//删除数据
}
}
特征:向上描述的是公共特征,向下描述的是子类自己具有的特殊功能,但向下转型不具备安全性。
注意:在发生对象向下转型之前,应该先发生向上转型。
2、instanceof关键字
通过结论可以发现,向下转型存在一定的安全隐患问题,为了保证向下转型的正确性,可以在进行转型之前对子类的某个实例进行是否是某个类的对象进行判断。
语法:对象 instanceof 类;//返回结果为ture(属于类),false(不属于该类)
package Test;
class Base{
public void connect(){
System.out.println("正常数据数据库存储数据");
}
}
class OracleBase extends Base{
public String edit() {
return "修改数据";
}
public String del() {
return "删除数据";
}
}
public class Demo4 {
public static void main(String[] args) {
//不进行转型
Base base = new Base(); //不转型
System.out.println(base instanceof Base);//结果:true
System.out.println(base instanceof OracleBase);//结果:false
//向上转型
Base base1 = new OracleBase();
System.out.println(base1 instanceof Base);//结果:true
System.out.println(base1 instanceof OracleBase);//结果:true
//向下转型的使用
//之前发现,在使用向下转型时会存在问题,所以,在使用向下转型的时候,需要对实例进行判断,是否属于这个类
Base base2 = new OracleBase(); //先向下转型
if (base2 instanceof OracleBase){
OracleBase oracleBase = (OracleBase)base2;//向下转型
System.out.println(oracleBase.edit());
System.out.println(oracleBase.del());
//结果:修改数据
//删除数据
}
}
}