《Thinking in Java》 10~
chapter 10 内部类(P191)
创建内部类
链接到外部类
内部类能访问器外围对象的所有成员,而不需要任何特殊条件。
使用.this与.new
package cn.test; public class DotThis {
void f() {
System.out.println("DotThis.f()");
}
public class Inner{
public DotThis outer() {
return DotThis.this;
}
}
public Inner inner() {
return new Inner();
}
public static void main(String[] args) {
DotThis dt = new DotThis();
DotThis.Inner dti=dt.inner();
dti.outer().f();
}
}
package cn.test; public class DotNew {
public class Inner{}
public static void main(String[] args) {
DotNew dn = new DotNew();
DotNew.Inner dni = dn.new Inner();
}
}
为什么需要内部类
为了实现多重继承。
情形1:必须在一个类中以某种方式事项两个接口。由于接口的灵活性,有两种选择:使用单一类,或使用内部类。
package cn.test;
interface A {}
interface B {}
class X implements A,B{}
class Y implements A{
B makeB() {
return new B() {};
}
}
public class MultiInterfaces {
static void takesA(A a) {}
static void takesB(B b) {}
public static void main(String[] args) {
X x = new X();
Y y = new Y();
takesA(x);
takesA(y);
takesB(x);
takesB(y.makeB());
}
}
package cn.test;
class D{}
abstract class E{}
class Z extends D{
E makeE() {
return new E() {};
}
}
public class MultilImplementation {
static void takesD(D d) {}
static void takesE(E e) {}
public static void main(String[] args) {
Z z = new Z();
takesD(z);
takesE(z.makeE());
}
}
闭包与回调
内部类标识符
外围类的名字,加上“$”,再加上内部类的名字。
chapter 11 持有对象
泛型和类型安全的容器
通过使用泛型 ,可以在编译期防止将错误类型的对象放置到容器中(报编译期错误)。
基本概念
- Collection (List Set Queue)
- Map
迭代器
Iterator
ListIterator
Stack
"栈"是“先进后出”的容器。
LinkedList具有能够直接实现栈功能的方法。
Queue
队列是先进先出的容器。
Foreach 与 迭代器
chapter 12 通过异常处理错误
栈轨迹
Java 标准异常
chapter 13 字符串
不可变String
String对象是不可变的。
重载 "+" 与 StringBuilder
对String的“+”操作,是通过中间对象StringBuilder的append方法,String引用最终执行操作后的字符串对象。
package cn.test;
public class WhitherStringBuilder {
public String implicit(String[] fields) {
String result="";
for(int i=0;i<fields.length;i++)
result+=fields[i];
return result;
}
public String explicit(String[] fields) {
StringBuilder result=new StringBuilder();
for(int i=0;i<fields.length;i++)
result.append(fields[i]);
return result.toString();
}
}
反编译:
public class WhitherStringBuilder
{ public WhitherStringBuilder()
{
} public String implicit(String fields[])
{
String result = "";
for (int i = 0; i < fields.length; i++)
result = (new StringBuilder(String.valueOf(result))).append(fields[i]).toString();
//在for循环内创建StringBuilder对象;
return result;
} public String explicit(String fields[])
{
StringBuilder result = new StringBuilder();
for (int i = 0; i < fields.length; i++)
result.append(fields[i]); return result.toString();
}
}
格式化输出
package cn.test; public class SimpleFormat {
public static void main(String[] args) {
int x=5;
double y=4.333333;
System.out.printf("Row 1:[%d,%f]\n",x,y);
System.out.format("Row 1:[%d,%f]\n",x,y);
}
}
正则表达式
API:boolean matches(String string)
chapter 14 类型信息
在运行时识别对象和类的信息:
1.RTTI,编译时知道所有的类型
2.反射机制,在运行时发现和使用类的信息
理解动态绑定。
package cn.test; import java.util.Arrays;
import java.util.List; abstract class Shape{
void draw() {
System.out.println(this+".draw()");
}
abstract public String toString();
}
class Circle extends Shape{
public String toString() {
return "Circle";
}
}
class Square extends Shape{
public String toString() {
return "Square";
}
}
class Triangle extends Shape{
public String toString() {
return "Triangle";
}
}
public class Shapes {
public static void main(String[] args) {
List<Shape> shapeList=Arrays.asList(new Circle(),new Square(),new Triangle());
for(Shape shape:shapeList) {
shape.draw();
}
}
}
源码:
public class Shapes
{ public Shapes()
{
} public static void main(String args[])
{
List shapeList = Arrays.asList(new Shape[] {
new Circle(), new Square(), new Triangle()
});
Shape shape;
for (Iterator iterator = shapeList.iterator(); iterator.hasNext(); shape.draw())
shape = (Shape)iterator.next(); }
}
Class 对象
类字面常量
动态的instanceof
注册工厂
反射:运行时的内信息
类方法提取器
动态代理
代理模式案例:
package cn.test;
interface Interface{
void doSomething();
void somethingElse(String arg);
}
class RealObject implements Interface{
public void doSomething() {
System.out.println("doSomething!");
}
public void somethingElse(String arg) {
System.out.println("somethingElse"+arg);
}
}
class SimpleProxy implements Interface{
private Interface proxied;
public SimpleProxy(Interface proxied) {
this.proxied=proxied;
}
@Override
public void doSomething() {
System.out.println("doSomething!");
proxied.doSomething();
}
@Override
public void somethingElse(String arg) {
System.out.println("SimpleProxy somethingElse"+arg);
proxied.somethingElse(arg);
}
}
public class SimpleProxyDemo {
public static void consumer(Interface iface) {
iface.doSomething();
iface.somethingElse("bonobo");
}
public static void main(String[] args) {
// consumer(new RealObject());
consumer(new SimpleProxy(new RealObject()));
}
}
动态代理:
package cn.test; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; class DynamicProxyHandler implements InvocationHandler{
private Object proxied; public DynamicProxyHandler(Object proxied) {
super();
this.proxied = proxied;
} @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("**** proxy: "+proxy.getClass()+",method: "+method +". args: "+args);
if(args != null) {
for(Object arg : args) {
System.out.println(" "+arg);
}
}
return method.invoke(proxied, args);//反射
} }
public class SimpleDynamicProxy {
public static void consumer(Interface iface) {
iface.doSomething();
iface.somethingElse("bonobo");
}
public static void main(String[] args) {
RealObject real = new RealObject();
// consumer(real);
Interface proxy = (Interface)Proxy
.newProxyInstance(Interface.class.getClassLoader(),new Class[] {Interface.class}, new DynamicProxyHandler(real));
// Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h);
consumer(proxy);
}
}
空对象
chapter 15 泛型
一个元组内库
泛型方法
定义泛型方法,需要将泛型参数列表置于返回值之前:
public class GenericMethods {
public <A,B> void f(A a,B b) {
System.out.println(a.getClass().getName()+","+b.getClass().getName());
}
public static void main(String[] args) {
GenericMethods gm = new GenericMethods();
gm.f("",1);
gm.f(1,12);
gm.f(1.0,1);
gm.f(1.0F,1);
gm.f('c',1);
gm.f(gm,1);
}
}
《Thinking in Java》 10~的更多相关文章
- 《Play for Java》学习笔记(一)项目框架
从今天开始认真复习<Play for JAVA>,该书以一个案例为主线,以前为应付项目马马虎虎看了一遍,好多地方都不明白!现在跟着这本书再走一遍,认真模拟,当做一个项目啦!! 一.Play ...
- 《图书管理系统——java》
/* (程序头部凝视開始) * 程序的版权和版本号声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved. * 文件名: < ...
- 读书笔记 之《Thinking in Java》(对象、集合)
一.前言: 本来想看完书再整理下自己的笔记的,可是书才看了一半发现笔记有点多,有点乱,就先整理一份吧,顺便复习下前面的知识,之后的再补上. 真的感觉,看书是个好习惯啊,难怪人家说"书籍是人类 ...
- 《Head First Java》读书笔记(1) - Java语言基础
<Head First Java>(点击查看详情) 1.写在前面的话 这本书的知识点说实话感觉有点散乱,但是贵在其将文字转换成了生动和更容易接受的图片,大量的比喻让人感受到了知识点的有趣之 ...
- 《Thinking In Java》阅读笔记
<Thinking In Java>阅读笔记 前四章:对象导论. 一切都是对象. 操作符. 控制执行流程 public在一个文件中只能有一个,可以是一个类class或者一个接口interf ...
- 读书笔记 之《Thinking in Java》(对象、集合、异常)
一.前言 本来想看完书再整理下自己的笔记的,可是书才看了一半发现笔记有点多,有点乱,就先整理一份吧,顺便复习下前面的知识,之后的再补上. 真的感觉,看书是个好习惯啊,难怪人家说“书籍是人类进步的阶梯” ...
- 《Thinking in Java》习题——吸血鬼数字
最近在看<Java编程思想>,这本书非常棒,不愧是Java程序员的圣经.看到第四章,后面有道题目很有意思,于是就自己做了做.
- 201571030332 扎西平措 《面向对象程序设计Java》第八周学习总结
<面向对象程序设计Java>第八周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https: ...
- 【书海】《Head First Java》 ——读后总结
<Head First Java> 中文版 (第二版) IT`huhui前言录 <Head First Java>这本书我不算特别细的看了一遍.认为十分适合初学者,甚至是没接触 ...
随机推荐
- postgresql 9.5 pgpool 主从复制 以及错误解决
PostgreSQL+pgpool-II复制方案 这里不做功能的描述,只写搭建的过程和遇到的一些问题 1 系统 [root@mysqlhq ~]# cat /etc/redhat-release Ky ...
- Java多线程总结【转】
多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的. 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程 ...
- Py修行路 python基础 (十一)迭代器 与 生成器
一.什么是迭代? 迭代通俗的讲就是一个遍历重复的过程. 维基百科中 迭代(Iteration) 的一个通用概念是:重复某个过程的行为,这个过程中的每次重复称为一次迭代.具体对应到Python编程中就是 ...
- Julia - 变量
变量的赋值 julia> a = 1 # 把 10 赋给变量 a 1 julia> a + 1 # 变量 a 的值加 1 2 julia> a = 4 # 重新赋值给变量 a 4 j ...
- DDD学习笔录——提炼问题域之与领域专家一起获得领域见解
业务和开发团队之间的协作是DDD必不可少的部分,并且它是处于开发阶段的产品获得成功的关键. 领域专家指的是那些从业务领域的政策和工作流程到棘手处和特性都具有深刻理解的人.能够为你的问题区域提供深刻见解 ...
- Elasticsearch集群如何扩容机器?
前提, Elasticsearch-2.4.3的3节点安装(多种方式图文详解) 比如,你已经成功搭建了3台机器的es集群,如我这里分别是192.168.80.10.192.168.80.11.19 ...
- 201671010140. 2016-2017-2 《Java程序设计》java学习第一周
java学习第一周 本周是新学期的开端,也是新的学习进程的开端,第一次接触java这门课程,首先书本的厚度就给我一种无形的压力,这注定了,这门课程不会是轻松的,同时一种全新的学习方 ...
- Gym101350 FMonkeying Around
题意 有n只猴子排成一排,一共有m个笑话.开始时,这些猴子都坐在椅子上.下面m行给出的每个笑话包含三个整数x,l,k.代表猴子x讲了笑话l,所以距离x小于等于k的猴子如果他们从没听过这个笑话,他们会掉 ...
- Angular27 指令
1 自定概述 2 自定义指令 详情参见<揭秘Angular2> 2.1 属性指令 >工具代码 <div class="panel panel-primary" ...
- 在aspx页面中使用三元表达式
第一种使用方法:判断GridView绑定的数据是否为空 用GridView或其他控件绑定数据的时候,有时候需要判断从数据库中获取的值是否是空值,然后显示相应的内容,如果在后置代码中写的话只有是在Row ...