代码块
父类中的static代码块最先执行,按照顺序,接着是子类中的static代码块,接着是父类中的无修饰{}代码块和构造函数,最后是子类的无修饰代码块和构造函数
可见性修饰符
default父类和子类位于同一个包,则子类对父类有访问权限
protected父类和子类位于不同包内,子类对父类有访问权限
例如com.test包下的A类,和com.test2下的A2类,A2继承A,假如是default修饰,子类对父类无访问权限,若是protected,则可以
接口没有任何的方法,接口没有任何的方法是充当一个标识符的作用
基础变量都是按值传递,除此之外都是按引用传递,包括=号和函数参数,引用传递就是值传递,对对象A的修改会影响到对象B的状态,这就是引用传递,除非用clone()方法,才可以使得对对象A的修改不影响对象B的状态
浅克隆,一个Oal类实现Cloneable接口,实现public Object clone()方法
Object o = null;
try{
o = (Obj)super.clone();
}catch(....){}
o.birth = (Date)this.birth.clone();//深克隆,连一个类中的复合对象,例如Date也一起克隆
return o;
浅复制,也就是浅复制的s实际上与克隆后的对象指的是同一个对象引用
i=0 i=0
s="hello" <-> s
实现克隆
Oal a = new Oal();
Oal b = (Oal)a.clone();
b.changeInt();//调用克隆后b对象的方法
反射
Class c = Class.forName("Sub");
Base b = (Base)c.newInstance();
b.f();
第一部分结束
接口强调的is-a关系,抽象类强调的has-a关系
接口中的常量都是public static final,方法都是public abstract
抽象类的变量默认是default,抽象方法前有abstract,不能用private
接口和抽象类都不能被直接实例化,都只能通过多态的方式实例化
当功能需要累积时用抽象类,不需要累积时用接口
获取父类的类名,java任何类都继承于Object,getClass方法定义为final和native,子类不能覆盖该方法,因此子类调用的都是Object的getClass方法,返回此Object的运行类
所以要用this.getClass().getSuperClass().getName();获得父类的类名
super()必须为构造函数的第一条语句
out:
for(....)
for(....){
if(....)break out;
}
跳出到out定义的处,跳出双层循环
final方法不允许子类重写,final类不能被继承,所有方法不能被重写,final参数,这个参数在函数内部不允许被修改
static可以有全局的概念,可以用对象访问或者类名直接访问,所有对象共享静态变量
static方法不能用super和this,只能访问该类静态属性和方法
多个static代码块,加载类时会执行static代码块
static final全局常量,无static的是实例变量,final是常量
switch判断是int,所以byte,short,char都可以,但long,float,double不行,需要强制转化为int
case不能是浮点数,或带有变量的表达式,可以是常量
java1.7中,switch支持String类型的字符串判断
obj instanceof classes是二元运算符,返回true或false
strictfp精确浮点数关键字,如果一个类或方法用stricefp修饰时,所有浮点计算都是精准的,符合LTIEE 754标准
null值,编译器未给其分配内存,用于表明没有指向任何对象,null值是将引用变量的值全部置于0
按引用传递,形参存储的实际上是实参的对象地址,是栈空间,对象的实例实际上存储在堆空间中
ss2=ss1,实际上是改变了ss2存储的堆空间地址,实际实参没有改变
s1 0x12345678 helloworld 0x12345678 ss1
s2 0xFFFFFFF2 hello 0x12345678 ss2
引用类型的变量,栈空间存储的都是堆空间的地址
数据类型转换上,低到高可以自动转换,高到低需强制转换
byte,short和char类型在计算时会自动转化为int,所以short s1 = 1;s1=s1+1;是不对的,需要s1=(short)(s1+1);
但如果是s1+=1;那么就可以
Math.round四舍五入,返回值int。ceil向上取整,floor向下取整,返回值double
一个英文字符一个字节,一个汉字两个字节,所以通过lengh()和getBytes()可以判断是否包括汉字
Java默认是Unicode编码
String s1="abc";String s2="abc";String s3="def";
对象池
abc s1,s2
def s3
如果是字符串对象
String s1=new String("abc");
String s2=new String("abc");
String s3= new String("def");
s1 0x12345678 -> abc
s2 0x12345679 -------------这个也是指向对象池的abc
s3 ox12345670 -> def 这个就是指向对象池的def
hashCode()是对象的哈希码,当两个对象的哈希码一致时,两个对象才相等,否则两个对象就不等
StringBuilder单线程,StringBuffer多线程,StringTokenier分割字符串
while(str.hasMoreTokens()){
pn(str.nextToken());
}
java中的数组就是对象,有length属性,创建时固定大小
int [][]arr = {{1,2,3},{4,5,6}}
try中有return,也会执行finall中的代码,除非是System.exit(0)
异常的正确写法
try{}catch(SQLException){}catch(Exception e){}
小捕获异常在前,大的广的异常捕获在后
字节流,两个抽象类InputStream和OutputStream,字符流Reader和Writer,管理文件和目录的是File类
序列化是将对象以一连串的字节描述,序列化类需要实现Serializable接口
People p = new People();
FileOutputStream fos = new FileOutputStream("people.out");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(p);oos.close();
ObjectInputStream ois = new ObjectInputStream(fos);
People p1 = (People)ois.readObject();
pn(p1.getName());
序列化不会实例化static和transient变量,实现外部序列化可以通过Enternalizable来实现
一个类重写了toString()方法,则该对象可以直接输出
栈和堆是怎么存储的
栈 堆
i=1 new Rectangle() width=5 height=5
容器都是Collection
Set容器不能重复,List是顺序的Collection,Map有键映射到值
遍历
for(Iterator <String>iter =ll.iterator();iter.hasNext();){
String str = (String)iter.next;
pn(str);
}
ArrayList不是同步的,单线程。Vector是同步的,多线程,LinkedList双向链表
HashMap非线程安全,单线程。HashTable线程安全,多线程,TreeMap自带键排序,WeakHashMap弱引用,key不被外部引用,则被回收,可以使用对象作为HashMap和HashTabel的键
Collections是对集合的一个包装类,提供一系列静态方法对集合进行操作,例如
Collections.sort(list);//对集合进行排序
Statement执行不带参数的SQL语句,PreparedStatement可以执行带参数的SQL语句,带?的SQL语句,CallableStatement执行存储过程的SQL
后面会补充一下,在集合的遍历中有一个是对集合的临时进行操作会影响到原先集合的一个类,后面会讲一下,那个比较重要
如果要在遍历时修改HashMap,可以用CocurrentHashMap