基础篇——面向对象及多态性详解

写代码的四点:
     1.明确需求。要做什么?
     2.分析思路。要怎么做?(1,2,3……)
     3.确定步骤。每一个思路要用到哪些语句、方法和对象。
     4.代码实现。用具体的语言代码将思路实现出来。
 
学习新技术的四点:
     1.该技术是什么?
     2.该技术有什么特点?(使用需注意的方面)
     3.该技术怎么使用?(写Demo)
     4.该技术什么时候用?(在Project中的使用场景 )
 
----------------------早计划,早准备,早完成。-------------------------
想要了解面向对象首先要知道什么是对象。

对象

     对象就是现实世界中存在的人、事、物体等实体在计算机逻辑中的映射。
     对象具有唯一性、抽象性、继承性、多态性。每个对象都有自身唯一的标识,通过这种标识可找到相应的对象,在对象的整个生命周期中,它的标识都不会改变,不同的对象不能有相同的标识;抽象性是指将具有一致的属性和行为的对象抽象成类,一个类就是一个对象,因此对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象;继承性也是类之间的一种关系,是子类自动共享父类的数据结构和方法的机制,;多态性是指相同的操作、函数或过程可作用于多种类型的对象上并获得不同的结果,多态性增强了软件的灵活性和重用性。
     一切事物皆对象,对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象。对象不仅能表示具体的事物,还能表示抽象的规则、计划和时间。对象具有状态和行为,一个对象用数据值来描述它的状态,用操作改变它的状态,对象及其操作就是对象的行为。对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中。

面向对象(OO——Object Oriented)

      面向对象是一种思想,也是软件开发方法。面向对象的方法是一种把面向对象的思想应用于软件开发过程中,指导开发活动的系统方法。 在面向对象出现之前,计算机编程是基于面向过程的,面向过程强调的是功能行为。而面向对象是将功能封装进对象,强调具备了功能的对象。通过面向对象的方式,将现实世界的事物抽象成对象,将现实世界的关系抽象成类、继承,帮助人们实现对现实世界的抽象与数字建模。所以说面向对象就是基于对象概念,以对象为中心,以类和继承为构造机制,来认识、理解、刻画现实世界和设计、构建相应的软件系统。

面向对象的三大特征: 封装性、继承性、多态性

      1.封装性:只隐藏对象的属性和实现细节,仅对外提供公共的访问方式。
                    好处:将变化隔离、便于使用、提高复用性、提高安全性;
                    原则:将不需要对外提供的内容隐藏起来,把属性隐藏,提供公共方法对其访问。
                    注:私有仅仅是封装的一种体现形式而已。
      2.继承性:extends,两种事物间存在着一定的所属关系,继承的类就可以从被继承的类中获取一些属性和方法,提高了代码的复用性。继承是多态的前提。继承性是面向对象程序设计语言不同于其它语言的最重要的特点,是其他语言所没有的。
                    注:子类中所有的构造函数都会默认访问父类中的空参数的构造函数,默认第一行有super();若无空参数构造函数,子类中需指定;另外,子类构造函数中可自己用this指定自身的其他构造函数。
      3.多态性:同一个对象(事物),在不同时刻体现出来的不同状态。父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。
                    好处:提高了程序的扩展性、灵活性、简化性;
                    弊端:当父类引用指向子类对象时,虽提高了扩展性,但只能访问父类中具备的方法,不可访问子类中的方法;即访问的局限性。
                   前提:a:实现或继承关系;
                              b:方法重写(复写父类方法);
                              c:父类引用指向子类对象;
 
 

多态性详解

多态性可以分为两类:
    1.方法的重载与重写;
            a:重载:在同一个类中,方法名相同,参数列表不同,与返回值类型无关;
                    重载的分类:a.1:参数个数不同;
                                        a.2:参数类型不同;
            b:重写:子类集成父类后,覆盖父类中的某个方法的操作。
    2.对象的多态性:是从继承关系中的多个类而来
            a:向上转型:将子类实例转为父类实例,格式:父类  父类对象 = 子类实例;(自动转换)以基本数据类型操作为例:int i="a";(因为char的容量比int小,所以可以自动完成)
            b:向下转型:将父类实例转为子类实例,格式:子类  子类对象 = (子类)父类实例;(强制转换)以基本数据类型操作为例:char c = (char)97;因为整型是4个字节比char2个字节要大,所以需要强制完成。
 
多态中的成员访问特点:
    1.成员变量:
                    编译看左边,运行看左边。(Fu fu = new Zi(); fu.num调用的事父类Fu的num)
    2.构造方法:
                    创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。
    3.成员方法:
                    编译看左边,运行看右边。(存在方法重写,所以运行看右边)
    4.静态方法:
                    编译看左边,运行看左边。(静态和类相关,算不上重写,所以运行看左边)
 

多态性案例

package com.wy.test;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

import butterknife.ButterKnife;
import butterknife.InjectView;

/**
 * 多态性:同一个对象(事物),在不同时刻体现出来的不同状态。父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。
 * 好处:提高了程序的扩展性、灵活性、简化性;
 * 弊端:当父类引用指向子类对象时,虽提高了扩展性,但只能访问父类中具备的方法,不可访问子类中的方法;即访问的局限性。
 * 前提:a:实现或继承关系;
 *       b:方法重写(复写父类方法);
 *       c:父类引用指向子类对象;
 */
public class Button1Activity extends Activity {

    @InjectView(R.id.tv1)
    TextView tv1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_btn1);
        ButterKnife.inject(this);

        A a1 = new A();
        A a2 = new B();
        B b = new B();
        C c = new C();
        D d = new D();

        /**
         * 多态中的成员访问特点:
         * 1.成员变量:
         * 编译看左边,运行看左边。(Fu fu = new Zi(); fu.num调用的事父类Fu的num)
         * 2.构造方法:
         * 创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。
         * 3.成员方法:
         * 编译看左边,运行看右边。(存在方法重写,所以运行看右边)
         * 4.静态方法:
         * 编译看左边,运行看左边。(静态和类相关,算不上重写,所以运行看左边)
         */
        tv1.append("答案:" + "\n");
        tv1.append(a1.show(b) + "\n");      //①A and A
        tv1.append(a1.show(c) + "\n");      //②A and A
        tv1.append(a1.show(d) + "\n");      //③A and D
        tv1.append(a2.show(b) + "\n");      //④B and A  ...
        tv1.append(a2.show(c) + "\n");      //⑤B and A  ...
        tv1.append(a2.show(d) + "\n");      //⑥A and D
        tv1.append(b.show(b) + "\n");       //⑦B and B
        tv1.append(b.show(c) + "\n");       //⑧B and B
        tv1.append(b.show(d) + "\n");       //⑨A and D
    }
}

class A {
    public String show(D obj) {
        return ("A and D");
    }

    public String show(A obj) {
        return ("A and A");
    }
}

class B extends A {
    public String show(B obj) {
        return ("B and B");
    }

    public String show(A obj) {
        return ("B and A");
    }
}

class C extends B {
}

class D extends B {
}

---------------------------------------------------------------------------------------------------------------------------

早计划,早准备,早完成。 欢迎关注!交流!Star!

GitHub:https://github.com/wangyang0313

微信公众号:一个灵活的胖子MrWang

简书:https://www.jianshu.com/u/e5e733d79b96  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值