Java小试牛刀3

[align=center][size=xx-large][b]Java小试牛刀3[/b][/size][/align]

[size=large]1、为什么在面向对象程序中,调用类的成员方法可以操作该类的属性?[/size]
答:1)、在一个类中无论属性的访问修饰成什么(例如最低访问修饰private),只要是成员方法的局域之外,都能被所有成员方法操作,当然如果属性是定义在方法局部之内,其它方法是有能访问到的。
2)、正是因为上一个特点,所以我们可以通过调用类的成员方法来操作该类的,其实这是通过间接的方式来操作其它类中的方法,而非直接操作其它类的属性;但这里有一个前提是,类中的方法是可见的,如果不可见谈何操作类的属性呢!

[img]http://dl.iteye.com/upload/attachment/0084/3792/3d91f786-c7ab-3a34-b053-7606c00278b9.jpeg[/img]


[size=large]2、Object类中所有方法重写的意义?[/size]
答:这里只是通过一个普通类举例,与重写Object类的意义相同。
1)、重写的前提是有继承。
2)、重写可以修改父类已有的方法:
首先,修改方法的目的可以是扩展父类的方法功能;例如:Student类的对象有一个paly()方法,那么当College继承Student之后,我们可以重写父类Student中的paly()这个方法,这样就相当于扩展了paly()方法的功能。
另外,修改父类方法可以屏蔽父类中的方法;例如:把paly()重写后,方法体不写任何内容,这样paly()方法就没有任何作用了。

[img]http://dl.iteye.com/upload/attachment/0084/3794/1ea89ab2-5af2-3453-893a-38e23023a4a8.jpeg[/img]


[size=large]3、抽象类中的方法可不可以实例化(有声明、有定义)?[/size]

[img]http://dl.iteye.com/upload/attachment/0084/3796/a909bf3c-18b6-3ceb-a9ed-8d7117918d31.jpeg[/img]

通过实例证明抽象类中的普通方法可以声明和定义,但是抽象方法是不可以实现方法体,只能声明;同时抽象类是不能直接创建对象,就如上图所示,编辑器会提示错误!

[size=large]4、验证main()、静态代码块、初始化代码块哪个执行次序?[/size]

[img]http://dl.iteye.com/upload/attachment/0084/3798/ba18ce81-67af-3dee-9b54-3e557785a250.jpeg[/img]

通过实例验证静态代码块及静态变量比main()先,也发现在静态代码块和静态变量中不能使用类中其它普通成员变量值,从而也间接的证明,静态代码块和静态变量比普通变量和main()要先执行。

[size=large]5、实现一个单件模式的类:[/size]
[img]http://dl.iteye.com/upload/attachment/0084/3800/66bf29e1-91e8-38f7-b038-770fe454c722.jpeg[/img]

[size=large]6、访问修饰符[/size]
1.transient 关键字
首先是JAVA的序列化,简单来说就是将某一个类存储以文件形式存储在物理空间,下次再从本地还原的时候,还可以将它转换回来,这种形式便利了网络上的一些操作。
序列化只能保存对象的非静态成员交量,不能保存任何的成员方法和静态的成员变量,而且串行化保存的只是变量的值,对于变量的任何修饰符都不能保存。
以文件形式描述某些信息时,容易涉及到安全问题,因为数据位于Java运行环境之外,不在Java安全机制的控制之中。对于这些需要保密的字段,不应保存在永久介质中,或者不应简单地不加处理地保存下来 ,为了保证安全性。应该在这些字段前加上transient关键字。它的意思是临时的,即不会随类一起序列化到本地,所以当还原后,这个关键字定义的变量也就不再存在。
如果TransTest 类的一个对象被序列化,i的内容不被保存,但j的将被保存。
Java代码
class TransTest {
transient int i; //不需要保存
int j; //需要保存

2. volatile关键字 不常用

Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。
这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。
而volatile关键字就是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。
使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。
由于使用volatile屏蔽掉了VM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。

3、Synchronize 关键字
先提出问题,如果开启多线程同时操作同一实例变量,Thread-0线程从主内存中取出的值a 为 1,然后a++; Thread-1线程也从主内存中取出的值 a 进行 a+=2操作;Thread-0存入2到主内存中,Thread-1也存入,这样就覆盖了Thread-0存入的值.
原因是在JAVA 的内存模型中,是每一个进程都有一个主内存,每个线程都有自己的内存,线程从主内存取得数据,计算后再存回到主内存中.
解决这个问题就可以使用 synchronize关键字.
使用synchronized修饰此方法后,把下面的这几个步骤当作一个原子操作:取数据,操作数据,存数据。原子操作是不能够被打断的,所以就保证了数据的一致性,这样在同一时间有线程再执行,虽然在效率上比较有影响,但是能够保证在同一时间只有一个线程能够访问到这一块内存单元。

[size=large]7、为什么final不能修饰构造方法?[/size]

final使得被修饰的变量"不变",但是由于对象型变量的本质是“引用”,使得“不变”也有了两种含义:引用本身的不变,和引用指向的对象不变。那么如果用final来修饰构造方法是没有意义的。

[img]http://dl.iteye.com/upload/attachment/0084/3802/8d7350eb-9dcc-33a8-abf4-ef3848006ad3.jpeg[/img]


[size=large]8、Visio画图[/size]

[img]http://dl.iteye.com/upload/attachment/0084/3804/7ce8c997-cc55-3038-9588-25239dd8f3b4.jpeg[/img]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值