JAVA思想----对象

对象

对象具有状态,行为和标识。

  • 状态:对象的内部数据
  • 行为:方法
  • 标识:在内存中的唯一地址

具有相同状态和行为的对象集合被称为一类。

程序是各种对象的集合体。

对象可以提供服务:程序是用来为用户提供服务的,它(程序)将通过调用每个对象的服务来实现这个目的。

高内聚:每个对象都可以很好的去完成一件事,并不是试图去做更多的事。

访问控制(边界)存在的必要性:

  1. 让客户程序员无法触及他们不该触及的部分,往往这种部分对数据类型的内部操作是必须的,但并不是客户要解决特定问题所必须的。
  2. 允许类的创建者改变该部分时不会影响到客户程序员的使用。

边界界定词:

  • public 完全暴露
  • private 进创建者和类型内部方法可调用
  • protected 与private相当,但继承的类可访问protected但不可访问private
  • 无界定词,则仅在当前包内可调用,非当前包内无法调用,相当与指定了private

当要设计的类与已存在的类具备has-a关系的时候,适合用组合的方法来处理问题。

- 门
- 窗
- 桌子
- 床
- 椅子
- 柜子
+ 卧室
	- 门
	- 窗
	- 桌子
	- 床
	- 椅子
	- 柜子

当到设计的类与已存在的类具备is/like-a关系的适合,适合用继承的方法来处理问题。

- 车
	- 轮胎
	- 地盘
	- 车架
+ 赛车 extend 车
	- 涡轮增压
	- 机械增压
	- ...

为什么要继承:

  1. 已存在的类的方法不够我们解决问题使用,所以继承并为新类添加需要的方法。
  2. 已存在的类虽然有我们想要的方法,但执行结果并不理想,所以继承并在新类中重写(覆盖)基类的方法。

is-a,是一个:

子类重写基类方法,并没有实现新的方法,调用方式与基类一致,可以完全替代基类。

is-like-a,像一个:

子类可能重写了基类的方法,但是又实现了自己独有的方法,基类无法调用子类新添加的方法。

多态:

子类实现了基类的方法,那么,基于同一个基类导出的子类,都可以完美的看作为基类。

- shape
	- draw()
	- erase()

- circle extend shape:
	- draw()
	- erase()
	- ...
- square extend shap:
	- draw()
	- erase()
	- ...
	
doSomething(shape sp):
	sp.draw()
	sp.erase()

Circle cl = new Circle()
Square sa = new Square()
doSomething(cl)
doSomething(sq)

上述示例中,cl,sa作为Shape导出类的实例,在执行doSomething时,均被看作为Shape执行,此处存在“向上转型”,子类被作为基类。

容器对象:

往往程序开发不知道需要创建多少对象,也不清楚对象需要存活多久,为了解决这个问题,需要一个容器来储存它们的引用,这种容器被称为容器对象。

对容器对象的选择:

  1. 不同的容器提供不同类型的接口和外部行为,针对不同的问题,不同的容器会提供不同的解决方案。
  2. 不同的容器在解决同一个问题时候,可能会体现出不同的效率。

容器对象都只具有Object类型,Java单根继承结构使得所有对象都可以被容器储存。但是储存时候必须向上转型为Object,这样转型在取出的时候就会丢失身份特征。此时就需要向下转型,如果转为错误的类型便会触发异常。所以使用泛型来声明容器储存的对象类型,这样确保了对象在转型的时候不会发生异常。

ArrayList<Shape> shapeArray = new ArrayList<Shape>()

操作对象分清:

  • 直接操作对象的元素
  • 通过特殊语法间接操作对象(指针)引用,句柄,遥控器。

Java对对象的操作实际上是操作引用,引用可以独立存在,如果需要操作对象,需要将对象于引用建立关联。

String a; // 建立了一个引用,对引用发送消息会触发运行时异常
String b = "abc"; // 建立了一个引用 并将引用与“abc”字符串建立了关联

对象在哪里存储

  1. 寄存器,处理器内部,Java无法直接控制,感觉不到它的存在
  2. 堆栈,RAM中,Java系统必须知道存储在堆栈内所有项的确切生命周期,用于存储对象引用
  3. 堆,RAM中,存放Java对象,每次new的时候会在此空间尽心存储分配。
  4. 常量,代码内部/ROM寄存器
  5. 其他介质,数据流,持久化,数据库。

任何情况难免存在特例,基本类型,由于其特别小且简单,因此对这些类型并不是使用引用,存在堆里,而是直接将值存在堆栈上。

类型大小小值大值包装器类
boolean---Boolean
char16-bitsUnicode 0Unicode 2^16-1Character
byte8-bits-128+127Byte
short16-bits-2^15+2^15-1Short
int32bits-2^31+2^31-1Integer
long64bite-2^63+2^63-1Long
Float32bitsIEEE754IEEE754Float
double64bitsIEEE754IEEE754Double
void---Void

所有数值都具有符号,无无符号的数值类型。

通过包装器类可以在堆中创建飞机杯类型对象。

BigInteger支持任意精度整数计算。

BigDecimal支持任意精度定点数计算,可精确计算货币。

数组对象

Java数组对象为引用数组,在创建数组对象时,每个引用都会被指向null,在使用任何饮用前需要将其指向特定的对象,null引用会触发异常。

对象生命周期:

作用域

java作用域限定了引用的作用范围,超出作用域后引用就消失了,但是new的对象(非基本数据类)还存在堆中。

{
	String s = new String("abc")
}

new的对象只要有需要,便会永远存在。

Java的垃圾回收机制会辨别分析哪些对象不会再被引用,从而将其销毁。

对象具有属性和方法

属性为对象内部数据

方法描述对象能做什么事情

方法可以接收参数,参数除了基本类型外,传递的是引用。

static关键字(类数据,类方法)

  • 为特定作用域分配单一储存空间,不考虑它会创建多少对象;
  • 需要某个方法,但是不与包含它的类的实例对象有任何关联,即使不实例化对象也可以通过类调用;
class StaticTest{
    static int i = 10;
}
StaticTest s1 = new StaticTest();
StaticTest s2 = new StaticTest();
s1.i++;
// 两个对象的i以及StaticTest.i 引用 指向同一块储存空间,值的变化相同。
class Incrementable{
    static void increment(){
        StaticTest.i++
    }
}

Incrementable.increment();
Incrementable ict = new Incrementable();
ict.increment();
// 两种方式调用的效果相同

statac方法可以用于创建或者使用与其类型相同的实例对象,可以作为牧羊人来看护同一类型的实例群。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值