《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>这本书我不算特别细的看了一遍.认为十分适合初学者,甚至是没接触 ...
随机推荐
- 支付宝pc端支付接入PHP实现
引入支付宝接口 放入一个插件库中,方便管理 创建支付类 1.发起支付 public function init() { $order_id = $_REQUEST['order_id']; $orde ...
- Struts2处理逻辑的方式
1.可以统一写一个action 对应方法名处理不同逻辑 2.也可以分别写Action 分别处理不同的逻辑
- 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 2_Linear regression with one variable 单变量线性回归
Lecture2 Linear regression with one variable 单变量线性回归 2.1 模型表示 Model Representation 2.1.1 线性回归 Li ...
- cmd命令删除文件及文件夹
rmdir /s/q wenjianming 其中: /s 是代表删除所有子目录跟其中的档案. /q 是不要它在删除档案或目录时,不再问我 Yes or No 的动作.
- 构造方法概念,自定义构造(init)方法的用途, 类工厂方法(就是直接用类名 类调用)
一. 构造方法 构造方法:在OC中init开头的方法, 我们称之为构造方法 构造方法的用途: 用于初始化一个对象, 让某个对象一创建出来就拥有某些属性和值 // 比如我们定义一个Person的类,然后 ...
- SpringBoot17 FastJson配置、Druid配置
1 FastJson配置 1.1 FastJson基础知识 点击前往 1.2 SpringBoot整合FastJson 点击前往 1.2.1 导入FastJson依赖 <!--fastjson- ...
- 在Sqlserver中使用Try Catch
创建错误日志表: CREATE TABLE ErrorLog(errNum INT,ErrSev NVARCHAR(1000),ErrState INT,ErrProc NVARCHAR(1000 ...
- 关于SO_LINGER选项的使用
结论: linux开启SO_LINGER时,如果设置l_linger为非0, 不管是阻塞socket,非阻塞socket, 在这里都会发生阻塞, 而并不是UNP所讲到的( 非阻塞socket会立即返回 ...
- Entity Framework 6.0 Tutorials(3):Code-based Configuration
Code-based Configuration: Entity Framework 6 has introduced code based configuration. Now, you can c ...
- Mybaties原理图