书本总是喜欢用冗长的代码来描述,不方便快速复习。所以摘下要点,方便复习。
一、基本语法以及操作符
略
二、访问权限
Public
private
protect 子类可以访问父类受保护成员
不过不声明以上三种,就默认为default,
权限为在同一个包内可以访问。
不管是何种权限,在同一个类里面是都能访问到的。
也就是在类的实现里面都可以访问即使是已经实例化的对象。
三、复用类
1、 组合,在类里面使用其他的类。
2、 继承。
无法继承父类的private内容,也就是父类的private内容对子类不可见,但是若父类对其拥有一个public方法的调用,子类仍然可以通过调用此public方法使用父类private方法。
初始化顺序:
a 静态成员变量首先初始化(注意,Static可以看做一个静态成员,其执行顺序和其在类中申明的顺序有关)
b 普通成员初始化
c 执行构造函数。
1 继承体系的所有静态成员初始化(先父类,后子类)
2 父类初始化完成(普通成员的初始化-->构造函数的调用)
3 子类初始化(普通成员-->构造函数)
类的加载,类只有被用到的时候才会被加载,且只初始化一次。
Super用来引用父类方法(仍旧无法访问private)。和显式的调用父类构造器
Java不允许多重继承,但使用了接口实现了多重继承
3、 多态
实现多态的途径之一就是向上转型。
就是子类,或者实现了一些接口的类,都可以使用父类或者那些接口去代替他本身的引用。
向上转型的时候,父类的接口是无法访问子类里新增的方法和属性的。
4、 接口,接口就是将声明和实现分割开来,使用interface修饰。
与之对应的是抽象类,其中一些方法使用Abstract,强制子类实现它的方法。
与之相关的是各种设计模式。
四、容器
l Collection子接口之一:Set接口
- Ø HashSet LinkedHashSet TreeSet
l Collection子接口之二: List接口
- Ø ArrayList LinkedList Vector
l Map接口
- Ø HashMap TreeMap Hashtable
集合支持遍历,需要继承Iterable的接口,并实现其next和hasNext方法。
TreeMap的排序需要继承comparable接口实现其compareto,或者实现一个comparator对象,为这个对象实现compare的方法。
当要在map中写入自己定义的类的时候,要重写这个类的equal方法和hasCode方法。
容器的具体方法参考文档。
五、异常
建议使用try catch的方法捕获异常
自己实现异常
手动抛出异常 throw
六、String类
String,StringBuffer与StringBuilder的区别
String 字符串常量
StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)
String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String
StringBuffer
和
StringBuilder都有append方法,可以直接增加字符串。
格式化字符串:
- int x = 1;
- float y = 1.223f;
- System.out.printf("%d %f",x,y);
- System.out.println();
- System.out.format("%d %f",x,y);
可以用Formatter在控制台完美的控制间隔,不用你自己去数几个空格了。
[java] view plaincopy
- public class TestString {
- public static void main(String[] args) {
- Formatter fm = new Formatter(System.out);
- fm.format("%-5s %5s %10s ", "Name","Age","School");
- }
- }
%数字+s这样的表达像c,位置可以移动。
[java] view plaincopy
- System.out.println(String.format("%h", 17));
- nbsp;fm.format("%h", 17);
16进制的格式化输出。
正则表达式:
不用真心熟悉不起来,跳过。
七、类型信息
每一个类都对应着一个Class对象。
- Ø 在运行时判断任意一个对象所属的类
- Ø 在运行时构造任意一个类的对象
- Ø 在运行时判断任意一个类所具有的成员变量和方法
- Ø 在运行时调用任意一个对象的成员变量和方法
- Ø 生成动态代理
- Ø Class本身也是一个类
- Ø Class 对象只能由系统建立对象
- Ø 一个类在 JVM 中只会有一个Class实例
- Ø 一个Class对象对应的是一个加载到JVM中的一个.class文件
- Ø 每个类的实例都会记得自己是由哪个 Class 实例所生成
- Ø 通过Class可以完整地得到一个类中的完整结构
方法名 |
功能说明 |
static Class forName(String name) |
返回指定类名 name 的 Class 对象 |
Object newInstance() |
调用缺省构造函数,返回该Class对象的一个实例 |
getName() |
返回此Class对象所表示的实体(类、接口、数组类、基本类型或void)名称 |
Class getSuperClass() |
返回当前Class对象的父类的Class对象 |
Class [] getInterfaces() |
获取当前Class对象的接口 |
ClassLoader getClassLoader() |
返回该类的类加载器 |
Class getSuperclass() |
返回表示此Class所表示的实体的超类的Class |
Constructor[] getConstructors() |
返回一个包含某些Constructor对象的数组 |
Field[] getDeclaredFields() |
返回Field对象的一个数组 |
Method getMethod(String name,Class … paramTypes) |
返回一个Method对象,此对象的形参类型为paramType |
实例化Class类对象(四种方法)
1)前提:若已知具体的类,通过类的class属性获取,该方法
最为安全可靠,程序性能最高
实例:Class clazz = String.class;
2)前提:已知某个类的实例,调用该实例的getClass()方法获
取Class对象
实例:Class clazz = “www.atguigu.com”.getClass();
3)前提:已知一个类的全类名,且该类在类路径下,可通过
Class类的静态方法forName()获取,可能抛出ClassNotFoundException
实例:Class clazz = Class.forName(“java.lang.String”);
4)其他方式(不做要求)
ClassLoader cl = this.getClass().getClassLoader();
Class clazz4 = cl.loadClass(“类的全类名”);
实现了动态代理:
待补
八、泛型
Java泛型没有其它语言的泛型那么有用,原因之一就是使用了擦除。擦除的核心动机是使得泛型化与非泛型化的代码之间能互相调用,是为了兼容。Java的设计者认为这是唯一可靠行的解决方案。如果Jdk1.0就引入了泛型,则不会有这个问题。
Java的泛型因为历史的遗留问题,所以实行了擦除的原理。即所有类都在运行期间都将自动擦除成Object对象,丢失其原有的对象信息
泛型方法 : public<T> void f(T x){}
擦除。List<String>型的对象与List<Integer>型的对象,在运行时,其类型都被擦除为List。因此,在泛型机制下,无法获得有关泛型参数的运行时信息,像List<Integer>成为List,普通类型T则成为Object类型。这相比c++的模板机制,有很大的不足之处,弥补方法之一是使用泛型边界如<T extends ClassType>。
边界Java泛型编程中使用extends关键字指定泛型参数类型的上边界(重写了extends关键字,与继承没有什么关系)
Java泛型编程的边界可以是多个,使用如<T extends A & B & C>语法来声明,其中只能有一个是类,并且只能是extends后面的第一个为类,其他的均只能为接口
泛型通配符:
有个古怪循环,没搞懂什么意思,好像什么子类限定,自己限定自己子类的泛型?
以后再研究。
九、并发
Executor 懒得补以后写。