Android程序开发基础
目录
第1章 编程语言与Java基础知识 4
1.1 编程语言基础知识 4
1.2 JAVA的相关介绍 4
1.3 开发环境的安装 4
第2章 编程语言与Java基础知识 5
2.1 如何构建应用程序 5
2.2 构建java应用程序 5
2.3 java程序结构与基本输出 6
2.3.1类的定义 6
2.3.2两种输出语法的区别和相关注释 6
第3章 变量、数据类型与运算符 6
3.1 变量与数据类型基础 6
3.2 变量的命名与声明 6
3.3 java的数据类型 7
3.4 java的表达式 7
第4章 流程控制结构 8
4.1 流程控制 8
4.2 条件控制语句 8
4.3 循环控制语句 8
第5章 类方法 9
5.1 过程与函数基础 9
5.2 类方法 9
5.3 类变量和变量作用域 10
5.4 递归程序设计 10
5.5 Math类及其类方法 11
第6章 数组与字符串 11
6.1 数组基础 11
6.2 一维数组与多维数组 11
6.3 字符串类 11
第7章 类与对象 12
7.1 了解面向对象的概念 12
7.2 类与对象 12
7.3 类的构造方法 13
7.4 关键字的使用 14
7.4.1 this关键字 14
7.4.2 static关键字 14
7.4.3静态final变量 14
7.5 主方法 14
第8章 继承、抽象类与接口 15
8.1 类的层次结构 15
8.2 掌握类的继承 15
8.3 抽象类 16
8.4 接口 17
8.5 接口的继承 17
8.6 抽象类于接口的差异 18
8.7 常量类 18
第9章 嵌套类、多态与包 19
9.1 嵌套类(内部类) 19
9.2 匿名嵌套(内部)部类 19
9.3 多态基础 19
9.4 多态的实现 20
9.5 包的定义 20
第10章 Android与XML基础 21
10.1 XML基础 21
10.2 Android移动操作系统 22
10.3 Android应用程序的组成组件 22
10.4 Android开发环境 23
第11章 布局与使用界面控件 23
11.1 布局的创建 23
11.2 控件介绍 24
11.3 布局 24
第12章 活动与事件处理 24
12.1 活动类 24
12.2 活动的生命周期 25
12.3 Android的事件处理 26
第13章 意图Intent 27
13.1 Intent 简介 27
13.2 Intent 的组成(属性) 27
13.3 Intent属性的设置 27
13.4 显式和隐式的Intent 28
13.5 Intent解析 28
13.6 传递数据 28
第1章 编程语言与Java基础知识
1.1 编程语言基础知识
编程语言是人与计算机交流的语言。编程语言提供了语法,可以让我们编写程序代码来建立程序,程序经编译建立成应用程序,就可以归类成不同软件。
按照与程序编写者的亲和度来区分,编程语言可分为偏向计算机的低级语言和编写者容易了解的高级语言,低级语言是计算机看得懂的语言,执行效率高,但用户不易学习。高级语言是适合用户学习,但编写的代码冗长,需要进一步转换成机器语言,效率较低。
总的来说程序是使用指定编程语言编写的特殊符号的组合,软件是在计算机执行的应用程序或者操作系统的泛称,应用程序处理指定工作的计算机程序。
1.2 JAVA的相关介绍
1991年的GREEN项目;使用email去控制各个家电产品的运行使用C++开发出了一个新的平台—— OAK(橡树)平台;Java的主要设计师James Gosling。
Java是一种面向对象的高级语言。并且具有分布式、多线程、垃圾回收、异常处理的特点。Java的开发环境有:终端机模式(或命令行模式)环境变量的设置需要以“;”隔开。集成开发环境(IDE)Eclipse的安装是直接解压。相关简称有IDE:集成开发环境,JVM:Java虚拟机,由软件虚拟出来的一个计算机,解释.class结尾的字节码文件,JDK:Java开发工具包,包含开发工具和编译器,JRE:(Java Runtime Environment)Java运行环境,包括Java虚拟机、Java核心类库和支持文件。它不包含开发工具—编译器、调试器、和其他工具
目前java存在三个版本:Java SE(Java Platform Standard Edition)标准版,是为开发普通桌面和商务应用程序提供的解决方案。Java EE(Java Platform Enterprise Edition) 企业版,是为开发企业级应用程序提供的解决方案。Java ME(Java Platform Micro Edition) 小型版,是为开发电子消费产品和嵌入式设备提供的解决方案。
1.3 开发环境的安装
基于adt-bundle-windows-x86的android开发环境搭建
1、安装JDK
2、下载android SDK工具包adt-bundle-windows-x86,http://developer.android.com/sdk/index.html 大概400M,里面包含eclipse和SDK,eclipse它已经集成好了ADT。
3、配置环境变量
4、测试环境变量 cmd 输入java或javac
5、安装Eclipse开发工具:Eclipse是针对Java编程的集成开发环境(IDE),读者可以登录Eclipse官网http://www.eclipse.org免费下载。Eclipse安装时只需将下载好的ZIP包解压保存到指定目录下(例如D:\eclipse)就可以使用了。
第2章 编程语言与Java基础知识
2.1 如何构建应用程序
需求:为了了解问题本身,以便确切获得程序需要输入的数据和预期应产生的结果,简单来说就是希望程序干什么。例如,要计算从1加到100的总和……。
设计:了解程序设计的需求后,我们就可以开始找寻解决问题的方法和策略。简单来说,设计实际是在找出解决问题的步骤
分析:在第2步设计时,解决问题(或解决需求)的方法一般不止一种,即算法不止一种, 那我们就分辨最好的算法,以提高程序的效率
编写程序代码:这一步就要选择使用程序语言来编写代码了,这里我们选择的是java语言,另外就是不同的程序语句可以达到同样的目的,所以还要选择合适的语句。例如,不同的循环语句。
验证:程序完成以后就要执行,执行结果是否符合预期呢?这个时候就需要验证。可以分成3个子阶段:证明、测试和调试。
程序设计中的第2步——设计,就是算法:用于完成目标工作且步骤有限的一组命令。除此之外,算法还必须满足一些条件,如下所示:输入、输出、明确性、有限性、有效性。算法一定要会结束,不能陷入无限循环
2.2 构建java应用程序
我们有两种环境来开发java应用程序:命令提示符和Eclipse IDE。命令提示符中构建、编译和执行java应用程序的步骤:
1、使用记事本或其他文本编辑工具构建源代码,扩展名为.java(保存时编码选ANSI)
2、 使用文件名为javac.exe的java编译器,将java源文件编译成java字节码类文件,扩展名为.class。
3、使用JVM解释器java.exe执行类文件,也就是执行java程序。
使用Eclipse IDE构建第java程序时
第一步:打开或构建工作空间
第二步:新建java项目
第三步:创建java类文件
第四步:编写java程序代码
第五步:编译和执行java程序
2.3 java程序结构与基本输出
java与C/C++等不同,它是一门真正的面向对象程序语言,其程序架构是一个“类”(Class)定义。java类文件。java程序文件是扩展名为.java的纯文本档,内含同名java类定义。
2.3.1类的定义
类是Java中的基本组成元素,而所有的java程序一定要被类所管理,那么定义类的简单格式如下:[public] class 类名称 {} 发现在类前面可以有选择性的来决定是否需要编写public,所以对于类的定义现在就有了两种形式:public class定义:类名称必须和文件名称保持一致,否则程序将无法编译,在一个*.java之中只能有一个public class;class定义:类名称可以和文件名称不一致,但是生成的是class定义的名称,在一个*.java程序之中可以同时存在多个class的定义,编译之后会分为不同的*.class文件;
2.3.2两种输出语法的区别和相关注释
System.out.println (“我的第一个Java程序”);
System.out.print (“我的第一个Java程序”);
区别为:println输出之后换行,print输出之后不换行。
// 注释:单行注释;/* … /:多行注释;/* … */:文档注释。
第3章 变量、数据类型与运算符
3.1 变量与数据类型基础
变量相当于一个盒子,里面暂存程序执行时的数据。计算机程序都是由“数据”和“指令”两部分组成。数据部分就是变量和数据类型,指令部分包括运算符、第4章的流程控制和第5章的过程。
3.2 变量的命名与声明
java的命名:java程序中有一些关键字或称保留字,是一些对于编译程序而言,拥有特殊意义的名称,除了这些,大家可以自定义元素名称,称为标示符,例如,变量、过程、函数和对象名称等。
java的命名语法
1、标识符的命名规则
要合法,使用英文字母、下划线””或” ” 开 头 , 包 括 字 母 、 数 字 、 下 划 线 ” ” 和 ” ”开头,包括字母、数字、下划线”_”和” ”开头,包括字母、数字、下划线””和””。(“$”有特殊意义,不要去使用)最长为255个字符,且严格区分大小写。命名尽量有意义,不能使用关键字。名称在作用域中必须唯一。
2、惯用的命名法
为保持程序代码的可读性和一致性,java标示符可以使用一些惯用的命名原则。
例如CamelCasing,第一个英文字母大写其余为小写,还可以使用一些组合。
常量的命名要使用全大写字母或大写字母和下划线“”的组合。例:MAX_SIZE
3.3 java的数据类型
java语言是一种“强类型”程序语言,对变量需要指定数据类型。数据类型的目的是告诉编译程序声明的变量准备保存什么样的数据,而且不论如何访问变量值,都不能改变变量的数据类型。
同样还有“弱类型”(不需要事先声明就可以直接使用,例如:JavaScript和VBScript等)
java语言数据类型:基本:前面介绍的8种基本型。引用:此类型的变量值是内存地址,即对象保存的地址。
3.4 java的表达式
JAVA运算符:算术运算符 关系运算符 逻辑(条件)运算符 位运算符
两种数据类型的转换:
宽化类型转换时转换为精度和范围比较大的数据类型
窄化类型转换时转换为精度和范围比较小的数据类型
第4章 流程控制结构
4.1 流程控制
流程控制依据程序代码执行的顺序可以分为3种:顺序结构、选择结构和循环结构。
1、顺序结构:程序默认执行方式,
2、选择结构:就是条件控制语句,它是一个选择题,分为单一选择、二选一或多选一三种。程序根据条件表达式的结果,来决定执行哪个程序块的程序代码。
3、循环结构:就是迭代重复的过程,通过一个结束条件来结束循环的执行,依据结束条件测试的位置可以分为两种:前测试型循环和后测试型循环。
4.2 条件控制语句
if语法: if…else语法: if…else语法:
if (布尔表达式) {
条件满足时执行的程序 ;
} if (布尔表达式) {
条件满足时执行的程序 ;
} else {
条件不满足时执行的程序 ;
} if (布尔表达式1) {
条件满足时执行的程序 ;
} else if (布尔表达式2) {
条件满足时执行的程序 ;
} … else {
所有条件都不满足时执行的程序 ;}
对于多条件判断使用if…else if…else是可以判断布尔条件的,如果是多数值判断,可以通过switch完成.
4.3 循环控制语句
while循环: do while循环: for循环
while (循环判断) {
循环语句 ;
修改循环结束条件 ;
} do {
循环语句 ;
修改循环结束条件 ;
} while (循环判断) ; for (循环初始化条件;循环判断;循环条件变更)
{
循环语句 ;
}
第5章 类方法
5.1 过程与函数基础
过程是一个拥有特定功能的独立单元,使我们可以重复使用之前已经建立的过程,而不用每次都重复编写代码去实现相同功能。
一般来说,程序语言会将独立程序单元分为过程和函数两种,区别在于:过程没有返回值,函数有返回值,程序中执行过程称为过程调用。过程如一个黑盒子,我们不需要知道盒子中是什么,接口是过程和外部沟通的管道。参数决定了过程应该怎样被调用。
5.2 类方法
java语言的过程是一种类的成员,称为方法,简单的说,在java语言编写的过程或函数称为方法
java方法分为属于类的类方法和对象的实例方法
创建类方法:访问限定符 static 返回值类型 方法名称(参数行) {…}
调用类方法:java要调用类方法使用类和方法名称即可:方法名称(参数行);类名称.方法名称(参数行);
类方法的执行过程
类方法的参数传递,Java方法的参数行是信息传递的机制,可以让我们从外面将信息送入方法的黑盒子,换句话说,参数行就是方法的使用接口。如果方法拥有参数行,在调用方法时,即可传入不同参数来产生不同的执行结果.
方法重载指的是方法名称相同,参数的类型或个数不同,调用的时候将会按照传递的参数类型和个数完成不同的方法体的执行。如果说现在有一个方法名称,有可能要执行多项操作,例如:一个add()方法,它可能执行两个整数的相加,也可能执行三个整数的相加,或者可能执行两个小数的相加,那么在这样的情况,很明显,一个方法体肯定无法满足于要求,需要为add()方法定义多个不同的功能实现,所以此时就需要方法重载概念的支持。
类方法的返回值如果Java方法的返回值类型不是void,而是其他数据类型如int或char等,就称这种拥有返回值的类方法为函数。Java方法中使用return关键字来返回一个值。返回值的类型需要与方法声明的返回值类型相同
5.3 类变量和变量作用域
在java中没有全局变量的概念,但是可以通过static关键字来修饰变量,使之成为类属变量,成为类变量,可以视为其他程序语言的“全局变量”。
与全局变量对应的是,在方法内程序块声明的变量,称为“局部变量”。
Java的类变量, 在Java中,变量声明以后,如果就算没有赋初值,也会拥有默认初值,
数值类型为0 boolean类型为false,
char类型为Unicode的0, 如果是对象,其默认值为null。
Java变量分为:类的成员变量 方法参数 局部变量
局部变量作用域:在方法内声明的变量即局部变量,只能在声明后的程序代码使用(不包括声明前),在方法外的程序代码并无法访问此变量。
方法参数作用域:传入方法的参数变量作用域是整个方法的程序块,同样在方法外的程序代码无法访问。
成员变量作用域:作用域在整个类,不论是由static修饰的类变量或是没有声明static,整个类的程序代码都可以访问。
5.4 递归程序设计
递归函数在Java称为递归方法,可以让程序代码变得很简洁,但是设计递归方法需要很小心,不然容易掉入无穷的方法调用的陷阱。
递归方法概述:递归是自上而下分析方法的一种特殊的情况,使用递归观念建立的方法称为递归方法,其基本定义如下所示:一个问题的内涵是由本身所定义的话,称之为递归。递归的子问题和原来的问题拥有相同的特性,只是范围改变,逐渐缩小的终止条件:递归方法需要拥有终止条件,以便结束递归方法的执
5.5 Math类及其类方法
javaAPI的Math类提供许多数学常量和各种处理数学函数的类方法,可以让我们使用三角函数等数学函数
第6章 数组与字符串
6.1 数组基础
数组(Array)是程序语言的一种基本数据结构,它是一种有序组织的数据结构,Java数组就是Array对象,属于引用类型。因此,Java数组变量值并不是数组本身,而是指向数组真正地址的引用。
6.2 一维数组与多维数组
java支持一维与多维数组,一维数组就是一条线,二维数组是平面,三维数组是立体空间。
一维数组,只拥有一个索引,用来表示一行中数值的位置。
声明并开辟数组:
数据类型 数组名称 [] = new 数据类型 [长度] ;
数据类型 [] 数组名称 = new 数据类型 [长度] ;
分步完成:
声明数组:数据类型 数组名称 [] = null ;
开辟数组:数组名称 = new 数据类型 [长度] ;
一维数组一般进行为:数组静态初始化,创建Array对象,访问数组元素,可以使用for循环访问一维数组,也可以使用foreach循环访问一维数组
二位数组:
动态初始化:数据类型 数组名称[][] = new 数据类型[行的个数][列的个数];
静态初始化:数据类型 数组名称[][] = new 数据类型[][] {{值,值,值},{值,值,值}}
声明二维数组,创建二维数组,访问二维数组,
6.3 字符串类
Java字符串是一个String对象,声明方法和其他数据类型一样。
Java字符串是一种引用数据类型
一旦创建字符串后,就无法改变其值,我们只能重新赋以新的字符串字面值或声明另一个字符串变量:
String str=“java程序设计”;
str=“ASP.NET网页设计”;
str类似一个指针,仅仅是改变了指向不同字符串的地址,并不是改变原来字符串内容,String字符串是一种只读字符
字符串处理:java可以直接使用字符串字面值来创建字符串对象
字符串的处理同样可以进行:字符串的比较、字符串长度和大小写转换、子字符串与字符查找、子字符串与字符处理、
第7章 类与对象
7.1 了解面向对象的概念
面向过程
1.概念:面向过程是一种以过程为中心的编程思想,它是一种基础的顺序的思维方式,在分析解决问题时强调按步骤一步一步实现。
2.特性 :模块化、流程化
3.优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
4.缺点:没有面向对象易维护、易复用、易扩展
面向对象
1.概念:面向对象是按人们认识客观世界的系统思维方式,采用基于对象(实体)的概念建立模型,模拟客观世界分析、设计、实现软件的办法。强调把构成问题的事务分解成各个对象,描叙各个对象在整个解决问题的步骤中的行为。
2.特性:封装、继承、多态
3.优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护。
4.缺点:性能比面向过程低。
7.2 类与对象
首先定义一个类,
格式一:声明并实例化对象
类名称 对象名称 = new 类名称 () ;
格式二:分步完成
声明对象:类名称 对象名称 = null ;
实例化对象:对象名称 = new 类名称 () ;
操作类结构:
对象.属性:表示要操作类中的属性内容;
对象.方法():表示要调用类中的方法。
在类中进行对象内存分配,分步实例化对象
信息隐藏 现在Student类的成员变量拥有完整的访问接口,所以成员变量的名称与类型是什么已经不重要!因为数据本身已经被类完整的封装隐藏起来。我们只需要知道类访问器方法的使用接口,就可以处理类的成员变量,这就是“信息隐藏”。
成员方法的使用:Java类的成员方法声明成public,表示该方法是对象的使用接口,但是有一些方法,只准备提供类本身使用,所以声明成private即可,这种方法称为“工具方法”。
7.3 类的构造方法
类的构造方法:基本数据类型的变量声明时就会分配内存,并且可以设置初始值,如果想要类声明时也能够如此,就需要构造方法。构造方法是对象的初始化方法。如果要实例化新的对象,那么肯定需要使用关键字new来完成,但是除了new这个关键字之外,还有可能在对象实例化时为其进行一些初始化的准备操作,这个时候就需要构造方法的支持了,构造方法本身是一种特殊的方法,它只会在新对象实例化的时候调用。
1、对象声明周期
从使用new创建对象到对象不再使用的时间。 JAVA语言提供垃圾自动回收功能来处理不再使用的对象。
2、类的构造方法
几个特点如下: 构造方法与类同名。 构造方法没有返回值,也不用加上void。 构造方法支持方法的重载。
构造方法不需要有返回值,甚至不需要有void类型的返回值。
如果类没有包含构造方法,Java编译器会给类添加一个无参数构造方法,这个添加是隐式的,也就是说,这些隐式添加的代码不会在源文件中显示出来。如果类定义中有一个构造方法,不管它接受多少个参数,编译器都不会再给类添加构造方法了。
方法的重载:构造方法本身也属于方法行列,那么可以针对于构造方法进行重载,但是构造方法由于其定义的特殊性,所以在构造方法重载时,要求只注意参数的类型及个数即可。
匿名对象:如果一个对象没有则称为匿名对象,按照之前的内存关系来讲:对象的名字可以解释为在栈内存中保存,而对象的具体内容(属性)在堆内存之中保存,这样一来,没有栈内存指向堆内存空间,就是一个匿名对象
7.4 关键字的使用
7.4.1 this关键字
this关键字可以引用对象本身,当成员变量与方法参数同名时,使用this来指明是成员变量,当成员方法返回值是this时,就死返回对象本身。在Java中this可以完成三件事情:表示本类属性、表示本类方法、当前对象(只是先介绍概念)
此时的this可以条用本类属性,在一个类之中,可以使用this调用两种方法(普通方法、构造方法),而在要调用本类方法也就分为两种形式:调用本类普通方法:在之前强调过,如果现在要调用的是本类方法,则可以使用“this.方法()”调用;调用本类构造方法:在一个构造中要调用其他构造使用“this()”调用。
在使用this调用构造方法时,存在两个重要的限制:使用“this()”调用构造方法形式的代码只能够放在构造方法的首行;进行构造方法互相调用时,一定要保留调用的出口
this关键字在应用的过程之中有一个最为重要的概念 —— 当前对象,而所谓的当前对象指的就是当前正在调用类中方法的实例化对象。
7.4.2 static关键字
在一个类之中,主要的组成就是属性和方法(分为构造方法与普通方法两种),而每一个对象都分别拥有各自的属性内容(不同对象的属性保存在不同的堆内存之中),如果现在类中的某个属性希望定义为公共属性(所有对象都可以使用的属性)则可以在声明属性前加上static关键字。
在定义类的普通方法时也可以使用static进行定义,那么很明显,使用static定义的方法也可以在没有实例化对象产生的情况下由类名称直接进行调用。
7.4.3静态final变量
在Java之中final称为终结器,在Java里面可以使用final定义类、方法、属性。
如果定义属性:
1.属性名字要全部大写,且单词之间用下划线“—”隔开。
2.若定义为静态final变量,则static和final的位置是可以互换的。
3.若定义为静态final引用变量,意味着,一旦给它分配了一个实例地址,就不能把相同类型的另一个变量赋值给它。但引用对象自身之中的字段是可以修改的。
7.5 主方法
Java语言最大的特点可能就在于主方法上了,因为在Java中的主方法的组成单元许多,下面来观察一下每一个组成单元的含义:
public:主方法是程序的开始,所以这个方法对任何的操作都一定是可见的,那么既然是可见的就必须使用public(公共)。
static:证明此方法是由类名称调用的;
void:主方法是一切的执行的开始点,既然是所有的开头,那么就不能够回头,执行完毕为止;
main:是一个系统规定好的方法名称,不能够修改;
String args[]:指的程序运行的时候传递的参数,格式为:“java 类名称 参数 参数 参数”;
第8章 继承、抽象类与接口
8.1 类的层次结构
继承是面向对象程序设计的一个重要概念,是指声明类可继承现存类的部分或全部的成员变量和方法,并且新增额外的成员变量和方法或重写和隐藏继承类的方法或变量。
类层次结构
从UML图中观察继承的层次结构。所有Java类都继承自Object类,Object是在java.lang包定义的祖宗类,即Java程序代码声明的类都是Object类的子类。
继承是面向对象的第二大主要特性,而继承性要解决的就是代码重用的问题,利用继承性可以从已有的类继续派生出新的子类,也可以利用子类扩展出更多的操作功能。
8.2 掌握类的继承
继承性严格来讲就是指扩充一个类已有的功能。在Java之中,如果要实现继承的关系,可以使用如下的语法完成。
class 子类 extends 父类 {}
对于以上格式有以下几点说明:对于extends而言,应该翻译为扩充,但是为了理解方便,统一称为继承;子类又被称为派生类;父类又被称为超类(Super Class)。
子类对于父类的功能进行了扩充(扩充了一个属性和两个方法,如图所示)。但是思考一下:子类从外表看是扩充了父类的功能,但是对于以上的代码,子类还有一个特点:子类实际上是将父类定义的更加的具体化的一种手段。父类表示的范围大,而子类表示的范围小。
继承访问限制:
子类可以继承父类的所有成员变量和方法,但是在访问时仍有一些限制:
子类不能访问父类中声明成private的成员变量和方法。
父类的构造函数不属于类的成员,所有子类不能继承父类的构造函数,只能调用父类的构造函数。
限制一:Java不允许多重继承,但是允许多层继承
限制二:子类在继承父类的时候严格来讲会继承父类中的全部操作,但是对于所有的私有操作属于隐式继承,而所有的非私有操作属于显式继承。
限制三:在子类对象构造之前一定会默认调用父类的构造(默认使用无参构造),以保证父类的对象先实例化,而后再实例化子类对象。
覆写:继承性的主要特征是子类可以根据父类已有的功能进行功能的扩展,但是在子类定义属性或方法的时候有可能出现定义的属性或方法与父类同名的情况,这样的操作就称为覆写。
方法的覆写:当子类定义了和父类在方法名称、返回值类型、参数类型及个数完全相同的方法的时候,称为方法的覆写。
在覆写的过程之中,还必须考虑到权限问题,即:被子类所覆写的方法不能够拥有比父类更严格的访问控制权限。
对于访问控制权限实际上已经讲解过四种了,这四种权限由宽到严的顺序是:public>protected > default(默认,什么都不写) > private,也就是说private的访问权限是最严格的(只能够被一个类中所访问)。即:如果父类的方法使用的是public声明,那么子类覆写此方法的时候只能是public,如果父类的方法是default(默认)的话,那么子
使用父类的构造函数
Java子类不能继承父类的构造函数,只能使用super关键字调用父类的构造函数;同理,杯子类重写的方法和隐藏的成员变量,也都可以使用super关键字来调用和访问。
8.3 抽象类
“抽象类”是使用abstract修饰的类,抽象类是特殊的类,它不能生成对象,只能被继承用来声明子类。
在抽象类声明中,也可以使用abstract声明方法为抽象方法,表示方法只有原型声明,实现代码在子类建立,而且继承的类一定要实现抽象方法
普通类可以直接产生实例化对象,并且在普通类之中可以包含有构造方法、普通方法、static方法、常量、变量的内容。而所谓的抽象类就是指在普通类的结构里面增加抽象方法的组成部分,抽象方法指的是没有方法体的方法,同时抽象方法还必须使用abstract关键字进行定义。拥有抽象方法的类一定属于抽象类,抽象类要使用abstract声明。
抽象类必须有子类,即:每一个抽象类一定要被子类所继承(使用extends关键字),但是在Java中每一个子类只能够继承一个抽象类,所以具备有单继承局限;
抽象类的子类(子类不是抽象类)必须覆写抽象类之中的全部抽象方法(强制子类覆写);
依靠对象的向上转型概念,可以通过抽象类的子类完成抽象类的实例化对象操作。
抽象类里面由于会存在一些属性,那么在抽象类之中一定会存在构造方法,目的:为属性初始化,并且子类对象实例化的时候依然满足于先执行父类构造,再调用子类构造的情况。
抽象类不能够使用final定义:因为抽象类必须有子类,而final定义的类不能够有子类;
抽象类中可以没有任何抽象方法,但是只要是抽象类,那么依然不能够直接使用关键字new实例化对象。
抽象类中,如果定义有static属性或方法的时候,都可以在没有对象的时候直接调用。
8.3.1抽象类的建立
声明抽象类:抽象类是创建子类的原型,抽象方法类似于接口方法,如果类拥有抽象方法(也可以同时拥有一般方法),就表示此类一定是抽象类
抽象类声明的对象变量:抽象类不能建立对象,但是可以用来作为数据类型,声明引用子类对象的对象变量
8.4 接口
Java语言不支持多重继承,不过提供了接口,可以建立单一对象多态和提供多重继承的功能。
接口简介:接口为类和对象提供了操作规范,就算类之间没有任何关系,一样可以拥有共同的接口。
如同网络协议在不同计算机网络系统之间搭建沟通管道——不管Windows或Unix操作系统的计算机,只要是有TCP/IP协议就可以建立联机,接口也定义了不同类之间的一致行为,也就是一些共同的方法。
创建和使用接口
Java接口和类一样都是引用数据类型,接口可以定义类行为,内含常量和方法的声明,但是没有实现的程序代码,当实现接口时,类需要实现“所有”的接口方法。
1、接口的声明:
Java接口可以声明常量和方法,声明的方法是一种抽象方法,只有声明没有程序代码
基本定义
如果一个类之中只是由抽象方法和全局常量所组成的,那么在这种情况下不会将其定义为一个抽象类,而只会将其定义为接口,所以所谓的接口严格来讲就属于一个特殊的类,而且这个类里面只有抽象方法与全局常量。
接口必须要有子类,但是此时一个子类可以使用implements关键字实现多个接口,避免了单继承局限;
接口的子类(如果不是抽象类),必须要覆写接口中的全部抽象方法;
接口的对象可以利用子类对象的向上转型进行实例化操作。
8.5 接口的继承
Java接口并不能随便新增方法,因为实现接口的类需要实现所有接口方法,换句话说,如果新增接口的抽象方法,就需要新增所有实现此接口的方法。为了应对这种情况,我们可以使用接口继承。
接口的多重继承:多重继承表示父类不止一个,在C++语言支持多重继承,但在Java并不支持它,但Java却支持接口的多重继承
如果一个子类既要继承抽象类又要实现接口,那么应该采用先继承后实现接口的顺序完成。
8.6 抽象类于接口的差异
区别 抽象类 接口
关键字 abstract class interface
组成 构造方法、普通方法、抽象方法、static方法、常量、变量 抽象方法、全局常量
子类使用 class 子类 extends 抽象类 class 子类 implements 接口,接口,…
关系 抽象类可以实现多个接口 接口不能够继承抽象类,却可以继承多个父接口
权限 可以使用各种权限 只能够使用public权限
限制 单继承局限 没有单继承局限
子类 抽象类和接口都必须有子类,子类必须要覆写全部的抽象方法;
实例化对象 依靠子类对象的向上转型进行对象的实例化
1、继承抽象类且实现接口:
声明一个图形抽象类Shape 声明一个接口IPerimeter 声明Rectangle类继承Shape抽象类,并且实现接口IPerimeter
2、接口的对象变量:
java接口也是一种引用类型,我们一样可以使用接口来声明对象变量,引用实现此接口的对象
如同抽象类声明的对象变量,当借口声明的对象变量需要访问其引用类型的成员时,需要先转换成Rectangle类的对象变量:转换以后,就可以访问实现类的成员变量和方法
8.7 常量类
除了可以使用public和abstract修饰符外,Java类还提供final修饰符来声明常量类与常量方法,这种类不能被继承,方法声明成final表示此方法不可以重写。
1、使用final修饰符的理由:
保密原因:防止子类访问或重写父类的操作。
设计原因:基于面向对象设计的需求,我们可以讲某些类声明成final,以避免子类的继承。
使用final定义的类不能够再有子类,即:任何类都不能够继承以final声
第9章 嵌套类、多态与包
9.1 嵌套类(内部类)
内部类是一种类的结构扩充,让一个类的内部除了属性与方法之外还可以存在有其它类的结构,并且内部类也可以定义在方法或代码块中
由于内部类需要使用外部类中的属性,而所有的属性只有在对象实例化之后才会分配空间,所以在实例化内部类对象时首先要实例化外部类对象,但是需要提醒大家的是,以上的格式只是一个基础,指的是在一个类内部只定义一个内部类的情况,而如果说一个内部类中又定义了内部类,则类结构需要继续向下延伸,变为“外部类.内部类1.内部类2 对象 = new 外部类().new 内部类1().new 内部类2();”
定义私有内部类
由于存在有private声明,所以Inner类只能够在Outer类的内部使用,这个时候将无法在外部实例化Inner类对象,而这个内部类只能够为Outer一个类服务
使用static定义内部类
使用static定义的属性或者是方法是不受到类实例化对象控制的,所以如果使用了static定义内部类。它一定不可能受到外部类的实例化对象控制。
如果一个内部类使用了static定义的话,那么这个内部类就变为了一个“外部类”,并且只能够访问外部类中定义的static操作。相当于定义一个外部类。
在方法中定义内部类
内部类理论上可以在类的任意位置上进行定义,这就包括代码块之中,或者是普通方法之中,而在以后的开发过程之中,在普通方法里面定义内部类的情况是最多的。
9.2 匿名嵌套(内部)部类
内部类指的是在一个类的内部定义了另外的类结构,利用内部类可以方便的实现私有属性的互相访问,但是内部类是需要明确的使用class进行定义的。而匿名内部类的是没有名字的内部类,但是其必须在抽象类或接口基础上才可以定义。
9.3 多态基础
静态绑定:方法重载
动态绑定:类继承的方法覆盖、接口的方法覆盖
9.4 多态的实现
多态是面向对象的最后一个主要特征,也是一个非常重要的特性,掌握了多态性后才可以编写出更加合理的面向对象程序。而多态性在开发之中可以体现在两个方面:
方法的多态性:重载与覆写
重载:同一个方法名称,根据不同的参数类型及个数可以完成不同的功能;
覆写:同一个方法,根据实例化的子类对象不同,所完成的功能也不同。
对象的多态性:父子类对象的转换。
向上转型:子类对象变为父类对象,格式:父类 父类对象 = 子类实例,自动转换;
向下转型:父类对象变为子类对象,格式:子类 子类对象 = (子类) 父类实例,强制转换;
9.5 包的定义
在Java程序之中的包,主要的目的是可以将不同功能的文件进行分割。在之前的代码开发之中,所有编译后的*.class文件都保存在了同一个目录之中,这样一来就会带来一个问题:如果出现了同名文件,那么就会发生文件的覆盖问题,因为在同一个目录之中不允许有重名文件。而要想解决同名文件冲突的问题,就必须设置不同的目录,因为在不同的目录下可以有重名文件,所谓的包实际上指的就是文件夹。在Java之中使用package关键字来定义包,此语句必须写在*.java文件的首行。
系统常见包
包名称 作用
java.lang 此包为基本的包,像String这样的类就都保存在此包之中,在JDK 1.0的时候如果想编写程序,则必须手工导入此包,但是随后的JDK解决了此问题,所以此包现在为自动导入。
java.lang.reflect 此包为反射机制的包,是java.lang的子包,在Java反射机制中将会为读者介绍。
java.util 此包为工具包,一些常用的类库、日期操作等等都在此包之中
java.text 提供了一些文本的处理类库。
java.sql 数据库操作包,提供了各种数据库操作的类和接口。
java.net 完成网络编程。
java.io 输入、输出及文件处理操作处理。
java.awt 包含了构成抽象窗口工具集(abstract window toolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)。
javax.swing 此包用于建立图形用户界面,此包中的组件相对于java.awt包而言是轻量级组件。
java.applet 小应用程序开发包。
第10章 Android与XML基础
10.1 XML基础
XML(extensible Markup Language,可扩展标记语言)也是一种标签语言和HTML一样,两者都是使用标签和属性来建立文件内容。不过,XML的结构比HTML更多样化,且XML能够自定义标签和文件结构。
XML标记语言
XML没有HTML的默认标签,用户需要自定义描述数据所需的各种标签。
XML的组成元素
XML文件由标签和内容组成,其组成元素有:元素、属性、实体引用、注释、CDATA块、PCDATA、PI和DTD。
1、元素与属性
标签:标签分为开始标签、 等和结尾标签、 等。
元素:是整个文件的主要构架,包括标签加上其中的文字内容,在元素内可包含其他元素,元素是一个完整项目,包含开始标签、属性、标签内的文字内容和结尾标签。
属性:在XML开始标签的标签名称后,可以添加属性列表,各属性用空格符分开。每个属性都拥有属性名称和值,属性值需要用双引号括起来, 如果开始标签和结束标签之间没有任何内容,称为空标签,
2、XML语言本身拥有一些保留符号。
3、注释
XML中的注释和HTML一样由“ ”结尾
4、CDATA与PCDATA
在XML文件的文字内容是PCDATA,例如,处理XML元素title时,标签包含的文字内容是:“JavaSE7与Android程序设计范例教材”就是PCDATA。
CDATA和PCDATA不同,如果XML文件拥有CDATA块,表示XML解析器在处理文件时,不用解析此块的内容。CDATA块是位于“”字符串间的文字内容
5、PI
PI允许XML文件包含传送给应用程序的命令。例如,在XML文件的开头声明就是PI,这些信息可以告诉XML解析器如何处理XML文件
10.2 Android移动操作系统
Android操作系统每一个版本的代号都是使用一种甜点来命名,如表11-2所示。
Android的特点 硬件:支持摄像头、GPS、各种传感器等。
通信与网络:支持现在主流的多种通信标准。
短信:支持sms和mms短信。浏览器:等等。
Android操作系统的系统架构分为:应用程序层、应用程序框架层、函数库、Android运行时环境、Linux内核层
10.3 Android应用程序的组成组件
Android应用程序由多种组件构成,这些组件是一些Android框架的Java类,我们只需要继承这些类,重写和扩充其功能,就可以创建Android应用程序,其方法类似附录A的Java Applet。
Android应用程序的组成包括四大组件:活动(Activities)、内容提供程序(Content Providers)、广播接收器(Broadcase Receivers)和服务(Services)。
1、活动
它是Android应用程序与用户互动的组件,它也是唯一可以让用户看到的组件,即用户界面。我们可以创建多个活动来处理所需的互动。
2、意图
意图是一个启动其他Android活动、服务和广播接收器的异步信息,异步是指信息的送出和接收是相互独立的。意图告诉Android操作系统我想做什么,执行什么动作,此时,操作系统使用意图过滤器(Intent Filters)来找出可以处理的组件,例如:启动其他活动、告诉指定服务可以启动或停止与送出广播。
3、内容提供程序
它是在不同Android应用程序之间分享数据的接口,它是一组封装的数据,提供客户定制化API来进行读写。例如,通信录应用程序实际并没有存储任何通信录数据,它通过内容提供程序取得通信录信息:姓名、地址和电话等。
4、广播接收器
用来接收广播并且做出回应,这是Android实现系统层级的广播与响应机制,例如接到来电、收到短信、启用摄像头、时区改变、系统开机、电池电量过低或用户选择偏好语言时,Android系统都会发出广播
5、服务
服务是在幕后执行的进程,可以执行和活动一样的工作,只是不提供可视化的用户界面。例如播放北京音乐时,之所以不会打断我们发送短信或收发邮件,因为它是一个在幕后执行的服务,这样也使得我们在进行操作时音乐播放不会中断。
10.4 Android开发环境
1、下载jdk
2、下载android SDK工具包adt-bundle-windows-x86,
3、配置环境变量,桌面->计算机->右键属性->高级系统设置->高级->环境变量->adminstrator的用户变量(具体和自己用户名有关),新建或者编辑一下的变量(如已经存在就追加,不存在就新建,追加时注意用;号与之前的隔开)
4、测试环境变量
运行->cmd,输入java或者javac测试命令看成功与否;
Android模拟器(Android Virtual Devices,英文简称AVD)是一个非常有用的工具,它可以在Windows操作系统模拟一台允许Android系统的移动设备,帮助我们测试所开发的Android应用程序。
第11章 布局与使用界面控件
11.1 布局的创建
在Android程序中界面是通过布局文件设定的,在每个应用程序创建时会默认包含一个主界面布局,该布局位于res/layout目录中。
实际开发中每个应用程序都包含多个界面,而程序默认提供的一个主界面布局无法满足需求,因此经常会在程序中添加多个布局。
View类是Android SDK构建用户界面的基础,每一个View对象占用屏幕上一个长方形区域,负责绘出用户界面的图形与事件处理。
View与ViewGroup类
View类是所有用户界面控件的基础类(直接或间接父类),其继承子类分为两大类:
界面控件(Widgets,可称为View对象):正确地说,Android的界面控件是Widget,不是View;Widget是View的子类,就是一些与用户互动的图形界面控件,例如Button和EditText控件等。
布局类(Layout Class,可称为ViewGroup对象):ViewGroup抽象类是View的子类,它是布局类的父类,一种看不见的容器类,用来组织其他界面控件和ViewGroup对象。
以程序代码的角度来看,在活动窗口的用户界面的结构是一棵View和ViewGroup对象组成的树。 树状结构代表屏幕上显示界面控件的层次结构。
11.2 控件介绍
TextView是用于显示文字(字符串)的控件,可在代码中通过设置属性改变文字的大小、颜色、样式等功能
EditText继承自TextView,可以进行编辑操作,将用户信息传递给Android程序。还可以为EditText控件设置监听器,用来测试用户输入的内容是否合法。
Button是按钮,是用于响应用户的一系列点击事件,使程序更加流畅和完整,有几种方式:独立类方式、接口方式、匿名内部类方式
RadioButton为单选按钮,它需要与RadioGroup配合使用,提供两个或多个互斥的选项集。
RadioGroup是单选组合框,可容纳多个RadioButton,并把它们组合在一起,实现单选状态。
ImageView是视图控件,它继承自View,其功能是在屏幕中显示图像。ImageView类可以从各种来源加载图像(如资源库或网络),并提供缩放、裁剪、着色(渲染)等功能。
11.3 布局
1、\res\layout目录下的布局资源
布局资源简单的说是一个用户界面的模板,定义控件如何在屏幕上显示;我们使用声明方式来定义用户界面拥有哪些控件,Eclipse会自动根据XML文件来产生Java类文件。
2、ViewGroup布局类
常见几种布局类: LinearLayout类、RelativeLayout类、FrameLayout类、TableLayout类
第12章 活动与事件处理
12.1 活动类
Activity是Android程序中最基本的模块,它是为用户操作而展示的可视化用户界面,一个Android应用程序中可以只有一个Activity,也可以包含多个,每个Activity的作用及其数目,取决于应用程序及其设计。
Activity窗口显示的可视内容是由一系列视图构成的,这些视图均继承自View基类。每个视图均控制着窗口中一块特定的矩形空间,父级视图包含并组织其子视图的布局,而底层视图则在它们控制的矩形中进行绘制,并对用户操作做出响应,所以,视图是Activity与用户进行交互的界面。比如说,开发人员可以通过视图显示一张图片,然后在用户单击它时产生相应的动作。
活动类(Activity)是Android应用程序的核心,它是用户唯一会注意到的控件,因为大部分活动都会与用户互动
12.2 活动的生命周期
Android操作系统启动着众多活动,通过使用一个活动堆栈(Activity Stack)来管理这些活动。
堆栈行为如同餐厅厨房的工人清洗餐盘。
活动的生命周期简单地说就是活动的状态管理,属于活动管理员(Android Manager)的工作,负责建立、释放和管理众多的活动。
活动的生命周期
基本上,Android程序设计的主要工作是编写程序代码来响应应用程序产生的状态改变,而不是改变状态。 换句话说,对于活动的生命周期来说,我们重视的是不同状态之间的转换,而不是目前位于哪一个状态。
活动共有五个状态:启动、执行、暂停、停止、移除
12.3 Android的事件处理
单纯的控件只是在屏幕上显示对话接口,为了实现Android应用程序与用户的互动,需要编写Java代码来建立事件处理程序。
“事件”是在执行Android应用程序时,手指操作控件或键盘时所触发的一些动作。Android事件处理是一种“委托事件处理模型”,分为“事件来源”和处理事件的“监听器”对象。
事件可能是单击、长按和键盘事件,或控件产生的选取或文字输入事件,当事件产生时,注册的监听器对象可以接受事件然后调用相关方法进行处理,监听器是一个委托处理指定事件的对象。
当用户单击用户界面上的Button控件,就会产生Click事件,因为我们已经注册Button控件的监听器对象且实现onClick()方法,此时,应用程序就会对这一操作进行响应处理。
匿名内层类:在Android也可以使用匿名内层类实现监听器接口的方法来进行事件处理。
在用户触摸屏幕且停留超过一秒钟时触发,长按事件的事件处理是实现OnLongClickListener监听器接口的OnLongClick()方法。
第13章 意图Intent
13.1 Intent 简介
Intent “意图,意向”
协助应用间的交互与通讯
Intent负责对应用中一次操作的动作、数据进行描述
Android根据Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。
应用程序内部的Activity/Service之间的交互。
因此,可以将Intent理解为不同组件之间通信的媒介,专门提供组件互相调用的相关信息。
13.2 Intent 的组成(属性)
1.componentName(组件名称)指定Intent的目标组件的类名称。
2.action(动作)指定Intent的执行动作,比如调用拨打电话组件。
3.data(数据)表示数据和数据MIME类型。
4.category(类别)被执行动作的附加信息。
5.extras(附加信息)为处理Intent组件提供附加的信息。可通过putXX()和getXX()方法存取信息;也可以通过创建Bundle对象,再通过putExtras()和getExtras()方法来存取。
6.flags(标记)指示Android如何启动目标Activity,设置方法为调用Intent的setFlags方法或AndroidManifest.xml
13.3 Intent属性的设置
1、componentName(组件,名称),指定Intent的的目标组件的类名称。
通常 Android会根据Intent 中包含的其它属性的信息,比如action、data/type、category进行查找,最终找到一个与之匹配的目标组
2、Action,使用android:name特性来指定对响应的动作名字符串。在 节点指定。
3、category(类别),被执行动作的附加信息。在 节点指定。
4、Dtype(数据类型),指定Intent的数据类型(MIME)。
data和type属性一般只需要一个,setData方法会把type属性设置为null,setType方法会把data设置为null.如果extras(附加信息),是其它所有附加信息的集合。
5、extras(附加信息),是其它所有附加信息的集合,使用extras可以为组件提供扩展信息。
13.4 显式和隐式的Intent
Intent有多个构造函数的重载,其中一个是Intent(Context packageContex,Class>cls)。这个构造函数接收两个参数,第一个参数Context 要求提供一个启动活动的上下文,第二个参数Class则是指定想要启动的目标活动,通过这个构造函数就可以构建出Intent的“意图”。
相比于显式Intent,隐示Intent则含蓄了许多,它并不明确指出我们想要启动哪一个活动,而是指定了一系列更为抽象的action和category等信息,然后交由系统去分析这个Intent,并帮助我们找出合适的活动去启动
指定了componentName属性以后,Intent的其它所有属性都是可选的。将直接使用它指定的组件,而不再执行上述查找过程。
13.5 Intent解析
Intent到Intent过滤器的映射过程称为“Intent解析”
Intent解析可以在所有的组件中,找到一个可以与请求的Intent达成最佳匹配的Intent过滤器
Intent 解析的匹配规则
Android系统将列表中所有Intent过滤器的 action 和 category与 Inten 进行匹配
任何不匹配的 Intent 过滤器都将被过滤掉
没有指定 action 的 Intent 过滤器可以匹配任何 Intent
但是没有指定category 的 Intent 过滤器只能匹配没有category 的 Intent
13.6 传递数据
数据返回給上一个活动:Activity中还有一个startActivityForResult()方法也是用于启动活动的,这个方法期望在活动销毁的时候能够返回一个结果给上一个活动。这个方法有两个参数,第一个参数是Intent,第二个参数是请求码,用于在之后的回调中判断数据的来源。