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 持有对象

泛型和类型安全的容器

  通过使用泛型 ,可以在编译期防止将错误类型的对象放置到容器中(报编译期错误)。

基本概念

  1. Collection (List Set Queue)
  2. 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~的更多相关文章

  1. 《Play for Java》学习笔记(一)项目框架

    从今天开始认真复习<Play for JAVA>,该书以一个案例为主线,以前为应付项目马马虎虎看了一遍,好多地方都不明白!现在跟着这本书再走一遍,认真模拟,当做一个项目啦!! 一.Play ...

  2. 《图书管理系统——java》

    /* (程序头部凝视開始) * 程序的版权和版本号声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved. * 文件名:    < ...

  3. 读书笔记 之《Thinking in Java》(对象、集合)

    一.前言: 本来想看完书再整理下自己的笔记的,可是书才看了一半发现笔记有点多,有点乱,就先整理一份吧,顺便复习下前面的知识,之后的再补上. 真的感觉,看书是个好习惯啊,难怪人家说"书籍是人类 ...

  4. 《Head First Java》读书笔记(1) - Java语言基础

    <Head First Java>(点击查看详情) 1.写在前面的话 这本书的知识点说实话感觉有点散乱,但是贵在其将文字转换成了生动和更容易接受的图片,大量的比喻让人感受到了知识点的有趣之 ...

  5. 《Thinking In Java》阅读笔记

    <Thinking In Java>阅读笔记 前四章:对象导论. 一切都是对象. 操作符. 控制执行流程 public在一个文件中只能有一个,可以是一个类class或者一个接口interf ...

  6. 读书笔记 之《Thinking in Java》(对象、集合、异常)

    一.前言 本来想看完书再整理下自己的笔记的,可是书才看了一半发现笔记有点多,有点乱,就先整理一份吧,顺便复习下前面的知识,之后的再补上. 真的感觉,看书是个好习惯啊,难怪人家说“书籍是人类进步的阶梯” ...

  7. 《Thinking in Java》习题——吸血鬼数字

    最近在看<Java编程思想>,这本书非常棒,不愧是Java程序员的圣经.看到第四章,后面有道题目很有意思,于是就自己做了做.

  8. 201571030332 扎西平措 《面向对象程序设计Java》第八周学习总结

    <面向对象程序设计Java>第八周学习总结   项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https: ...

  9. 【书海】《Head First Java》 ——读后总结

    <Head First Java> 中文版 (第二版) IT`huhui前言录 <Head First Java>这本书我不算特别细的看了一遍.认为十分适合初学者,甚至是没接触 ...

随机推荐

  1. thinkphp遇到的小问题,js文件中U方法不被解析

    我想在js文件中写ajax, 写完发现异常, 本以为是js文件中不支持ajax 后来发现时地址解析错误. 也就是U方法在js文件中不被解析. 貌似thinkphp解析,tpl文件中的一些元素. js文 ...

  2. 第七章 JVM体系结构与工作方式

    JVM能跨计算机体系结构来执行Java字节码,主要是由于JVM屏蔽了与各个计算机平台的软件和硬件之间的差异. 7.1 JVM体系结构 7.1.1 何谓JVM 模拟一个计算机来达到一个计算机所具有的计算 ...

  3. mybatis~动态SQL(1)

    动态SQL MyBatis还有一个方便的功能就是动态SQL,可以根据条件智能生成SQL语句.这里的例子全部来自MyBatis文档. if标签 下面这个例子使用了MyBatis的if元素,在标题不为空的 ...

  4. 完整部署OpenStack-memcache配置

    一.[root@openstack-server ~]# nova listERROR (CommandError): You must provide a username or user id v ...

  5. 8.solr学习速成之FacetPivot

    什么是Facet.pivot  Facet.pivot就是按照多个维度进行分组查询,是Facet的加强,在实际运用中经常用到,一个典型的例子就是商品目录树 NamedList解释: NamedList ...

  6. 初学Python--列表(List)

    1.索引 列表中的元素类型未必统一,如: listExample=[1,2,'a','b'] 元素下标索引以0开始 firstEle=listExample[0] 不能进行越界索引,但可以倒序索引 l ...

  7. JDK和CGLIB生成动态代理类的区别(转)

     关于动态代理和静态代理 当一个对象(客户端)不能或者不想直接引用另一个对象(目标对象),这时可以应用代理模式在这两者之间构建一个桥梁--代理对象. 按照代理对象的创建时期不同,可以分为两种: 静态代 ...

  8. 如何用CURL将文件下载到本地指定文件夹

    若直接调用下载文件的url有重定向,则需先调用第一个方法,获取到跳转后的url,才可直接下载.否则需要手动点击浏览器的下载确定按钮. 调用示例: $imgpath = "http://www ...

  9. NUnit属性

    TestFixture:它标记一个类包含测试,申明该类是用来测试的.一般用在class的定义之前: Test一般是放在method之前,表示对该方法的测试:如前一篇文章所示的class. SetUp/ ...

  10. UIAtlas

    [UIAtlas] UIAtlas is a container that has coordinate information for a bunch of sprites. AtlasType有2 ...