课程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. [ZJOJ] 5772【NOIP2008模拟】今天你AK了吗

    Description AK:All kill“你为什么没背书?”“没有为什么,我就是没背书.”“……我去年买了个表,G—U—N!”头铁王InFleaKing把背书的时间都拿去列排列了......n= ...

  2. Java 下实现Cache

    最近在做Spring的项目,想做一个缓存,访问数据库,定期来做数据更新 要实现两个功能 可以通过http请求来立刻刷新缓存 缓存可以通过自己配置的时间间隔来定期刷新 通过Controller来做 因为 ...

  3. hdu6096 String

    String Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others) Problem De ...

  4. [bzoj1007][HNOI2008]水平可见直线_单调栈

    水平可见直线 bzoj-1007 HNOI-2008 题目大意:给你n条直线,为你从上往下看能看见多少跳直线. 注释:能看见一条直线,当且仅当这条直线上存在一条长度>0的线段使得这条线段上方没有 ...

  5. 洛谷—— P2015 二叉苹果树

    https://www.luogu.org/problem/show?pid=2015 题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点 ...

  6. F2BPM中关于工作流引擎驳回设计

    1.1 关于驳回 驳回,在有的应用中叫“回退”.驳回是中国特色的一种方式,驳回在流程图上也没有迁移线的表达经常也是隐性的,比如申请经费可能由于资料不足被驳回来补充资料,像这样的例子有非常多,也很常见. ...

  7. mongodb之备份

    前言 数据库的备份非常重要 备份方式 使用Mongodb自带的运维管理工具(Ops Manager) 需要单独部署,比较麻烦和复杂 通过文件系统快照 Linux需要LVM支持需要开启journal日志 ...

  8. iOS:改变UITableViewCell的选中背景色

    要改变UITableViewCell选中时的背景色,需要在-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtInde ...

  9. 35岁,成就寥寥,为时已晚?(I am 35 and I haven't achieved much in life. Is it too late?)

    今天无意中看到Quora上的一个问题: I am 35 and I haven't achieved much in life. Is it too late? 下面的一个排第二的回复我蛮喜欢的,直接 ...

  10. MVC.Net5:添加Tinymce的图片上传功能

    Tinymce是目前几个主流的Web文本编辑器之一,不过它的图片上传功能是要收费的,而其它几个免费的上传图片的插件支持的都是PHP.那么就只能自己动手写一个了(源代码下载). 准备工作如下:1.   ...