thinking in java
perfect_red
这个作者很懒,什么都没留下…
展开
-
14.1为什么要使用RTTI
什么是 RTTIRTTI(Run-Time Type Identification),通过运行时类型信息程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。List<shape> 当把shape或其子类放入list集合时,会自动转型为shape,会丢失具体类型当从容器中取出时,这种容器---实际上它将所有的事物当做object持有--会自动转型回shape RT...原创 2018-05-18 21:31:39 · 273 阅读 · 0 评论 -
15.15 混型
术语混型似乎随着时间的推移拥有了无数的含义,但是其最基本的感念是混合了多个类的能力,以产生一个可以表示混型中所有类型的类。这往往是你最后的手段,它使组装多个类变得简单易行。 混型的价值之一是它们可以将特性和行为一致的应用于多个类之上。如果想在混型中修改某些东西,作为一种意外的好处,这些修改将会应用于混型所应用的所有类型智商。正是由于此,混型有一点面向切面编程的味道(A...原创 2018-07-08 22:34:02 · 159 阅读 · 0 评论 -
15.15.3 使用动态代理来实现混型
可以使用动态代理来实现混型,通过使用动态代理,所产生的类型将会是已经混入的组合类型。由于是使用的jdk的动态代理,所有必须实现接口class ProxyMixin implements InvocationHandler { //map集合,记录所有的方法名称和对象 Map<String,Object> delegatesByMethod; public Pro...原创 2018-07-09 00:21:59 · 130 阅读 · 0 评论 -
15.9泛型边界知识整理
看到泛型边界,这一章开始看得有点晕,所以看了下其他人的博客:https://blog.csdn.net/jiuoop/article/details/24980991https://blog.csdn.net/bbbbln/article/details/51943006关于extends 和 super 写下自己的理解:在这里首先要说:泛型不具备协变性。List<Object> li...原创 2018-07-03 01:59:25 · 323 阅读 · 0 评论 -
Thinking in java 第19章 枚举类型 19.8 EnumSet
EnumSet 的特点是快:下面是使用方法:package com.yaoqiang.demo;import java.util.EnumSet;import static com.yaoqiang.demo.AlarmPoints.*;public class EnumSets { public static void main(String[] args) { ...原创 2018-07-18 23:19:39 · 129 阅读 · 0 评论 -
Thinking in java 第21章 并发 21.2.8 后台线程 Executors无法执行守护线程
什么是后台线程(守护线程) 为其他线程提供服务的线程,当所有其他线程结束的时候,后台线程也就结束了,只要有一个线程没有结束,那么后台线程就一直执行下去。 但是我们一般做多线程都是使用线程池,比如: public static void main(String[] args) { ExecutorService service = Executor...原创 2018-08-11 18:23:51 · 254 阅读 · 0 评论 -
Thinking in java 第21章 并发 12.2.11 加入一个线程
一个线程可以在其他线程之上调用join()方法,其效果是等待一段时间直到第二个线程结束才继续执行。如果某个线程在另一个线程T上调用T.join(),此线程将被挂起,知道目标线程结束才恢复(t.isAlive() == false) 也可以在调用join()时带上一个超时参数(单位时间自己决定),如果目标线程在这个时间没有结束,join()也将返回。 ...原创 2018-08-11 22:50:24 · 113 阅读 · 0 评论 -
Thinking in java 第21章 并发 21.2.14 捕获异常
由于线程的特殊,使得你不能捕获从线程种逃逸的异常,在这里可以使用Executor来解决这个问题:下面的代码没有办法捕获异常:class ExceptionThread extends Thread { @Override public void run() { super.run(); Thread t = Thread.curr...原创 2018-08-12 00:20:55 · 122 阅读 · 0 评论 -
Thinking in java 第21章 并发 notify()与nofityAll()
因为在技术上而言,可能会有多个任务在单个car对象上处于wait()状态,因此调用notifyAll()比只调用nofity()更加安全。但是,上面的程序的结构只会有一个任务实际处于wait()状态,因此你可以使用nofity*()来代替nofityAll(). 使用notify()而不是notifyAll()是一种优化,使用notify()时,在众多等待同一个锁的任务中只有...原创 2018-08-26 23:23:01 · 332 阅读 · 0 评论 -
Thinking in java 第21章 并发 ReentrantLock 上的阻塞的任务具备可以被中断的能力
class Blockedmutex { private final Lock lock = new ReentrantLock(); Blockedmutex(){ lock.lock(); } public void f(){ try { lock.lockInterruptibly(); ...原创 2018-08-22 23:43:32 · 154 阅读 · 0 评论 -
Thinking in java 第21章 并发 在阻塞时终结
一个线程可以处于以下四种状态: 新建(new):当线程被创建时,它只会短暂地处于这种状态。此时它已经分配了必需的系统资源,并执行了初始化。此时刻线程已经有资格获得CPU时间了,之后调度器将把这个线程转变为可运行状态或阻塞状态。 就绪(Runnable):这种状态下,只要调度器把时间片分配给线程,线程就可以运行。也就是说,在任意时刻,线程可以运行也可以不运行。只要调度器能分配时间片给...原创 2018-08-21 00:18:17 · 130 阅读 · 0 评论 -
15.6 利用泛型构建复杂模型
在本例中,构建的是一个零售店,它包含走廊,货架,商品:class Product{ private final int id; private String description; private double price; public Product(int id, String description, double price) { th...原创 2018-06-26 23:50:02 · 180 阅读 · 0 评论 -
15.13 泛型动态类型安全
在有的时候,泛型不能起到安全保护的作用,比如: private static void add(List list){ list.add(123); } public static void main(String[] args) { List<String> l = new ArrayList<>(); ...原创 2018-07-08 21:27:40 · 454 阅读 · 0 评论 -
14.2 Class对象
类是程序的一部分,每个类都有一个class对象每当编译一个新类,就会产生一个Class对象(更恰当的说,是被保存在一个同名 的.class文件中),为了生成这个类,会运行jvm 将被称为"类加载器"的子系统"类加载器" 子系统可以包含一条类加载器链,但是只有一个原生态加载器,它是jvm实现的一部分.它加载可信类, 比如java API,本地加载,如有需要,可以挂接额外的加载器所有类老师在第一次使用...原创 2018-05-18 23:26:11 · 128 阅读 · 0 评论 -
14.2.1类字面常量
类字面量常量: 是另一种生成Class对象引用的方法,即 Demo.class这种方式的好处:更加简洁,更少的代码量更安全,在编译时就受到的检查( 所以不需要try catch )更高效,根除了对forName的引用。为了使用类而做的准备工作:加载:由类加载器执行,查找字节码,从字节码中创建Class对象链接:在此阶段将验证类中的字节码,为静态域分配 存储空间,必需的话,解析这个类创建的对其他类的...原创 2018-05-19 12:05:29 · 245 阅读 · 0 评论 -
异常链
1.想在捕获一个异常后抛出另一个异常,并且希望把始的异常信息保存下来,这种叫做异常链2.在throwable的子类中,只有3种异常类提供了cause参数 Error,Exception,RuntimeException3.如果要把其它异常连接起来,应该用initCause()而不是构造器package com.yaoqiang._class;class DynamicFieldsExceptio...原创 2018-05-12 00:16:37 · 183 阅读 · 0 评论 -
13.字符串(1)
13.1 字符串是不可以变的public class Demo { public static void main(String[] args) { String q = "hello"; System.out.println(q); String qq = upcase(q); System.out.println(q); System.out.println(qq);...原创 2018-05-15 22:21:14 · 103 阅读 · 0 评论 -
14.8空对象(一)
尽可能的避免空指针异常: 想要达到:即使对象是空值,依然可以响应对象的所有信息,你仍需要某种方式去测试其是否为空解决方案:public interface Null {}这样可以使用instanceof 探测空对象,省去isNull()方法 *使用默认权限使用包外无法使用,关闭包外继承 * */ class Person { //从技术的角度来说,不可变类是允许公有域的,虽然这样不太...原创 2018-06-06 00:56:05 · 196 阅读 · 0 评论 -
14.8空对象(二)
public interface Operation { String description(); void command();}Test为自带测试类:public interface Robot { String name(); String model(); List<Operation> oprations(); class Test{ public s...原创 2018-06-06 01:10:34 · 107 阅读 · 0 评论 -
15.2.2 一个神奇的堆栈类
public class LinkedStack<T> { private static class Node<U>{ U item; Node<U> next; Node() { item = null; next = null; }...原创 2018-06-21 23:50:30 · 122 阅读 · 0 评论 -
15.3 泛型接口 生成器(Generator)
泛型可以应用于接口,例如生成器(Generator),这是一种专门创建对象的类,这是于工厂方法设计模式的一种应用,不过,当我们使用生成器创建对象的时候,我们不需要任何参数,而工厂方法一般需要参数,这也就是说,生成器无需额外的信息就可以生成对象。 一般而言,生成器需要一个方法来创建对象public interface Generator<T> { T...原创 2018-06-23 18:43:36 · 425 阅读 · 0 评论 -
15.4.4 一个通用的生成器(Generator) 泛型生成具体类型
/** * @param <T> */public class BasicGenerator<T> implements Generator<T> { private Class<T> type; public BasicGenerator(Class<T> type){ this.type = ty...原创 2018-06-23 23:12:30 · 903 阅读 · 0 评论 -
15.8 泛型擦除
//总超能力接口interface SuperPower{}//X射线超能力interface XRayVision extends SuperPower{ void seeThroughWalls();}//听力超能力interface SuperHearing extends SuperPower{ void hearSubtieNoises();}//嗅觉超能...原创 2018-06-30 01:48:27 · 147 阅读 · 0 评论 -
Thinking in java 第21章 并发 wait() 与 notifyAll()
wait 使你可以等待某个条件发生变化,而改变这个条件超出了当前方法的控制能力,通常,这种条件将由另一个任务来改变。你肯定不想在你的任务测试这个条件的同时,不断的进行空循环,这被称为忙等待,通常是一种不良的cpu周期使用方式。因此wait等待会在等待时将任务挂起,并且只有在notify或者notifyAll的时候才会会被唤醒并检查所发生的变化,因此,wait提供了一种在任务之间同步的方法。 ...原创 2018-08-24 00:36:06 · 195 阅读 · 0 评论