JAVA 持有对象——容器初探
引言
如果一个程序只包含固定数量的且其生命周期都是已知对象,那么这是一个非常简单的程序——《think in java》
了解容器前,先提出一个问题,ArrayList和LinkedList谁的处理速度更快呢?
如果一个程序只包含固定数量的且其生命周期都是已知对象,那么这是一个非常简单的程序——《think in java》
了解容器前,先提出一个问题,ArrayList和LinkedList谁的处理速度更快呢?
public class Basic{
public void add(int i)
{
System.out.println("Basic add");
}
public Basic()
{
add('a');
}
}
public class A extends Basic{
public void add(int i)
{
System.out.println("A add");
}
}
public class B extends Basic{
public void add(char i)
{
System.out.println("B add");
}
}
public class Main{
public static void main(String[] args)
{
A a = new A();
B b = new B();
}
}
问题:为什么创建A对象的时候父类会调用子类方法?
但是:创建B对象父类会调用父类的方法?
答案:
当子类被加载到内存方法区后,会继续加载父类到内存中。
如果,子类重写
了父类的方法,子类的方法引用会指向子类的方法,否则子类的方法引用会指向父类的方法引用。
如果子类重载
了父类方法,则子类重载方法引用还指向子类方法。
如果子类方法没有重写也没有重载父类方法,则方法引用会指向父类方法。
当子类对象创建时,会先行调用父类的构造方法(构造方法也是方法),虚拟机会在子类方法区寻找该方法并运行。
但是:由于java语言是静态多分派,动态单分派。其结果是当编译的时候,父类构造方法调用的方法的参数已经强制转换为符合父类方法的参数了。
上边代码在编译前已经转换为下面这个样子的了。
public class Basic{
public void add(int i)
{
System.out.println("Basic add");
}
public Basic()
{
add((int)'a');
}
}
public class A extends Basic{
public void add(int i)
{
System.out.println("A add");
}
}
public class B extends Basic{
public void add(char i)
{
System.out.println("B add");
}
}
public class Main{
public static void main(String[] args)
{
A a = new A();
B b = new B();
}
}
看一下上边的代码,是不是恍然大悟?
垃圾收集技术并不是Java语言首创的,1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言。垃圾收集技术需要考虑的三个问题是:
哪些内存需要回收?
什么时候回收?
如何回收?
HttpClient
是java语言下一个支持http协议的客户端编程工具包,它实现了HTTP协议的所有方法,但是不支持JS渲染。我们在做一些小玩意时,有可能需要登录某些网站获取信息,那么HttpClient就是你的好帮手,废话不多说,进入实战。
看代码:
public void testInteger()
{
Integer a = 1;
Integer b = 1;
Integer c = 128;
Integer d = 128;
System.out.println(a == b);
System.out.println(c == d);
}
结果是什么?