工作之余,不知道要做些什么。该做的事情都完成的差不多了,想看一下spring的东西,毕竟这些东西用的多。但是又想看一下关于javaee的东西,这个里面的设计模式多。想了一会儿,觉得这些无非都是工具,java才是基础。突然想起了大学时候,老师推荐的《think in java》,之前看了一遍,懵懵懂懂,现在再看看,结合工作学习中的经验,或许能收获一些不同的东西。
(一)关于类和成员的访问权限
开篇写到了java类和成员的范围和访问权限,public, private ,protected, friendly。
前不久,在工作中,编写一个工具类,其中用到某个model的时候,无论如何,都会报错,提示此类不存在,建议建立一个新的类。当初以为编辑器除了问题,后来查看model类,才发现,原来类是这么定义的:
class mymodel{ .... }
这是个默认friendly的类,和我的工具类不在一个包下,所以访问不到这个类的,由此报错。
(二)关于继承
我们费尽心思做出一种数据类型后,假如不得不又新建一种类型,令其实现大致相同的功能,那会是一件非常令人灰心的事情。但若能利用现成的数据类型,对其进行“克隆”,再根据情况进行添加和修改,情况就显得理想多了。“继承”正是针对这个目标而设计的。但继承并不完全等价于克隆。
有两种做法可将新得的衍生类与原来的基础类区分开。第一种做法十分简单:为衍生类添加新函数(功能)。尽管extends关键字暗示着我们要为接口“扩展”新功能,但实情并非肯定如此。为区分我们的新类,第二个办法是改变基础类一个现有函数的行为。我们将其称作“改善”那个函数。
(三)向上转型()
这个东西,曾经困惑了很久,主要是因为这个东西用的实在是太少了。
结合书中的代码,我这里也写了一段,关于形状(Shape)和圆形的(Circle)。
package com.thinkinjava.unit1; public class Shape { public void move(Shape shape){ System.out.println(shape.getClass().getName()+", move ..."); } public void draw(Shape shape){ System.out.println(shape.getClass().getName()+", draw ...."); } public void doStuff(Shape shape){ shape.move(shape); shape.draw(shape); } }
这里规定了,通用的形状所具有的方法。
写一个Circle继承我们刚刚写的Shape:
package com.thinkinjava.unit1; public class Circle extends Shape { }
什么都没做,就是衍生了一个基础类(Shape)。
然后写一个main方法:
package com.thinkinjava.unit1; public class Main { public static void main(String[] args) { Circle circle=new Circle(); circle.doStuff(circle); } }
这样,实现上转型,即是书中说的 “上溯造型”。
这里的Circle circle=new Circle()可以写成Shape circle=new Circle(),一样的。但是后者很容易让人迷糊。
运行结果为:
com.thinkinjava.unit1.Circle, move ...
com.thinkinjava.unit1.Circle, draw ....
这个结构很鲜明,就是在方法中传递基础类类型,放入的参数类型,必须是继承自该基础类的。
说实话,这个技术的应用场景,至今也没有接触过。书中所说的,传递该基础类作为参数类型,是为了防止传入具体子类,要重新写更多的子类代码。
具体更加形象的应用场景,希望有明白的,能指教一下。
think in java 手记(一)