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

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

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

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

最新文章

  1. Mysql服务启动的时候 如何加载配置文件
  2. Google Authenticator
  3. Prim算法(一)之 C语言详解
  4. 如何观察JS的事件队列的执行划分
  5. ExtJS笔记 Grids
  6. [超简洁]EasyQ框架-应对WEB高并发业务(秒杀、抽奖)等业务
  7. The type javax.servlet.http.HttpServletRequest cannot be resolved.
  8. 非常简洁的js图片轮播
  9. Coding使用方法
  10. virtualenv安装及使用
  11. JS33个概念
  12. Angular 基本指令
  13. 13. 字符串转为json对象或json数组
  14. scala spark 聚类
  15. 用Hadoop构建电影推荐系统
  16. 信息安全C散列函数的应用及其安全性2016011992
  17. C++中的动态绑定
  18. [hadoop][会装]HBase集群安装--基于hadoop ha模式
  19. LCA+差分【CF191C】Fools and Roads
  20. C#进阶之路(六):表达式进行类的赋值

热门文章

  1. clear(), evict(), flush()三种方法的用法实例
  2. poj3666(DP+离散化)
  3. 第五章 二叉树(a)树
  4. Coding Contest(费用流变形题,double)
  5. 关于jni调用报UnsatisfiedLinkError的可能
  6. iOS - OC - 字典快速遍历
  7. iOS - 上架的APP 生成二维码下载
  8. nginx反向代理架构与安装配置(一)
  9. 全基因组测序 从头测序(de novo sequencing) 重测序(re-sequencing)
  10. OAuth 2.0 学习