Java编程思想--1~2章对象

1.抽象过程

所有编程语言都提供抽象机制,汇编语言是对底层机器的轻微抽象,“命令式”语言(如BASIC、C等)是对汇编语言的抽象,但是它们所做的主要的抽象仍要求解决问题时要基于计算机的结构,而不是基于所要解决的问题的结构来考虑。

OOP(面向对象编程)允许根据问题来描述问题,而不是根据运行解决方案的计算机来描述问题。

面向对象设计方式:

1)万物皆对象

对象可以视为奇特的变量,可以存储数据,除此之外你还可以要求它在自身上执行操作。

2)程序是对象的集合,它们通过发送消息来告知彼此需要做的。

消息可以看成是对某个特定对象的方法的调用请求

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

对象里可以包含已经创建的对象

4)每个对象都拥有其类型

5)某一特定类型的对象都可以接受同样的消息

2.每个对象都有一个接口、每个对象都提供服务

接口定义了某一特定对象所能发出的请求(定义方法)

将对象想象成“服务提供者”能更好的理解程序设计,同时有助于提高程序的内聚性。

内聚标志一个模块内各个元素彼此结合的紧密程度,它是信息隐蔽和局部化概念的自然扩展。内聚是从功能角度来度量模块内的联系,一个好的内聚模块应当恰好做一件事。它描述的是模块内的功能联系。

3.被隐藏的具体实现(访问控制)

访问控制权(yes表示可以访问)
  同一类 同一包的类 其他包子类 其他包中的类
public yes yes yes yes
protected yes yes yes  
default yes yes    
private yes      

说明:protected 在同包中不论是子类或其他的类都能访问到,但是不同包的话,子类能访问到,不是子类的就不能被访问

不同包下,子类不能直接通过父类引用访问,jvm解析不到是否是子类访问的情况,虽然你是在子类中定义了父类引用。
通过super,jvm就知道是子类要访问父类的protected方法。

例如:super.opendoor1();

 

4.继承

is-a(是一个)关系:子类只覆盖父类的方法,并没有添加新方法。

子类和父类是完全相同的类型(具有相同的行为或者说是接口)可以视为纯粹替代,通常称为替代原则,某种意义上说是一种处理继承的理想方式。

is-like-a(像是一个)关系:子类新添加了方法

添加了新的接口,扩展了父类,但是这种替代并不完美,因为父类无法访问新添加的方法。

5.伴随多态的可交换对象

面向对象程序设计语言使用了后期绑定的概念。当向对象发送消息时,被调用的代码直到运行时才能确定。也叫动态绑定。 

在某些语言中,必须明确地声明希望某个方法具备后期绑定属性所带来的灵活性(C++是使用virtual关键字来实现的)。在这些语言中,方法在默认情况下不是动态绑定的。而在Java中,动态绑定是默认行为(Java中除了static方法、final方法和private方法之外,其它所有方法都是动态绑定),不需要添加额外的关键字来实现多态。

 

6.对象创建和生命期

用引用操纵对象:Java中一切都是对象,但我们实际操纵的是对象的引用。可以想象成用遥控器(引用)操纵电视(对象),比如想要调低音量实际操纵的是遥控器。在一点遥控器可以脱离电视而独立存在,也就算说,你拥有一个引用,并不一定需要一个对象与他关联。

String s ;  // 这里只是创建一个引用,并不是对象。

String s = new String("abc"); //创建一个引用,并与一个对象关联。

对象的数据位于何处:


           将对象置于堆栈(它们有时被称为自动变量(automatic variable)或限域变量(scoped variable))或静态存储区域内来实现。这种方式将存储空间分配和释放置于优先考虑的位置,某些情况下这样控制非常有价值。但是,也牺牲了灵活性。
           第二种方式是在被称为堆(heap)的内存池中动态地创建对象。在这种方式中,直到运行时才知道需要多少对象,它们的生命周期如何,以及它们的具体类型是什么。
  Java完全采用了动态内存分配方式(基本类型只是一种特例)。每当想要创建对象时,就要使用new关键字来构建对象的动态实例。

对象存储到什么地方:


  (1)寄存器:是最快的存储区,因为它位于处理器内部,但是寄存器的数量极其有限,所以需要根据需求分配。
  (2)堆栈(RAM区):一般对象的引用都存储在这里,堆栈指针向下移动,分配新的内存,向上移动,则释放内存。
  (3)堆(RAM区):用于存放所有的Java对象
   堆不同于堆栈的好处是:编译器不需要知道存储的数据在堆里存活多长时间。
   坏处:用堆进行存储分配和清理可能比用堆栈进行存储分配需要更多的时间。
  (4)常量存储(ROM只读存储区):   直接存放在代码内部。
  (5)非RAM存储:  数据存活在程序之外,不受程序的任何控制,在程序没有运行也可以存在。两个基本例子流对象和持久化对象

7.Static

static意味着域或者方法不会与包含它的那个类的任何对象实例关联在一起。

static在一个类中只会有一个存储空间,而非static变量会对类的每一个对象创建一个存储空间。

修饰代码块:先于构造器加载,并且只会加载一次,方法内没有this,全局方法,仅通过类本身来调用static方法。

猜你喜欢

转载自blog.csdn.net/Bruce_Up/article/details/84448762