JavaSE面向对象(续)【多态性】

前面总结写了面向对象的三大特征中的封装和继承,本篇将会对面向对象的多态性进行总结学习,同时会穿插一些小细节知识点。我始终认为知识是一点一点积累起来的,基础越牢固,技术就越能得到成长!!!

注意:

Java中常用的包
java.applet用于提供Applet开发的支持,目前已经被flash所替代,很少使用,只有在某些地图系统中还有使用
java.awt和javax.swing用于单机软件或者c/s应用中的界面开发java.io用于输入、输出操作
java.lang语言包,默认自动加载的包java.net用于网络编程
java.util工具包,是Java提供的一些工具类

面向对象的程序

        是由对象组成的,每个对象包含对用户公开的特定功能部分和隐藏的实现部分。在面向对象程序设计中,不必关心对象的具体实现。在传统的结构化程序设计中,算法是第一位的,数据结构是第二位的,即首先确定如何操作数,再考虑如何组织数据,以方便操作。而OOP则颠倒了这种次序,将数据放在第一位,然后再考虑操作数据的算法。

抽象
        忽略掉一个对象或实体的细节而只关注其本质特征的过程,可以简化功能与格式,帮助用户与对象交互是人类解决问题的基本法宝。良好的抽象策略可以控制问题的复杂程度,增强系统的通用性和可扩展性抽象主要包括过程抽象和数据抽象。

(1)过程抽象是将问题域中具有明确功能定义的操作抽取出来,并将其作为一个实体看待
(2)数据抽象是较过程抽象更高级别的抽象方式,将描述客体的属性和行为绑定在一起,实现统一的抽象,从而达到对现实世界客体的真正模拟。


        类是构造对象的模板和蓝图。通俗地说,类相当于建筑的图纸,而对象相当于建筑物。由类构造对象的过程称为创建对象的实例。Java中通过关键字class定义“类",后跟类名。
设计与编写类的过程实际上是一个对实体共有属性和行为的一个抽象的过程。


多态性

        多态性是发送消息给某个对象,让该对象自行决定响应何种行为。通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用

多态形成的三个必要条件:

(1)有继承,父类定义方法,子类重写方法

(2)父类的引用指向子类的对象Object obj=new Date();

(3)可以使用参数传递时多态,也可以直接创建对象时多态

多态可以用三个定义和两个方法来总结。

(1)三个定义分别是父类定义子类构建、接口定义实现类构建和抽象类定义实体类构建

(2)两个方法分别是方法重载和方法重写。

多态分为两种:

(1)编译时多态:方法的重载

(2)运行时多态:JAVA运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行时多态


变量的两种类型

编译期类型

运行时类型

Person p=new Student();
p.sleep();   

//如果试图直接调用Student子类中特定的方法,不包含在Person类定义中
p.study();//语法报错

在IDE工具进行编译时系统识别p为Person类型,所以p只能调用Person类中定义的方法。如果Person类中没有定义study方法,则会出现语法报错

//如果需要调用Student类中定义的,但是Person父类中并没有定义的方法,则需要进行强制类型转换
if(p instanceof Student){   //判断p是否为Student类型   p instanceof Object
    Student tmp=(Student)p;
    tmp.study();
}

类间多态

多态性通过允许同一界面指定一类动作减少了程序的复杂度,编译器工作就是选择适用于各个情况的特定动作,而程序员则无须手动进行选择,使用者仅仅是记得以及利用这个统一的界面

变量的声明

父类 obj=new 子类();

public void 出差(飞机 obj){  //使用比较抽象的类属定义变量,则获取比较灵活的优点
    obj.起飞();
    obj.巡航飞行();
    obj.降落();
}

出差(new 战斗机());      //战斗机 extends 飞机
出差(new 民航机());  

        将子类对象赋值给父类引用变量时,可以称之为向上类型转换,向上类型转换永远可以成功,不需要进行类型判断。同时也证明了子类实际上就是一种特殊的父类。

类内多态

要求:方法名称相同,但是参数不同

在java类中唯一确定一个方法,至少需要2个参数

方法名称

参数类型列表

和返回类型无关,和参数名称无关

重载

参数个数不同

参数类型不同

参数顺序不同

class Person{  //重载可以是在一个类中,也可以在父子类中
    public void pp(){}
    public void pp(int age){}
    public void pp(String name){}
    public void pp(int age,String name){}
    public void pp(String name,int age){}
}

方法重载进行调用时,按照最佳匹配原则选择需要调用的方法

重写和重载

重写一定是在父子类之间,不可能在一个类中

要求:方法签名一致

(1)方法名称一致,参数类型列表一致,返回结果类型一致

(2)子类方法的范围限定词需要大于等于父类的范围

(3)子类方法不能比父类方法抛出更多的异常

public class A1 {
public static void main(String[] args) {
    Parent1 p1=new Son1();
    p1.pp(11);  //Parent1...pp
}
}

class Parent1{
    public void pp(int kk) {
        System.out.println("Parent1...pp");
    }
}

class Son1 extends Parent1{
    public void pp(Integer kk) {  //和pp(int)不是同一个方法,这是方法的重载
        System.out.println("Son1....pp");
    }
}

重载可以在一个类内,也可以是在父类之间

要求:方法名称一致,参数类型列表不同

(1)参数个数不同

(2)参数类型不同

(3)参数顺序不同。不是参数的变量名称不同,例如(String username, String password)和(String password, String username)

(4)和其它无关

public class A{
    public void pp(){}
    public void pp(int kk){}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值