了解java中的多态。引用和对象可以是不同的类型。父类的引用变量可以指向任意子类对象(但父类引用变量不可以调用子类特有的方法或实例变量,但如果我们确定父类引用的是子类的对象,可以做强制转换)。参数和返回类型也可以是多态的(例如参数声明为父类对象,实际传入参数可以为父类或子类的引用变量)
了解了抽象类,抽象类不能被实例化。抽象类应该定义好抽象方法,以便在多态运用中使用这些方法(所有子类都有这类方法)
了解了java中接口的使用。接口是对具有共同特征的部类的再一次抽象。使用接口作为参数或返回类型我们就可以传入任何有实现过该接口的东西,以便我们设计出任意层次的多态。
看了一个GUI接口实现的例子,加深了对接口的理解。以ActionListener接口为例,首先我们创建implements了该接口的对象(假设命名为someListener),然后我们重写该接口的方法actionPerformed(), 在这里定义到action后需要做的操作。假设我们创建一个Button对象,该对象有一个方法addActionListener(Actionlistener l),我们可以把someListener传进去(这里体现了多态,其实任何实现过该接口的对象都可以被传进去),这个方将传进去的对象的引用添加到一个Button对象内部的一个list里面。当事件被到的时候Button对象会调用到我们重写的actionPerformed().
。这三者之间的关系式由上而下的,即静态类中所有都是静态的,静态方法中所有的变量和调用必须是静态的,反过来非静态类或方不必排除静态的东西。
静态变量属于类不属于具体的对象,在类加载(通常是第一次创建该类的实例)时被初始化,被所有对象共享
需要注意静态final变量声明和初始化可以分开,但必须初始化。常量变量的命名习惯上必须全部大写。
boolean; char; byte; short; int; long; float; double
java的线程调度器没有API可以调用,有时我们需要线程被均等地执行或有顺序,这时可以(非必要)使用sleep使线程沉睡以其他线程被执行。这个方法可能会抛出InterruptedException, 对它的调用需要try/catch。
并发性(concurrency)问题:两个或以上的线程同时对一个对象进行存取。可以使用synchronized关键字修饰方法使他的每次所有步骤在别的线程进来前都会完成。也可以用synchronized关键字只修饰一行或数行指令。
对象就算是有多个同步化过的方法,也只有一个锁。一旦某个线程进入该对象的同步化方法,其他线程就无法进入该对象上的任何同步化线程。
死锁(deadlock)问题:两个线程分别交互执行两个同类对象的同步化方法,可能会因为互相持有对方的钥匙而导致另一对象该线程,从而造成程序无法进行。
: 类似C++中的模板,泛化了类对象或函数的参数类型,可以用一个大写字母来表示,比如说E。有几件事情需要注意,首先是创建泛型化类时要声明一下容许的对象(比如new ArrayList()),其次是多态的问题,涉及到泛型类型本身的多态(如List和ArrayList)及容器内对象的多态(容许元素类型的多态),还有就是说类方法取用含有多态类型的变量时有一些。下面详细说。
运用泛型的常见方法有两种,一种是在类声明里定义的类型参数(ex. public class ArrayListE extends AbstractListE …{ public boolean add(E o) }), 另一种是使用未定义在类声明中的类型参数,比如在方法中我想对参数类型使用泛型,但是这个泛型没有在类声明里定义,可以用这种语法:(ex. public T extends Animal void takeThing (ArrayListT list), T指定为Animal类或者子类,声明在方法的返回类型之前, 代表这个方法能够传入以Animal或子型来初始化的ArrayList对象)
泛型的好处:泛型写的程序主要和集合相关。用泛型后编译器会检查集合的类型安全性,不会等到运行的时候才发现错误。还有就是多态参数的问题,见我的博文:使用多态参数与泛型肖涵结婚