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 ....
这个结构很鲜明,就是在方法中传递基础类类型,放入的参数类型,必须是继承自该基础类的。
说实话,这个技术的应用场景,至今也没有接触过。书中所说的,传递该基础类作为参数类型,是为了防止传入具体子类,要重新写更多的子类代码。
具体更加形象的应用场景,希望有明白的,能指教一下。
think in java 手记(一)的更多相关文章
- JAVA手记 JAVA入门(安装+Dos下运行)
JAVA入门特供= =,今天设置环境变量后用dos运行的时候发现出现“找不到或无法加载主类”,索性查了些资料重新看了看JAVA入门的部分. 声明:我的笔记本暂时用的是Win10系统,Windows其他 ...
- Java手记
由于腾讯的MTA只有JAVA的demo,为了测试用php实现的加密算法是否正确,所有只能运行一下Java 配置环境:http://www.runoob.com/java/java-environmen ...
- 【java手记】------------------------java中转发和重定向区别
转发: request.getRequestDispatcher("success.jsp").forward(request,response); 在服务器组件收到用户请求后.经 ...
- 设计模式课程 设计模式精讲 6-2 抽象工厂coding
1 代码讲解 1.1 抽象工厂优点 1.2 抽象工厂缺点 1.3 为何有产品族的业务场景宜用抽象工厂设计模式?而不是工厂设计模式? 2 代码演练 2.1 抽象工厂代码演练 1 代码讲解 1.1 抽象工 ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- Java小白手记2:一些名词解释
看到<Java 征途:行者的地图> ,这是一篇有关java学习路径文章.对我等Java小白有指引作用.里面提到了一些基本的名词术语,有些我知道,有些不知道,再补上一些自己曾觉得模糊的,记录 ...
- 微冷的雨Java基础学习手记(一)
使用Java理解程序逻辑 之凌波微步 船舶停靠在港湾是很安全的,但这不是造船的目的 北大青鸟五道口原玉明老师出品 1.学习方法: 01.找一本好书 初始阶段不适合,可以放到第二个阶段,看到知识点时,要 ...
- Java学习手记2——多线程
一.线程的概念 CPU执行程序,就好比一个人在干事情一样,同一个时间你只能做一件事情,但是这样的效率实在是太低了,在你用电脑的时候,听歌就不能浏览网页,看电影就不能下载视频,你想想是不是很蛋疼. 所以 ...
- Java学习手记1——集合
一.什么是集合 集合是对象的集合,就像数组是数的集合.集合是一种容器,可以存放对象(可以是不同类型的对象). 二.集合的优点(为什么要用集合) 当然,在java里,可以使用数组来存放一组类型相同的对象 ...
随机推荐
- print 不换行
[print 不换行] 参考:http://zhidao.baidu.com/link?url=-qC2RyT5_GWzW_N-SyqJYgegVt2sSXwmMWGvHfk_4MjErhm_Pj23 ...
- 在c#下用 WCF编写restful
1.添加WCF服务库 2.在global里面注册路由 RouteTable.Routes.Add(new ServiceRoute("api", new WebServiceHos ...
- 第八章 高级搜索树 (a1)伸展树:逐层伸展
- 38. Count and Say (String; DP)
The count-and-say sequence is the sequence of integers beginning as follows:1, 11, 21, 1211, 111221, ...
- 【英宝通Unity4.0公开课学习 】(五)47讲到75讲
不知不觉今天都已经看了快30讲了,虽然很想快马加鞭地将后面的内容看完,但为了学习的质量,还是挺下来写一篇blog :) 这两天有些昏昏沉沉的,但感觉生活还安排得不错,原因找去找来觉得是没怎么开窗透气. ...
- ECMAScript6新特性之Array API
一 填充数组 var arr = new Array(5); arr.fill('abc',2,4); console.log('Array.prototype.fill',arr); // [und ...
- SVN客户端的安装和使用
----------------------siwuxie095 SVN 客户端的安装 1.SVN 客户端,选择 TortoiseSVN,下载链接: https://tortoisesvn.net/d ...
- hreeJS加载Obj资源后如何实现内存释放?
问题: 我利用ThreeJS做了一个在同一个场景下动态加载Obj的页面,具体功能是:点击按钮A:加载A模型,点击按钮B:加载B模型...现在的问题是,前面已经加载过的模型,无法实现释放,内存一直在累加 ...
- PAT 1058 选择题(20)(代码+思路)
1058 选择题(20 分) 批改多选题是比较麻烦的事情,本题就请你写个程序帮助老师批改多选题,并且指出哪道题错的人最多. 输入格式: 输入在第一行给出两个正整数 N(≤ 1000)和 M(≤ 100 ...
- spring mvc leaning
解读 web.xml文件 <servlet>-----配置前端控制器的servlet <servlet-name>springMVC</servlet-name> ...