Java 程序设计——面向对象编程部分
作者: zccst
Java 编程,淋漓尽致地体现了面向对象编程的精华。 —— zccst
前面的话
曾经有一段时间,很排斥 Java 。认为做 Java 的人水平和能力等都比较低,那绝对是一种鄙夷的态度。但是,在公司项目的迫压下,我开始了 Java 之旅。由于具备良好的 C++ 基础,所以差不多几天时间就上手了。是在后来才发现, Java 远非我想象的那么简单。我闯进了一片新的天空,很舒服。也是在这几天里,我深刻地体会到“机器是最好的老师”这句话的涵义(大学时候没做到)。终于可以力所能及,甚至游刃有余,我想,这大概是我从新手或菜鸟晋级的最好方式吧! O( ∩ _ ∩ )O 哈哈 ~
《 Java 语言程序设计》学习框架
Java 概述 Java 由来、演化、分流;开发工具、平台搭建;特点、前景
Java 结构化编程 关键字、标识符、基本数据类型、运算符、表达式、流程控制;数组
Java 面向对象编程 类和对象; 封装性、继承性、多态性;抽象类;最终类;接口
Java 常用类库 lang 、 applet 、 awt 、 io 、 net 、 util
Java 异常处理
本文重点讲解的就是: Java 面向对象编程部分。(已用黑体字)
由于从大三开始接触 C++ ,面向对象的基础知识还算可以,所以本文略去 Java 中与 C++ 相同的部分。惭愧的是,近几年来没多大进展。
类和对象
类、对象、构造函数 (constructor) 、垃圾自动回收机制的定义和使用。还有默认初始化。
构造函数,是用来对新创建对象进行初始化的。除与类名同、没有任何返回值外,在语法结构上与一般的方法相同。
构造函数实例化一个类对象格式:类名 对象名 = new 构造函数(实际参数)
a, 用 new 为对象分配空间
b, 执行构造方法为对象进行初始化
Java 没有析构,但提供了一个类似的方法: protected finalize(); 另外还有方法 : “ System.gc() ”
Java 程序由类组成,一个程序至少要包含一个类。 Java 程序员的任务就是设计出这样的类来解决实际问题。
程序运行时的内存占用
代码区 存放程序的代码部分
数据区 存放程序的全局数据和静态数据
堆区 存放程序动态申请的数据(比如: new )
栈区 存放程序的局部数据和参数
Person p1 = new Person(“Jack”,”Male”,23);
Person p2 = p1;
Person p3 = new Person(“Jack”,”Male”,23);
p1 和 p2 指向同一个对象; p1 和 p3 指向不同的对象。
类的静态属性和静态方法
在 class 中定义的变量 分为类变量(静态变量)和实例变量;方法 分为类方法(静态方法)和实例方法。都用 static 修饰。弄清楚的最好办法是实践。
类变量和类方法由该类产生的所有实例共享。调用方式:类名 / 对象名 . 静态变量 ( 静态方法 )
注: static 方法中不能处理非 static 的域或方法。
面向对象的三大特征:封装性、继承性、多态性。
public 公共类:封装 。控制用户对类修改和访问数据的程度。
其对于关系,可以用一个图表清楚的表示:
public 公共类:继承和派生
extends 一套规则 this 和 super 。
/*super.name = name;
super.sex = sex;
super.age = age; */
就这段代码,曾花了两个小时,每次看到,都会想到那天下午。
public 公共类:多态——重载和覆盖
1 ,静态多态性:编译时,重载 (overload) 函数同名,参数列表不同
一般函数重载, Java 类库中的类也有很多重载的方法,比如 println();
构造函数重载 TestPerson2.java
2 ,动态多态性:运行时,覆盖 (override) 子类对父类的方法覆盖
TestPerson1.java
null 、 this 、 super 三个域。 this, super 区别见申雪萍课件—— this 引用与 super 引用的对比
abstract 抽象类:抽象类和抽象方法
抽象类是不能实例化的。只能被继承。
抽象方法是没有方法体的,以“;”介绍。例, abstract public double area();
抽象类至少有一个抽象方法,反过来一个类有抽象方法,则这个类必须声明为抽象类。
最终类和最终方法
final 类中的方法可以不声明为 final 方法,但实际上 final 类中的方法都是隐式 final 方法。
final 修饰的方法不一定要存在于 final 类中。
如果一个变量用 final 修饰,表明它在程序中是不能修改的常量。
用 final 修饰的方法既不能覆盖,也不能被重载,它是一个最终方法,其定义永远不能改变。
对 final 对象重新赋值会产生编译错误,但是对 final 对象中的变量赋值是可以的。
接口( interface ) :用来实现类间多重继承功能的结构
每一个方法都是抽象的,没有方法体,只有名字和参数表。行为留给实现该接口的类完成。
每一个变量都是静态的常量,都必须赋值。
(所以方法默认是 public abstract ,所有变量都默认是 public static final 。)
第一步:用关键字 interface 定义接口:
[public] [interface] 接口名称 [extends 父接口名列表 ] # 继承的也是接口
{
// 静态常量
[public] [static] [final] 数据类型 变量名 = 常量名 ;
// 抽象方法
[public] [abstract] [native] 返回值类型 方法名(参数列表) ;
}
接口可以继承,也可以多重继承,例如:
interface IA{…}
interface IB{…}
interface IC{…}
interface ID{…} extends IA, IB, IC{…}
第二步:用关键字 implements 实现接口:
[ 修饰符 ] class 类名 [extends 父类名 ] [implements 接口 A ,接口 B , …]
{
类的成员变量和成员方法 ;
为接口 A 中的所有方法编写方法体,实现接口 A;
为接口 B 中的所有方法编写方法体,实现接口 B;
……
}
例如:
[ 修饰符 ] class A implements IA{…} # class A 要实现接口 IA 中的所有接口方法。
[ 修饰符 ] class B extends A implements IB, IC{…} # class B 要实现 IB, IC 中的所有接口方法。
注:如果哪怕只有一个接口方法没有实现,则那个类也要声明称抽象的。
通过接口可以在运行时动态定位类所调用的方法。接口与重载、覆盖一样,是多态性的体现。
接口的好处是把方法描述与方法功能的实现分开考虑,降低了程序的复杂性,使程序设计灵活,便于扩充修改。