java核心技术学习笔记6---对象和类

OOP(Object Oriented Programming)即面向对象程序设计。

OOP中的对象

对象的三个主要特性:

对象的行为――可以对对象施加哪些操作,或可以对对象施加哪些方法。

对象的状态――当施加那些方法时,对象如何响应。

 对象的标识――如何区分具有相同行为与状态的不同对象。

 

OOP基本特性

封装(encapsulation):  也称数据隐藏。对象中的数据被称为实例域,操纵数据的过程被称为方法,对于每个特定的类对象实例都有一组特定的实例域值。这些值的集合就是这个对象的当前状态。实现封装的关键在于绝不能让类中的方法直接访问其他类的实例域,但可以访问自己的实例域。封装给予对象黑盒特性,这是提高可靠性和重用性的关键。

继承: 殊类的对象拥有其一般类的全部属性与行为,称作特殊类对一般类的继承。其中一般类称为父类(基类、超类),特殊类称为子类(派生类、导出类)。java不支持多继承。

多态:一个对象的多种形态。多态有编译期多态与运行期多态两种。

抽象:将实际待解问题的模型(位于“问题空间”内,这是问题存在的地方,例如一项业务)变为机器模型(位于“解空间”内,这是你对问题建模的地方)的过程。在Java中抽象的结果就是类。可以把抽象分为行为抽象与特征(数据)抽象。

 

类之间的关系

在类之间,最常见的关系有以下三种:

 依赖(user-a)。订单的支付方法需要使用账户类的对象,那么我们说订单类依赖账户类。体现在类的方法于其参数类型或者方法内部的局部变量类型。

 关联(has-a)。每个用户都有自己的帐户,那么我们说用户关联一个账户。体现在类与其属性。

继承(is-a)。加急订单是一种特殊的订单,那么我们说加急订单继承于订单。体现在子类与父类。

 

类的主要组成部分

构造器(又叫构造方法或构造函数)、属性(又叫实例域、成员变量或成员数据)、方法(又叫实例方法或成员函数)。

 

构造器

创建一个对象需要new关键字及构造器。你无法向一个对象施加操作(例如调用它的方法),而是通过对象的引用来操作对象。每一个对象引用都应该有一个对应的对象实体。

 

定义构造器:

1)构造器需与类名相同。

2)每个类可以有一个以上的构造器。

3)构造器可以有0个,1个,或多个参数。

4)构造器没有返回值。

5)构造器总是伴随着new操作符一起使用。

 

构造器作用

new是通知JVM,根据构造器说明的类图创建一个空白对象。空白对象的属性被赋予默认值。然后执行构造器内容。构造器的作用是初始化对象,初始化对象就是给对象的属性初始化。因为构造器总是要和new一起使用,所以可以理解为构造器会隐式的为所有属性赋予默认值。

当一个类没有提供任何构造器时,编译器会为其提供一个默认构造器。默认构造器没有参数,并且方法体内没有任何语句。若一个类提供了构造器,就没有该默认构造器。

 

属性

属性是类存储数据的载体,它可以表示一个对象的状态。同一个类的对象,其属性的类型及个数是相同的,但它们都有自己的一份拷贝。属性的类型可以基本类型,也可以是引用类型。

 

构造器会为属性赋予默认值:

 数值类型(byte、short、int、long、float、double)的默认值为0。

 字符类型(char)的默认值为’\0’。

逻辑类型(boolean)的默认值为false。

引用类型(非基本类型)的默认值为null。

一般将属性设置为私有的,再为其添加一个访问器方法和更改器方法以保证封装性。

 

方法

方法有实例方法和静态方法之分。实例方法需要通过实例对象调用,静态方法用static修饰,可以直接通过类名调用,也可以通过对象调用,建议使用类名直接调用。

 

对象的创建和生命周期

对象一旦创建,就会占用一定的内存空间,最终需要销毁它,不然所有对象都常驻内存会出现内存泄漏。对象数据的存储位置决定了其生命周期的特点。

C++注重效率控制,将对象置于堆栈中或静态存储区域内来实现,编译器可以确定对象的存活时间,创建存储空间和释放存储空间通常个需要一条汇编指令即可,分别对应将栈顶指针向下移动和将栈顶指针向上移动。这种方式将存储空间分配和释放置于优先考虑的而为之,但牺牲了灵活性,必须通过编程方式来确定何时销毁对象,这可能会因为不能正确处理而导致内存泄露。

