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. Oracle里的执行计划

    1 执行计划的查看 1 explan plan 2 dbms_xplan包 3 sqlplus中 set autot 4 10046 5 awr报告 6一些现成的脚本 7 10053 常见的就前4种 ...

  2. Idea 如何设置微软雅黑等其它字体

    使用过idea的同学都知道,idea的功能相对于explise来说,功能太强大了啊~个人感觉,idea真心挺智能的.但是,这里有一个小瑕疵,就是能够设置的字体,有限! 对于用惯了 微软雅黑 字体的人, ...

  3. maven学习2

    pom.xml文件中的内 1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns= ...

  4. Py修行路 python基础 (四)运算 copy

    字符串的格式化 在字符串中插入 %s ,作为占位符,后边儿再定义插入变量. 算术运算 % 取模   判断奇偶数 / 除法   有小于号 // 取整除  返回整数部分 逻辑运算 and or not ' ...

  5. requests的响应返回值显示content和text方法的区别

    requests的get或者post请求,返回的响应response获取方法:content和text content用于获取图片,返回二进制数据 text用于获取内容,返回的是unicode解码字符 ...

  6. 微信小程序API登录凭证(code),获得的用户登录态拥有一定的时效性

    调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的 会话密钥(session_key).用户数据的加解密通讯需要依赖会话密钥完成. OBJECT参 ...

  7. C#读写EXCEL(二)

    C#读写EXCEL(二) -- ::| 分类: 默认分类 | 标签: |举报 |字号大 中 小 订阅 用微信 “扫一扫” 将文章分享到朋友圈. 用易信 “扫一扫” 将文章分享到朋友圈. 下载LOFTE ...

  8. 切面(Aspect)获取请求参数和返回值

    @Before("webLog()") public void doBefore(JoinPoint joinPoint) throws Throwable { // 接收到请求, ...

  9. winform 如何正确的获取窗体的标题栏高度

    最近我需要知道鼠标在一个控件里的相对位置,鼠标相对于屏幕的位置我是可以知道的,所以只要得到控件相对于屏幕的位置,就可以算出鼠标相对于控件的位置了 但是发现有误差 后来经过测试是由于窗体的标题栏高度导致 ...

  10. SpringMVC的控制器接收前端数据的方式

    1.请求处理方法中可以出现以下几种参数类型,直接在controller方法形参上定义默认类型的对象,就可以使用这些对象.可以通过下列对象来获取前台传来的参数: ①HttpServletRequest对 ...