课程3A-面向对象编程(上)

概述

  • 面向对象的思想在当今的软件开发中占据着主导地位。
  • Java是一门完全面向对象的语言,是一种天然的分布式互联网软件的开发语言,在当今企业级应用中占据绝对领先地位,也是开源世界的顶梁柱。
  • 课程3A的内容主要是介绍面向对象编程思想的一些基本概念。

Warm-Up:准备活动

  • 练习定义方法,调用方法。这个练习首先修改了MainActivity.java中的display()方法的名字,然后修复代码中的语法错误:修改之前所有对于display()方法的调用为当前的方法名。这个练习的目的主要是想让学生熟悉方法定义和调用的过程以及这两者之间的一一对应的关系。

    • 在 Android Studio 中打开方法声明的键盘快捷键为:Mac:command+b,Windows:control + b。

    • 定义一个方法的需要哪些部分?

      a) Access Modifier(Accessibility Specifier),访问控制修饰符。经常使用的是"private"与"public",当使用前者时,表明此方法是私有方法,只能在当前类的上下文(在这里,即为MainActivity)中被调用;当使用后者时,表明当前方法具有全局的可访问性,即在代码中的任何位置都可以调用。

      b) Return Data Type,返回值类型。这部分指定当前方法的返回值类型。

      c) Method Name,方法名称。与我们之前使用变量名来引用一个变量类似,我们也可以使用方法名(和传入参数)来调用定义好的方法。

      d) Matched Parentheses,匹配的圆括号。匹配的圆括号中的是实参列表(声明或定义方法时)与形参列表(调用方法时),调用方法时,必须要有匹配的圆括号,否则编译时会提示语法错误。

      e) Parameter List,参数列表,以逗号分隔,实参列表中的变量名可以在整个当前函数的范围内使用,出了该范围,这些变量都不可以再被引用。形参列表中的传入参数需要具有相同或者是相容的类型(以便编译器能够自动进行隐式类型转换),变量名不必与对应的实参变量相同。

      f) Matched Curly Braces,匹配的花括号,表示当前函数的范围。

      g) Method Signature,方法签名。方法签名由方法名、参数列表构成。Method Signature与方法重载的概念紧密相关:只有具有不同方法签名的方法能够同时存在于一个上下文中,仅仅只是返回值类型不同的方法不能够重载。

  • 使用方法的流程: 确定方法签名以及返回值类型,作为方法的声明 ----> 在成对的花括号代表的语句块中实现当前方法的逻辑 ----> 在需要的地方调用方法 ----> 如果需要利用被调方法的返回值,则对该返回值进行处理。

  • 进行了以上练习后,JustJava程序在手机上运行的效果如图1所示。

**图1.** JustJava:生成订单信息小结

Android项目的资源文件

  • 资源文件包括图片、音频、XML文件(布局和项目配置)、字符串文件等等。

  • 使用资源文件可以将程序的逻辑与程序具体展现形式分离开来。比如想要做APP的国际化时,就可以在各个语言各自的字符串文件之间切换, 非常方便;想要适应高清屏幕时,只需加载同一资源(图像、视频)的更高清版本。

  • 另一方面,Java代码负责程序逻辑的实现,与资源文件之间是松耦合的关系,提升了代码及资源文件的复用性。如果把资源都硬编码在代码中,整个项目会显得比较混乱,不利于缩短开发周期,也不利于项目的维护和迭代。

  • 在使用Java来开发Android项目时,会生成一个R.java文件,其中对res资源文件中的资源进行了编号,方便在Java代码中访问这些资源。对于string字符串类型的资源,访问的语法为R.string.* (“*”即为对应的资源文件名);对于layout布局类型的资源,访问的语法为R.layout.*。

  • 在Java文件与xml文件中都可以访问资源文件,具体方式如图2所示。

**图2.** 访问Android项目资源文件

对象、类、继承

  • 当在onCreate()方法中调用setContentView()方法时,
setContentView(R.layout.activity_main);

