类和对象

Java支持面向对象的三大特征:封装、继承、多态,java提供了private、protect、public三个访问控制修饰符来实现
良好的封装,提供了extends关键字来让子类继承父类,子类继承父类将可以继承到父类的属性和方法,如果访问控制允许,
子类实例可以直接调用父类定义的方法。继承是实现类复用的重要手段,除此之外,也可以通过组合关系来实现这种复用,
从某种程度上来看,继承和组合具有相同的功能。使用继承关系来实现复用时,子类对象可以直接赋给父类变量,这个变量
具有多态性,编程更加灵活,而利用组合关系来实现复用的时候,则不具备这种灵活性。
构造器用于对类实例进行初始化操作,构造器支持重载,如果多个重载的构造器具有相同的代码块,则可以把这些初始化
代码放在普通初始化块里完成,初始化代码块总在构造器之前执行。除此之外,Java还提供了一种静态初始化块,静态的初始化
块用于初始化类,在类初始化阶段执行。如果继承树里的某一个类需要被初始化时,系统将会同时初始化这颗继承树里的所有类。


1.1 类和对象

Java是面向对象的程序设计语言,类是面向对象的重要内容,我们可以把类当成一种自定义数据类型,可以使用类定义变量
,这种类型的变量统称为引用型变量。也就是说,所有类是引用类型。

1.1.1 对象、引用和指针

Person p = new Person();
上面这行代码实际上产生了两个实体:一个是p变量,一个是Person对象。
Person类有两个属性,而属性是需要内存来存储的。因此,当创建Person对象时,必然需要有对应的内存来存储Person对象
的属性 :

name:tom
Person
age:20

Person对象由多块内存组成,不同内存分别存储了Person对象的不同属性。当把这个Person对象赋值给一个引用变量时,系统
会让这个引用变量指向这个对象。也就是说,引用型变量里存放的仅仅是一个引用,它指向实际的对象。
与数组类似,类也是一种引用数据类型,因此程序中定义的Person类型的变量实际上是一个引用,它被存放在栈内存里,它指向
实际的Person对象,而真正的Person对象则存放在堆内存中。 
栈内存里的引用变量并未真正存储对象里的属性数据,对象的属性数据实际存放在堆内存。引用型的变量与C语言里的指针很像
,它们都是存储一个地址值,通过这个地址值来引用到实际对象。实际上,Java里的引用就是C语言里的指针,只是Java语言吧这个
指针封装起来,避免开发者进行繁琐的指针操作。
当一个对象被创建成功之后,这个对象将保存在堆内存中,Java程序不允许直接访问堆内存中的对象,只能通过该对象的引用
操作该对象。也就是说不管是数组还是对象,都只能通过引用来访问他们。
p引用变量本身只存储了一个地址值,并未包含任何实际数据,但它指向实际的Person对象,当访问p变量的属性和方法时,
实际上市访问p所引用对象的属性和方法。
堆内存里的对象可以有多个引用,即多个引用变量指向同一个对象:如Person p2 = p; 
如上代码把p变量的值赋值给p2变量,也就是将p变量的保存地址值赋给p2变量,这样p2变量和p变量将指向堆内存里的同一个
Person对象。不管访问p2变量的属性值和方法还是访问p变量的属性值和方法,他们实际上访问的是同一个Person对象属性和
方法,返回相同的结果。
如果堆内存里的对象没有任何变量指向该对象,那么程序将无法再访问该对象,这个对象也就变成了垃圾,Java的垃圾回收
机制将会回收该对象,释放该对象所占的内存区。
因此,如果希望垃圾回收机制回收某个对象,只需切断该对象的所有引用变量和它之间的关系即可,也就是把这些引用变量
赋为null即可。

1.1.2 对象的this引用

Java提供了一个this关键字,是一个对象的默认引用。this总是指向调用该方法的对象。根据this出现位置的不同,this
作为对象的默认引用有两种情形:
构造器中引用该构造器执行初始化的对象
在方法中引用该方法的对象 

Java允许对象一个成员直接调用另一个成员,可以省略this前缀。大部分时候,一个方法访问相同实例的其他方法、属性时
加不加this前缀的效果都是一样的。
对于static修饰的方法而言,则可以用类来直接调用该方法,如果在static修饰的方法中使用this关键字,则这个关键字
就无法指向合适的对象。所以static修饰的方法不能使用this引用。由于static修饰的方法不能使用this引用,所以static
修饰的方法不能访问不使用static修饰的的普通成员,这与静态成员不能直接访问非静态成员的结论是一致的。
在静态方法中不能直接调用飞静态方法,因为系统相当于使用this作为该方法的调用者,而static修饰的方法中不能使用this
引用。如果确实需要在一个静态方法中调用非静态方法,则只能重新创建一个对象。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值