20165218 2017-2018-1 《Java程序设计》第三周学习总结
教材学习内容总结-第四章 类与对象
面向对象语言
需要完成某种任务时,首先要想到,谁去完成任务,即哪个对象去完成任务;提到数据,首先想到这个数据是哪个对象的。————《Java 2实用教程》P51
面向对象编程的三个特性:封装性、继承、多态
- 封装性: 将数据和对数据的操作封装在一起。通过抽象,即从具体的实例中抽取出共同性质形成一般的概念。
graph LR
A[行为/功能]-->|抽象|B[方法]
graph LR
A[状态描述]-->|抽象|B[属性]
-
继承: 子类可以继承父类的属性和行为
-
多态: 一是操作名称的多态性,即向操作传递不同消息;二是继承有关的多态,指同一个操作被不同类型对象调用时可能产生不同行为。
类
- 类=类声明+类体
- 类体的内容:变量的声明+方法定义
- 成员变量在整个类内都有效,其有效性与它在类体中书写的先后位置无关。
- 方法中的局部变量只在方法内有效,且与其声明的位置有关。
变量 | 有效范围 |
---|---|
参数 | 整个方法 |
在一个复合语句中声明 | 该复合语句 |
在一个循环语句中声明 | 该循环语句 |
class A{
int a = 12; \合法,声明的同时赋予初值12
}
class A{
int a;
a = 12;\非法
}
类体的内容中不能有语句,语句只能出现在方法体中
构造方法与对象的创建
-
构造方法
程序用类创建对象时需要的一种特殊方法,名字必须与他所在的类名字完全相同,没有类型。
System.out.println("南孚电池的储电量是:"+nanfu.electricityAmount);
类的名字 对象名字 \声明对象
对象 = new 构造方法 \为对象分配变量(使用new运算符和构造方法)
-
使用对象
对象.变量
对象.方法
参数传值
-
可变参数
\示例
public void f(int ... x)
\示例2
public void g(double a, int ... x)
\错误示例,可变参数x代表的最后一个参数不是method方法的最后一个参数
public void method(int ... x, int y)
可变参数不给出参数列表中从某项开始直到最后一项参数的名字和个数,但这些参数类型相同。参数代表可以通过下表运算来表示参数列表中的具体参数。
实例成员与类成员(static)
-
实例变量与类变量
实例变量和相应的对象关联,类变量和类相关联
-
实例方法与类方法
方法 | 实例方法 | 类方法 |
---|---|---|
分配入口地址 | 该类创建对象后 | 该类被加到内存时 |
调用 | 通过对象调用 | 通过类名和对象调用皆可 |
操作 | 可操作实例变量和类变量 | 只能操作类变量 |
this关键字
表示某个对象(注意与前文区分成员变量与局部变量的this区分),可以出现在实例方法和构造方法中,但不可以出现在类方法中。
-
this关键字出现在类的构造方法中时,代表使用该构造方法所创建的对象
-
this关键字出现在实例方法中时,就代表正在调用该方法的对象
访问权限
权限 | 关键字 | 含义 |
---|---|---|
私有 | private |
在B类中,不能通过A类的类名来调用A中的私有类变量和私有类方法 |
共有 | public |
B类中用类A创建了一个对象后,该对象能访问A中的共有变量和共有方法。B中也可通过A的类名调用A中的类成员变量和类方法 |
受保护的 | protected |
B类中用类A创建了一个对象后,如果B和A类在同一个包中,那么该对象可以访问A的protected变量和protected方法。任何一个与A类同包的类中,也可通过A的类名访问A类的protected类变量和protected类方法
友好| 不用private
,public
,protected
修饰 | B类中用类A创建了一个对象后,如果B和A类在同一个包中,那么该对象可以访问A的友好变量和友好方法。任何一个与A类同包的类中,也可通过A的类名访问A类的类友好成员变量和类友好方法
教材学习中的问题和解决过程
- 问题1:“友好变量和友好方法”与“受保护的成员变量和方法”有什么不同?
- 问题1解决方案:成员变量分为实例变量和类变量。“友好”是“任何一个与A类同包的类中,可通过A的类名访问A类的类友好成员变量和类友好方法”;“
protected
”则是“任何一个与A类同包的类中,可通过A的类名访问A类的protected类变量和protected类方法”。“友好”比protected
权限更大一些。
代码调试中的问题和解决过程
-
问题1:当需要同时编译三个源文件时,比如
Example4_8.java
,Circle.java
,Circular.java
(都在Ch4/src
之下,当前位置是Ch4
,在命令行输入javac -d bin src/Example4_8.java
,会出现如下状况
-
问题1解决方案:这是因为同时需要编译的
Circle.java
,Circular.java
不在Ch4
之下,需要进入Ch4/src
后,利用javac -d ../bin Example4_8.
编译即可:
-
问题2:教材第76页实例
-
问题2解决方案:虽然在类
Example4_9
没有声明数据类型,但在类SIM
中声明了double
型,调用SIM
为对象simOne
分配变量时,数据类型要保持统一。在后面加大写字母L
。 -
问题3:因为理解不深刻,错把代码写成
-
问题3解决方案:声明类的格式是
类 对象名字
,而使用对象则是对象.变量/方法
,若是类变量,则可以类.类变量
,通过类名直接访问类变量