我们通过R这个对当前所有的项目资源的抽象的类来访问布局资源activity_main.xml,Android程序执行到这一语句时会解析此xml文件,分析各个Views之间的层级关系并据此生成对应的Java对象。

  • Java对象:可以拥有成员(变量或方法),其整体是对State的封装,外界(凡是无法直接访问此对象内部的,对于该对象而言都可称为“外界”)可以使用此对象提供的一些方法(比如说,setter方法与getter方法)来修改其成员变量,从而改变此对象的状态。外界可能根据对象状态的改变进而采取不同的操作,实现期望的逻辑。

  • Java类

  1. member variable == field == state,成员变量、域、状态等术语在当前语境(Java Class)下的含义相同。
  2. 成员变量的命名规范(naming conventions):成员变量的名字以"m"或者"m_"作为前缀。
  3. 与之前说过的定义变量类似,定义一个Java Class时,也需要指定(不指定的话,我记得访问控制默认是protected级别的)当前类的访问控制修饰符(Acess Modifier)。
  4. Constructor,构造函数。构造函数是为了实例化(instantiate)Java类为一个实际存在于内存中的对象,构造函数与普通函数类似,也有参数列表;定义构造函数与定义普通函数的过程类似,但不需要指定返回值类型,其语法格式为“类名 + 参数列表 + 实现类实例化的代码块”。
  5. 如果一个类的定义中没有显式地指定任何构造函数,那么实例化该类时对调用默认构造函数。 需要注意区别无参构造函数默认(default,缺省的)构造函数:当一个类的定义中显式地定义了一个不接受任何参数的构造函数时,那么在不传入参数地实例化这个类时,调用的就是无参构造函数,而不是默认(缺省)构造函数。
  6. Factory Method,工厂方法。除了使用构造函数来创建对象,我们也可以使用工厂方法。更详细地来讲,工厂方法是一种对象创建型的设计模式,其意图在于定义一个用于创建对象的接口,让子类决定实例化哪一个类;效果就是一个类的实例化被延迟到其子类。

      6.1 Factory Method的适用范围: 当一个类不知道它所必须创建的对象的类的时候;当一个类希望由它的子类来指定它所创建的对象的时候;当类将创建对象的职责委托给多个Helper子类中的某一个,且你希望将哪一个Helper子类是代理者这一信息局部化的时候。 如下的代码即应用Factory Method把Toast类的实例化延迟了:等待有具体文本信息的时候再实例化出Toast对象。
Toast toast = Toast.makeText(context, text, duration);
  1. 注意,在一个class内部与外调用方法的区别: a)class之外无法访问private方法;b)语法上的区别。类中调用方法可以不指定当前对象(this),而在类外调用则必须指定。如图3所示。

**图3.** 在类的内部与外部调用类方法的区别

  1. Object Method,对象方法。 通过调用对象方法(object method)在Java代码中改变Views的属性,使得我们可以运行时根据用户的交互,动态地改变Views的外观。这对于交互式的APP来说十分重要。

  2. Inheritance,继承。当一个类A继承另一个类B时,默认地,A就会拥有B的所有public方法与成员(无法继承private的方法与成员变量)。子类可以复用继承而来的方法、变量,也可以重写(override)父类的方法。 通过继承,可以实现多态性,使得程序设计更加灵活、强大。继承是OOP(Object Oriented Programming,面向对象编程)中非常重要的一环;用类图可以展现整个软件系统的继承层次关系,现代软件项目的设计基本上没有脱离了类图的。

  3. Casting,转型。 方法findViewById()返回的对象类型是View;但如果传入的id是一个View的子类的id,为了正确使用该方法的返回值,我们需要进行转型,将findViewById()的返回值转型成为该id对应的实际的对象类型(可以通过查看xml源文件来得到该信息)。关于Java中转型的更多知识,可以参考 ORACLE官方文档_Inheritance (请参阅“Casting Objects”部分)。

