第3章
对象、类、包和接口
面向对象的概念
所谓面向对象的方法学,就是使我们分析、设计和实现一个系统的方法尽可能地接近我们认识一个系统的方法。包括:
面向对象的分析(OOA, Object-Oriented Analysis)
面向对象的设计(OOD, Object-Oriented Design)
面向对象的程序设计(OOPL, Object-Oriented Program)
面向对象技术主要围绕以下几个概念:
对象、抽象数据类型、类、类型层次(子类)、继承性、多态性。
下面介绍基本概念
1 对象 Object
2 类 Class
3 实例 Instance
4 接口 Interface
5 类型 Type
6 引用 Reference
7 包 Package
8 封装 Encapsulation
9 继承 Inharitance
10多态 Polymorphism
1 对象
所有东西都是对象。可将对象想象成一种新型变量;它保存着数据,但可要求它对自身进行操作。每个对象都有自己的存储空间,可容纳其他对象。每个对象都有一种类型。
同一类所有对象都能接收相同的消息。
将对象进行抽象变成程序的“类”是编制程序的首要任务,同时也是程序设计优劣的关键。
class Person
{
int age;
……
void work() { … }
……
}
2 类(class):抽象的集合概念
系统类库中已定义好的类,用户也可以自定义的类。
类里面有属性,方法
属性:状态,静态特性的描述。
方法:行为,动态特性的描述。
类的构造方法
构造方法的名字与类名相同。创建对象时自动调用对对象进行初始化操作。
构造方法前面没有返回类型定义,它没有返回值,也不是void。[不能return]
构造方法可以重载[多个构造方法但参数不同],可以继承[子类创建时先调用父类的,再调用自己的]。
JAVA每个类都至少有一个构造方法[系统默认无参数构造方法];一旦定义了构造方法,系统不再提供默认的[只有定义了有参数的,都需要再定义一个无参数的]。
你必须拥有一个合适的类才能创建一个合适的对象,有了合适的对象才能完成合适的工作。
类名 对象变量=new 类名([参数]);
类名 对象变量;
对象变量= new 类名([参数]);
对象的引用:
对象名.成员变量名
对象名.方法名([参数])
3 将类实例化之后就得到了实例(Instance)
class Person
{
int age;
}
public class ObjtoObj
{
public static void main(String[] args)
{
Person p1=new Person();//得到实例
Person p2=new Person();
p1.age=20;
p2.age=30;
System.out.println("p1.age:"+p1.age+" p2.age:"+p2.age);
p1=p2;
System.out.println("p1.age:"+p1.age+" p2.age:"+p2.age);
p1.age=25;
System.out.println("p1.age:"+p1.age+" p2.age:"+p2.age);
}
}
4 接口 (后面详细说明)
Java中的接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有
不同的行为(功能)。
5 类型 Type 略
6 引用 Reference 略
7 包
包的定义: package 包名;
位置: 程序的第一条语句
存放: Sun建议Internet域名倒置
编译: 使用javac –d . xxx.java
包的引用: import 包名.[类名|*];
位置: package语句[若有]和类定义之间
默认: 系统自动引入java.lang包[import java.lang.*]
路径: classpath:做为特殊的根目录使用,从这里展开对.class文件的搜索 。
package A;
public class Hello
{
public static void main(String args[])
{
System.out.println("Hello World!");
}
}
D:/Java>javac Hello.java 此程序可以编译通过.接着执行。
D:/Java>java Hello 但是执行时,却提示错误!
原因是我们把生成的Hello.class规定打包在D:/Java/A文件中,必须在A文件中才能去运行。所以应该在D:/Java目录下建立一个A目录,然后把把Hello.class放在它下面,执行时
,可正常通过!
D:/Java/>java A.hello 就会输出:Hello world!
现在介绍Java的import机制
我们在D:/Java目录下建立一个Tesy.java文件,其内容如下:
import A.Hello;
public class Test{
public static void main(String[] args){
Hello Hello1=new Hello();
}
}
D:/Java/>javac Test.java 编译成功!
D:/Java/>java Test运行成功!
8 封装
将信息隐蔽的过程称为封装。
封装实际上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。
至少有两方面的原因促使我们控制对成员的访问。
防止程序员接触他们不该接触的东西。若只是为了解决特定的问题,只需操作接口即可。
允许系统人员修改内部结构,不用担心它会对程序员造成什么影响。
强内聚 弱耦合
Java提供4种访问权限: public,protected,private和friendly.
9 继承
继承:现实世界中遗传关系的直接模拟, 它表示类之间的内在联系以及对属性和操作的共享。
面向对象语言允许从一个已有的类[父类]定义新的类[子类],从而形成继承关系。
子类继承了父类的属性,子类也可继承了父类的方法; 子类并不限于继承,还可以发扬光大;继承未必只有一层。
继承机制的意义
简化类或对象之间的接口
支持软件重用[代码重用]
Java使用关键字extends定义继承[不支持多重继承]
extends表明要构建的新类是从一个现有类衍生的,现有类称为父类、超类、基类;而新类称为子类、派生类。
class Person
{
int age;
……
void study() {…}
void work() {…}
……
}
class Girl extends Person
{
double moneyForDressing
……
void shy() {…}
……
}
10 多态
多态性: “多种形态”,是允许一个接口被多个同类动作使用的特性。[希腊语]
多态用来模拟物件的对环境的适应能力的!就相当于人的多面性,对不同的人就呈现出不同的一面。
同名方法的覆盖(override)和重载(overload)是多态两种完全不同的机制。
替代原则(substitution principle):父类可以用其子类代换。[替代过程也是子类向上转型的过程,向上转型是一种常用的安全的类型转换]。通过向上转型可实现多态性。
多态 override
覆盖的方法的标志必须要和被覆盖的方法的完全匹配,才能达到覆盖的效果;
覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;
被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
class A
{
……
void gg() {…}
void mm(int num) {…}
……
}
class B extends A
{
……
void gg() {…}
void mm(int num){…}
……
}
多态 overload
方法的重载:即多个方法用相同的名称,但参数行不同(不同的参数类型,不同的参数个数,不同的参数顺序)。[根据不同的参数样式,来选择合适的方法执行]
不能通过访问权限、返回类型、抛出的异常进行重载
多态转换 (cast)
父类有的子类肯定有,子类有的父类不一定有 向上转换 ==> 子类可以自动转换成父类
上转型对象会失去原对象的一些属性和功能