时刻提醒自己:基础是最重要的,也是最容易被轻视和遗忘的,基础过硬才能更深入地去学习!
1. 子类new对象时,调用父类构造函数,也就是说,子类创建对象时,父类的对象也同时隐式创建(父类的构造函数调用之前,父类中相关的成员变量已完成初始化)。
2. 关键字private和final对函数的修饰是等同的,也就是说private修饰的方法,实际上等同于final修饰的方法。(而且这些被final或private修饰的函数都不能被子类覆盖)。
3. 接口可以包含域,但这些域隐式地是static和final的。
4. 接口中的方法一般都为public,没有声明权限修饰的,都默认为public。
5. 接口之间可以多继承,类之间只能单继承,但类可以实现多个接口。
6. 多态:子类向上转型为父类,父类引用调用相关方法时,真正实现调用的是子类覆盖父类的方法(原因是由于运行时动态方法的绑定)。同样的道理,实现接口的类也可以向上转型为接口。
7. 内部类拥有其外围类的所有元素的访问权,也就是说内部类可以访问外围类的private方法和字段。这从某种意义上来说,内部类可以与外围类相联系,进而实现内外之间的通信。
8. 如果在内部类中创建一个方法返回外部类对象的引用,则该引用的命名应为外部类名加点加this(即OuterClassName.this),这从某种意义上可以理解为内部类提供了某种进入外围类的窗口。
9. 如果不需要内部类对象与外部类对象之间有联系,那么可以将内部类声明为static。此类称为嵌套类。
10. 嵌套类为静态内部类。创建它时不需要对外部类对象的引用。而在创建内部类时需要先创建内部类对象的引用,在通过外部类对象创建内部类对象。如下:
OuterClass out = new OuterClass() , OuterClass.InnerClass in = out.new InnerClass();
11. 嵌套类可以作为接口的一部分(放到接口中的任何类都自动地是public和static的,接口内的嵌套类可以实现外围接口。
12. 嵌套类可以用来放置测试代码(嵌套类main方法中测试外围类代码),这样的好处是不必在发布产品前包含它,在将产品打包前可以简单地删除嵌套类,而不影响测试类的代码。
13. 作用域里创建的类,只能在该作用域内起作用,不能在作用域外起作用和创建对象。
14. 匿名内部类,new的可以是一个接口(也可以是抽象类),或者是一个实现类。如View.setOnClickListener(newOnClickListener(){ …}),这个看似new接口的匿名内部类,其实就相当于创建一个实现该接口的类的对象。
15. 如果定义一个内部类,且希望它使用一个在其外部定义的对象(或者需要传入一个基本类型参数给内部类的成员变量赋值),那么编译器会要求其参数引用是final的。否则编译器会报错。
16. 闭包:闭包是一个可调用的对象,它记录了一下信息,这些信息来自于创建它的作用域。通过这个定义,可以看出内部类是面向对象的闭包。因为它不仅包含外围类对象(创建内部类的作用域)的信息,还自动拥有一个指向此外部类对象的引用,在此作用域内,内部类有权操作所有的成员,包括private成员。
17. 局部内部类和匿名内部类,两者的区别在于一个有类名,一个无类名。局部内部类定义时不能有访问修饰符。有时候用局部内部类而不用匿名内部类的理由是:我们需要一个已命名的构造器,或者需要重载构造器(需要不止一个该内部类的对象),而匿名内部类只能用于实例初始化。
18. 容器类和数组:数组长度有限制,容器类(List,Set,Queue,Map)可以自动调整自己的尺寸。容器类创建的对象又称为持久对象。
19. 多线程实现多个顺序流并发执行,一个线程就相当于一个程序执行的顺序流。而线程驱动执行的任务可在Runnable接口run方法中实现。
20. 创建线程有两种方法,1:直接创建继承Thread类的对象,任务在覆盖Thread类的run方法中实现。2:创建实现Runnable接口的类对象,任务在接口run方法中实现,将该对象做为Thread类对象的构造函数的参数;