工作之余,不知道要做些什么。该做的事情都完成的差不多了,想看一下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 手记(一)的更多相关文章

  1. JAVA手记 JAVA入门(安装+Dos下运行)

    JAVA入门特供= =,今天设置环境变量后用dos运行的时候发现出现“找不到或无法加载主类”,索性查了些资料重新看了看JAVA入门的部分. 声明:我的笔记本暂时用的是Win10系统,Windows其他 ...

  2. Java手记

    由于腾讯的MTA只有JAVA的demo,为了测试用php实现的加密算法是否正确,所有只能运行一下Java 配置环境:http://www.runoob.com/java/java-environmen ...

  3. 【java手记】------------------------java中转发和重定向区别

    转发: request.getRequestDispatcher("success.jsp").forward(request,response); 在服务器组件收到用户请求后.经 ...

  4. 设计模式课程 设计模式精讲 6-2 抽象工厂coding

    1 代码讲解 1.1 抽象工厂优点 1.2 抽象工厂缺点 1.3 为何有产品族的业务场景宜用抽象工厂设计模式?而不是工厂设计模式? 2 代码演练 2.1 抽象工厂代码演练 1 代码讲解 1.1 抽象工 ...

  5. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  6. Java小白手记2:一些名词解释

    看到<Java 征途:行者的地图> ,这是一篇有关java学习路径文章.对我等Java小白有指引作用.里面提到了一些基本的名词术语,有些我知道,有些不知道,再补上一些自己曾觉得模糊的,记录 ...

  7. 微冷的雨Java基础学习手记(一)

    使用Java理解程序逻辑 之凌波微步 船舶停靠在港湾是很安全的,但这不是造船的目的 北大青鸟五道口原玉明老师出品 1.学习方法: 01.找一本好书 初始阶段不适合,可以放到第二个阶段,看到知识点时,要 ...

  8. Java学习手记2——多线程

    一.线程的概念 CPU执行程序,就好比一个人在干事情一样,同一个时间你只能做一件事情,但是这样的效率实在是太低了,在你用电脑的时候,听歌就不能浏览网页,看电影就不能下载视频,你想想是不是很蛋疼. 所以 ...

  9. Java学习手记1——集合

    一.什么是集合 集合是对象的集合,就像数组是数的集合.集合是一种容器,可以存放对象(可以是不同类型的对象). 二.集合的优点(为什么要用集合) 当然,在java里,可以使用数组来存放一组类型相同的对象 ...

随机推荐

  1. while循环出现的问题

    1 int c = 0; while(c<=100) c++ } 自己看了很久没看出来,后来请教同学才知道,变量g是不能写在一开始的,因为while循环只是循环自己的那个花括号内的指令,不会循环 ...

  2. ECMAScript5新特性之获取对象特有的属性

    'use strict'; // 父类 function Fruit(){ } Fruit.prototype.name = '水果'; // 子类 function Apple(desc){ thi ...

  3. 使用ASP.NET AJAX 从脚本中调用Web 服务的应用方法

    技能点:通过编写WebService,在页面js中调用WebService来进行数据查询. 网站开发,有些时候需要使用js在页面动态生成一些内容,但还有些数据要通过查询数据库才能获取的. 但由于诸如主 ...

  4. leetcdoe 175. Combine Two Tables

    给定两个表,一个是人,一个是地址,要求查询所有人,可以没有地址. select a.FirstName, a.LastName, b.City, b.State from Person as a le ...

  5. 1-QT-文件操作

    Qt文本文件的读写操作 Qt文件操作详解(创建.写入.删除.INI.XML文件等 二进制文件的读写文件可以使用QFile类.QStream文本文件的读写建议使用QTextStream类,它操作文件更加 ...

  6. 骗分大法之-----分块||迷之线段树例题a

    什么是分块呢? 就是一种可以帮你骗到不少分的神奇的算法. 分块的写法有几种,我所知道的有①预处理②不预处理 不预处理的代码我看得一脸懵逼 所以我在这里就谈一下预处理的版本www 首先看一道题: 给定一 ...

  7. [Usaco2009 Dec]Toll 过路费

    题面: 跟所有人一样,农夫约翰以着宁教我负天下牛,休教天下牛负我(原文:宁我负人,休教人负我)的伟大精神,日日夜夜苦思生财之道.为了发财,他设置了一系列的规章制度,使得任何一只奶牛在农场中的道路行走, ...

  8. 如何用Mockplus快速做一个手风琴菜单?

    手风琴菜单是一种比较常用的菜单形式,利用原型工具来做这种菜单通常要用到中继器.即使是功能强大的Axure,想实现该效果也比较麻烦.但如果你对Mockplus有所了解,你一定知道,利用Mockplus的 ...

  9. centos 6.5 安装mysql

    步骤1: yum -y install mysql-server 步骤2: chkconfig mysqld on 步骤3: service mysqld start mysql -u root se ...

  10. WebService安全加密

    众所周知,WebService访问API是公开的,知道其URL者均可以研究与调用.那么,在只允许注册用户的WebService应用中,如何确保API访问和通信的安全性呢?本文所指的访问与通信安全性包括 ...