java采用动态分配内存的方式创建对象,即在被称为堆的内存池中动态的创建对象。这种方式下,存储空间是在运行时被动态管理的,所以需要大量的时间在堆中分配存储空间。但当对象趋向于复杂,查找和释放存储空间的开销不会对对象的创建造成很大的冲击。另外,对于对象的生命周期,编译器对其一无所知,java提供了垃圾回收机制,可自动发现对象何时不再被使用,并自动释放对象占用的内存。

垃圾回收器并不是在出现“垃圾”时立即工作,如果Java虚拟机(JVM)并未面临内存耗尽的情形,它是不会浪费时间去执行垃圾回收以恢复内存的。原因是垃圾回收本身也会消耗很大的资源。所以你并不能确定垃圾回收器在什么时候工作,甚至你的程序到结束都没有占用大量内存,而使垃圾回收器从未执行过。

垃圾回收器只回收Java自己创建的对象所占用的内存空间,而不能回收其它语言所占用的内存空间。垃圾回收器也不能回收内存以外的资源,例如数据库连接、IO流等。这些资源你需要手动关闭。

如果有需要,你可以调用System.gc()方法请求垃圾回收器马上工作。过于频繁的调用该方法会使你的程序性能降低。

每个类都可以声明一个名字为finalize()的方法,垃圾回收器会在回收对象之前调用该对象的finalize()方法。但你不能依赖finalize()方法为你做什么,因为你无法确定垃圾回收器什么时候工作,所以你也无法确定finalize()方法方法什么时候会被调用。基本上你不需要finalize()方法做什么,只有一些特殊情况下才会用上finalize()方法。例如调用本机方法释放其它语言使用的内存

 

实例化对象的过程

设有一个Person类

1.当首次创建类型为Person的对象时,或者Person类的静态方法/静态域首次被访问时,java解释器必须查找类路径,以定位Person.class文件。

2.(类的加载分为显示加载与隐示加载。隐示加载发生在类的代码的初始使用,类的隐式加载生成在类第一次第使用的时候,例如创建第一个对象,或者第一次访问类的static属性或方法时。显示加载需要使用Class类的静态方法forName()。)

无论是显示还是隐示加载,JVM都会通过classpath找到要加载的.class文件,并把.class文件的内容加载到内存。

JVM载入.class(这将创建一个Class对象),并把.class文件的内容加载到内存。一旦一个类被加载之后,就无需再次加载。JVM加载类时,为类的静态属性分配存储空间。然后初始化静态属性,以及执行静态初始化块,静态初始化只在Class对象首次加载的时候进行一次。

3.当用new 创建对象时,首先将在堆上为Person对象分配足够的存储空间。

4.这块存储空间会被清零,这就自动地将Person对象中的所有基本类型数据都设置成了默认值,引用则被设置为null。

5.执行所有出现于字段定义处的初始化动作。

6.执行构造器。若构造器使用this调用本类其他构造器,说明这个构造器把工作委派给本类其他构造器,但最终会有一个构造器完成工作,这个完成工作的构造器会首先调用弗雷的构造器来初始化父类子对象。

子类的对象都有一个子对象,这个子对象的类型是该对象的父类类型,所以实例化子类对象时,第一件事就是先实例化子对象,因此,实例化对象时,JVM首先加载其父类。

若父类没有无参构造器,而在子类中也没有显示调用父类的构造器(说明隐式调用父类无参构造器),编译将不会通过,应该用super关键字显示指出调用的父类构造器。

 

static关键字

Static关键字可以用来修饰属性、方法。所有用static修饰的属性或方法都与this(当前实例对象)无关。

修饰属性称为静态属性(或类属性),可通过类名直接访问。

修饰方法称为静态方法(或类方法),方法中不能使用this关键字,类方法是类的方法,而不是某个对象的方法,使用类名来调用。所以无法传递当前对象给this,就算是使用对象调用也不能传递当前对象给this。

 

this的用法

this关键字代表本类的当前对象,当你用a对象调用方法时,当前对象就是a。对象a本身就是一个隐示参数。this有三种用法:

this可以引用实例属性,它表示当前对象的属性。如果不使用this引用属性,默认与使用this相同。如果在方法或构造器内有局部变量与属性同名时,引用属性必须使用this。在不使用this时,表示引用的是局部变量。

this可以引用方法,它表示当前对象的方法。例如:在MyClass类的构造器中调用display()方法。如果不使用this引用方法,默认与使用this相同。

this可以引用构造器,它只能在构造器中的第一句出现。它表示委托另一个构造器来完成对象的初始化工作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值