您的位置:首页 > 编程语言 > Java开发

Java编程思想(一)—— 对象导论

2018-03-29 23:20 246 查看

一、抽象过程

人们所能够解决的问题的复杂性直接取决于抽象的类型和质量。
我们将问题空间中的元素及其在解空间中的表示称之为“对象”。

1、面向对象程序设计的五个基本特性:

① 万物皆对象

将对象视为奇特的变量,它可以存储数据。

② 程序是对象的集合,它们通过发送信息来告诉彼此所要做的事情

可以把消息想象成对某个特定对象的方法的调用请求。

③ 每个对象都有自己的由其他对象构成的存储

可以创建包含现有对象的包的方式来创建新类型的对象。

④ 每个对象都有其类型

每个对象都是某个类(class)的一个实例(instance),这里的“类”和“类型”同义词。

⑤ 某一特定类型的对象都可以接收同样的消息

比如“长方形”类型的对象可以接收发给“几何形”类型对象的信息。
更简单的总结:对象具有状态、行为和标识。(标识指每个对象在内存中都有一个唯一的地址)

二、每个对象都有一个接口

所有的对象都是唯一的,但同时也是具有相同特征和相同行为的对象所归属的类的一部分。
因为类描述了具有相同特征和相同行为的对象的集合,所以一个类实际上就是一个数据类型(引用数据类型)。
必须有某种方式产生对对象的请求,使用对象完成各种任务,但是每个对象都只能满足某些请求,这些请求由对象的接口(interface)所定义。
创建对象:先定义对象的引用,然后调用new方法来创建该类型的新对象。

引用对象:为了向对象发送消息,需要声明引用对象的名称,并以圆点符号连接一个消息请求。

三、每个对象都提供服务

        在开发或理解程序设计时,可以将对象想象为“服务提供者”,程序将向用户提供服务,它可以通过调用其他对象提供的服务来实现这一目的,开发者的目标就是去创建能够提供理想的服务来解决一系列问题的对象。这有助于提高对象的内聚性。

四、被隐藏的具体实现

程序开发人员按角色分为:类创建者(创建新数据类型的程序员)和客户端程序员(使用数据类型的类消费者)。

1、访问控制的原因

① 让客户端程序员无法触及他们不应该触及的部分,避免毁灭,减少bug;
② 允许库设计者可以改变类内部的工作方式面不必担心影响到客户端程序员。

2、访问控制的边界设定

public:表示紧随其后的元素对任何人都是可用的;
private:表示除了类型创建者和类型内部的方法之外任何人都不能访问的元素;
protected:表示只能让继承的类(子类)来访问的元素;
默认:可以访问同一个包的其他类的成员,通常被称为包访问权限。

五、复用具体实现

        新的类可以由任意数量、任意类型的其他对象以实现新类中的功能进行合理组成。使用现有的类合成的类,这种概念称为组合,如果组合是动态发生的,通常被称为聚合。组合是“has-a”(拥有)的关系。

六、继承

        类型不仅仅只是描述了作用于一个对象集合上的约束条件,同时还有与其他类型之间的关系,两个类型可以有相同的特性或行为,但是其中一个类型可能比另一个含有更多的特性,并且可以处理更多的消息。继承用基类型和导出类型的概念描述表示了这种类型之间的相似性。一个基类型包含其所有导出类型所共享的特性和行为。
        当继承现在类型时,也就创造了新的类型,新的类型不仅包括现有类型的所有成员(包括private成员,但不可访问),而且它复制了基类的接口。由于基类和导出类具有相同的基础接口,所以伴随此接口的必定有某些具体实现。

1、基类与导出类产生差异的两种方法

① 直接在导出类中添加新的方法;
② 改变现有基类的行为(方法),这被称之为覆盖。

2、“是一个”与“像一个的”关系

① 继承只覆盖基类的方法,而不添加在基类中没有的新方法,结果可以用一个导出类对象完全替代一个基类对象,通常被称为
c1b9
替代原则。在这种情况下,基类与导出类之间的关系称为“is-a”(是一个)的关系。
② 在导出类型中添加新的接口元素来扩展接口,这个时候基类无法访问新添加的方法,基类与导出类之间的关系称为“is-like-a”(像是一个)的关系。

七、伴随多态的可互换对象

        通过导出新的子类型而轻松扩展设计的能力是对改动进行封装的基本方式之一。
        当向对象发送消息时,被调用的代码直到运行时才能确定,编译器确保调用方法的存在,并对调用参数和返回值执行类型检查。这就是后期绑定的概念(无法提供这种保证的语言被称为弱类型编程语言),在java中动态绑定是默认的。
下面看一个动态绑定的示例:/**
* 父类
*/
public class Shape {

public void draw() {
System.out.println("this is shape");
}
}
/**
* Shape的子类
*/
public class Line extends Shape {

public void draw() {
System.out.println("this is Line");
}
}
/**
* Shape的子类
*/
public class Triangle extends Shape {

public void draw() {
System.out.println("this triangle");
}
}
/**
* 测试类
*/
public class ShapeTest {
@Test
public void test() {
Line line = new Line();
Triangle triangle = new Triangle();
doSomething(line);//this is Line
doSomething(triangle);//this is triangle
}

public void doSomething(Shape shape) {
shape.draw();
}
}

八、单根继承结构

所有的类最终都继承至单一的基类Object。
在单根继承结构中所有的对象都具有一个共用的接口,所以它们归根到底都是相同的基本类型。
单根继承结构使垃圾回收器的实现变得容易的很多,所有对象都保证其具有类型信息,因此不会因为无法确定对象的类型而陷入僵局,这给编程带来了很大的灵活性。

九、容器

        创建一种对象类型,这种对象类型持有对其他对象的引用,这种对象通常被称为容器(集合),它在任何时候都可以扩充自己,以容纳你置于其中的所有东西。

1、我们为什么需要不同的容器?

① 不同的容器提供了不同类型的接口和外部行为;

② 不同的容器对于某些操作具有不同的效率。

比如:我们可以在构建程序时使用LinkedList,在优化系统性能时使用ArrayList,接口List所带来的抽象,把容器之间进行转换时对代码的影响降到最小程度。

2、参数化类型

参数化类型就是系统可以自动定制作用于特定类型上的类,在Java中被称为范型。List<String> list = new ArrayList<>();

十、对象的创建和生命周期

1、对象的创建

第一种是将对象置于堆栈中或静态存储区域来实现;
第二种是在被称为堆的内存池中动态的创建对象。

2、对象的生命周期

允许在堆栈上创建对象的语言,编译器可以确定对象存活的时间,并可以自动销毁它。
如果是在堆上创建对象,编译器就会对它的生命周期一无所知,Java提供了“垃圾回收器的机制”,它可以自动发现对象何时不在被使用,并继而销毁它,从而来处理内存释放问题。

十一、异常处理

        异常是一种对象,专门设计用来处理特定类型的错误,它与程序的正常执行路径是并行的,所以不会干扰正常的执行代码。异常不能被忽略,所以它保证一定会在某处得到处理。

十二、并发编程

把问题切分为多个可独立运行的部分,这些彼此独立运行的部分称之为线程,上述的概念被称为并发。
如果操作系统支持多处理器,那么每个任务都可以被指派给不同的处理器,它们在并行执行。
并发的隐患:共享资源,解决方法是某个任务锁定某项资源,完成其任务,然后释放资源锁,使用其他任务可以使用这项资源。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: