think in java 手记(一)

工作之余,不知道要做些什么。该做的事情都完成的差不多了,想看一下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 ....

这个结构很鲜明,就是在方法中传递基础类类型,放入的参数类型,必须是继承自该基础类的。

说实话,这个技术的应用场景,至今也没有接触过。书中所说的,传递该基础类作为参数类型,是为了防止传入具体子类,要重新写更多的子类代码。

具体更加形象的应用场景,希望有明白的,能指教一下。

原文地址:https://www.cnblogs.com/juepei/p/3873596.html