2011-5-16的笔记

   昨天没做笔记,因为是星期天,懒惰了。今天数看了30页左右,但做了挺多,因为我把现今自己的理解都写上去了,终于在断网前搞定(23:30断网)

  2011-05-16
1、了解static存在的意义,需了解只有它可解决的问题:
(1)、某个类的某个方法,他的方法体是不需变或者不能变,如Math.sqrt()、String.length()。此类方法只依赖于类本身,不管这类是否有对象。即在不创建类的对象情况下,可要求类自身来运行方法;
(2)、某个变量,用于记录类的对象的个数或者关于这个类所有对象的信息,用于记录一个常量,如PI、E。这两种情况也不依赖于对象,或言不能依赖与对象。如常量E,如果依赖对象的成员变量的话,只有在创建对象才能使用E,这怎么叫常量?
2、static成员是公有的,每个类的对象都可对它进行操作,且此操作会影响所有的其他对象;非静态成员变量却是每个类的对象都有的,对其操作不影响其他对象。
3、访问静态成员,只需标明静态成员所属的类即可,如要用到常量PI,只需写Math.PI就能代表PI;若在某类访问这个类的静态成员变量,更不需标明类名,如在Math用到PI,只需写PI就能代表PI。
4、静态方法不能使用this。因为this是指向对象的引用的,而静态方法时属于类的,类被引用即会加载静态方法。此时,对象是不一定存在的,即使存在,this也不知指向哪一个对象。
5、静态最终变量,或言常量的初始化有二方法:(1)声明变量的时候就初始化;(2)在什么变量之后,使用静态语句块static{}初始化。
6、const与goto的性质一样,只是作为一个关键字保留,以备扩张,无任何意义。
7、有类A,里面定义了protected变量a,类A的子类B以及B的测试类BTest在不同于类A的包中。B和BTest都调用了a。则在编译的时候只会在BTtest中报错。这说明,修饰为protected的成员被子类继承后,该成员对子类外的任何代码来说都相当于private。
8、父类的引用变量可以指向其直接或间接派生类(间接:比如A派生出B,B派生C,C派生D……则C、D……就是A的间接派生的类)的对象,反过来却不能,如:
              class Vehicle{}
              class Car extends Vehicle{}
              class Truck extends Car{}
可以这样来创建类的对象:
               Vehicle v=new Car();
               v=new Truck();
               Car c=new Truck();
这样的设定是有意义的:(1)实际意义。车辆v,v可以是汽车,也可以是卡车,就是说v所具有的行为属性汽车具有,卡车也具有;反过来,卡车t,不能说t是汽车,更不能说是车辆,因为t可以运载大量东西,车辆就不一定是。这符合实际中集合与集合元素之间的关系。(2)更灵活。拿着父类的引用可以指向不同的子类对象,来调用不同的子类实现,更灵活。
9、由8灵活性带来的“问题”:首先,设定如下情景:

  
 运行A_sonTest,会发现打印的是A,而不是A_son。这是因为,虽然父类的引用指向的是子类的对象,但系统有一个默认的机制:引用是什么类型,就访问那个类型的成员。所以这里类A的引用a指向了A_son的对象,打印的是类A的成员变量。要实现打印子类对象的成员,要加个强制转换语句:
                          System.out.print(((A_son)a).aMember);
即可。这里注意的问题是,强制转换的不是指向的对象(即a一直指向A_son的对象)而是引用类型(所以引用也是分类型的,不像C语言的指针是通用的),而后系统再次使用默认机制,打印了“A_son”。
10、为了验证9的正确性,我做了如下改动:


 编译之时,会报错。如果在加入强制转换语句,则可以运行,打印“A_son”。其实这也说明这个默认机制存在意义:区分父类、子类中同名的成员变量。
11、强制转换在多子类(子类是同级的)有一个问题,先设定如下:


 即,A派生出了两个没有任何联系的子类A_son1和A_son2。首先要明确的是,将A类型的引用a强制转换成其他无任何关系的引用类型是,编译会报错。而这里,将父类的引用a强制转换成子类2的类型,再赋给同为子类2的引用,编译不会报错。然而,运行却出错了……:
                               “ClassCastException: A_son1 cannot be cast to A_son2”
意为不能将子类1强制转换成子类2。这是因为,运行时系统是要看引用的对象的(言外之意是编译时不看),a指向的对象是子类1,而你却将a的引用类型强行转换成子类2。一个类的引用,指向的对象却是另一个与之毫无相干的类的对象,报错是必然的。从这里可以看出如下事实:
(1)强制转换只限于引用类型转换的层面。
(2)由于(1)以及编译过程不考虑引用的对象而运行时考虑,所以只有到运行时才能知道是否能进行强制转换。

 

 

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值