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);
}
}
来源:oschina
链接:https://my.oschina.net/u/4263721/blog/3704163