3A课程笔记分享_StudyJams_2017的更多相关文章

  1. 1C课程笔记分享_StudyJams_2017

    课程1C 概述 课程1C是创建一个生日贺卡应用的实践课程,所以本篇笔记分享主要记录个人的实践过程,此外分享一些比较零散的知识点. Drawable文件夹 Drawable文件夹是Android项目统一 ...

  2. 1A课程笔记分享_StudyJams_2017

    1A课程 概述 课程1A主要讲解了Android UI的三种基本控件:TextView.ImageView以及Button.笔记的主体内容主要根据课程内容的讲解顺序来组织,此外我对一些个人比较感兴趣的 ...

  3. 1B课程笔记分享_StudyJams_2017

    课程1B 概述 课程1B主要讲解了Android UI的ViewGroups(视图组).LinearLayout(线性布局).RelativeLayout(相对布局),Portrait Mode(竖屏 ...

  4. 2C课程笔记分享_StudyJams_2017

    课程2C-实践:创建交互式应用 概述 课程2C的内容主要是练习巩固2A.2B中讲解的内容,并设计实现一款篮球比赛的计分板应用及其界面的美化. Warm-Up:准备活动 新建项目PracticeSet2 ...

  5. 2B课程笔记分享_StudyJams_2017

    课程2B-创建交互式应用(下) 概述 课程2B的内容主要包括:使用变量来更新欲显示在屏幕上的内容,为按钮添加事件响应(联系XML属性与Java方法)逻辑等. 后续的课程会逐步深入地讲解使用Java开发 ...

  6. 2A课程笔记分享_StudyJams_2017

    课程2A 概述 课程2A.2B的内容主要是关于创建交互式应用的基础知识.之前的L1课程主要是Android UI的基础设计知识,基本上没涉及到编程. 2A的讲解主要包括:使用变量来更新欲显示在屏幕上的 ...

  7. 3B课程笔记分享_StudyJams_2017

    昨晚才发现 Study Jams China的官方论坛也支持MarkDown,所以直接发在了那上面.http://www.studyjamscn.com/thread-21807-1-1.html

  8. L4课程_Firebase_笔记分享_StudyJams_2017

    最近才发现Study Jams China的官方论坛也支持MarkDown,所以就直接把笔记发在了那儿. http://www.studyjamscn.com/thread-21855-1-1.htm ...

  9. vue—你必须知道的 js数据类型 前端学习 CSS 居中 事件委托和this 让js调试更简单—console AMD && CMD 模式识别课程笔记(一) web攻击 web安全之XSS JSONP && CORS css 定位 react小结

    vue—你必须知道的   目录 更多总结 猛戳这里 属性与方法 语法 计算属性 特殊属性 vue 样式绑定 vue事件处理器 表单控件绑定 父子组件通信 过渡效果 vue经验总结 javascript ...

随机推荐

  1. 使用官方组件下载图片,保存到MySQL数据库,保存到MongoDB数据库

    需要学习的地方,使用官方组件下载图片的用法,保存item到MySQL数据库 需要提前创建好MySQL数据库,根据item.py文件中的字段信息创建相应的数据表 1.items.py文件 from sc ...

  2. 使用redis和简单token机制校验身份的思路

    1. 登录时生成token, 以token为键,以用户信息为值,存储在redis中,设置key过期时间 2. 需要身份验证的接口,带上token 3. 接口校验redis中token是否存在 4. 存 ...

  3. 35.分组聚合操作—bucket+metric

    主要知识点: bucket+metric 计算分种颜色的电视的平均价格     语法: GET /tvs/sales/_search { "size" : 0, "agg ...

  4. 21.使用rescoring机制优化近似匹配搜索性能

        一.match和phrase match(proximity match)区别   1.match:只要简单的匹配到了一个term,就会将term对应的doc作为 结果返回. 2.phrase ...

  5. 【郑轻邀请赛 H】 维克兹的进制转换

    [题目链接]:https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=2134 [题意] [题解] 设f[i]表示数字i分解为二进制数的方案数; 则 如果i为 ...

  6. Codeforces Round #412 (Div. 2)ABCD

    tourist的剧毒contest,题干长到让人不想做... A.看不太懂题意直接看下面input output note n组里有两数不一样的一组就rated 否则单调不增为maybe,否则unra ...

  7. Maven学习总结(4)——Maven核心概念

    Maven学习总结(四)--Maven核心概念 一.Maven坐标 1.1.什么是坐标? 在平面几何中坐标(x,y)可以标识平面中唯一的一点. 1.2.Maven坐标主要组成 groupId:组织标识 ...

  8. C++ 数据结构模板 队列 栈 动态链表 模板 Queue Stack List

    C++数据结构模板,可以实现基本功能,用法和stl差不多,比如Q.pop();Q.push(a);Q.front();...... (由于动态链表用的不多,若有错误望各位大神不吝赐教:) 队列: cl ...

  9. Flume基本概念

    1         Apache Flume 1.1         概述 Flume是Cloudera提供的一个高可用,高可靠的,分布式的海量日志采集.聚合和传输的软件. Flume的核心是把数据从 ...

  10. Openfire:通过Servlet群发消息

    在Openfire中自带有Broadcase插件,可以让我们群发消息给全部用户或者组.不过如果是我们通过Servlet来实现这一功能,那么是能够增加一定的灵活性的.具体做法直接看Demo代码: pub ...