1,三者区别
final— 修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将基础类型变量声明为final,可以保证它们在使用中不被改变,所以此变量变为常亮。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。 引用类型声明为finnal,不可以改变它所指向的对象,但所指向对象中得知可以改变。
finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。
finalize— 方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
2,接口和抽象类
1),抽象类可以有字段,可以有非抽象的方法,接口的成员变量只能为static final类型,即为常量。
2),子类可以继承多个接口但只能继承一个抽象类。
3,static修饰的成员变量,方法和代码段
类加载时创建初始化和执行,对于一个类只有一份,用类名访问。
http://www.cnblogs.com/gold-worker/archive/2012/09/27/2706232.html
静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),
而不允许访问实例成员变量和实例方法;实例方法则无此限制。
4,Java中是否可以覆盖(override)一个private或者是static的方法?
一.静态方法和字段可以被继承
二.如果子类中出现同名的静态方法和字段,将重新创建新的同名的静态字段和方法,隐藏原来的静态方法和字段,而不是重写和覆盖
三.如果是子类中有同名的非静态方法和字段,也将隐藏原来的非静态方法和字段,此时不能用类访问该静态方法和字段,只能创建对象后访问
四.私有静态方法不能被继承,同名也没有关系
5,方法重载:相同的名字,相同或不同的返回值,但参数不同的多个方法(参数个数或参数类型或参数列表的顺序)。
方法重写:
具有相同方法名称、参数列表和返回类型
。
6,构造函数不能被继承,所以不能重写,只能通过super调用,子类的构造方法中必须先调用父类的构造方法。
7,java面向对象的三个基本特征为:继承,封装,多态。
8,String是不可变得字符串,当采用+创建新字符串时,每用次+便会产生一个新字符串在常量区,效率低占空间大,所以用StringBuilder和StringBuffer的append方法。StringBuffer线程安全。
String源码解析:http://www.gjprj.cn/news1.asp?id=3164 ,用字符数组实现,类和成员都是final。
9,强制类型转换
分为基本数据类型和引用数据类型两种情况
引用类型 :
举个例子来说,比如原来定义了两个类型,FatherClass和SonClass,然后构造了一个SonClass类型的对象,用一个FatherClass类型的变量father引用了,就像这样:
FatherClass father = new SonClass();
那么,需要将这个对象的类型还原的时候,就可以用这个表达式。
SonClass son = (SonClass)father;
其实,father仍然是FatherClass类型,只不过临时把它的能力提升了一下,然后这一切都交给了son这个变量。但是经过这样处理以后,这个对象就真正提升了能力了,在son这个变量的引用之下,从此以后恢复真身,可以自由发挥了。
父类到子类的强制类型转换并不总是能够成功
还是举个例子:
FatherClass f = new FatherClass();
SonClass s = (SonClass)f; //这时候就会报错,运行时报错,编译能通过的
编译器只检查类型之间有无继承关系,有则通过;运行时检查真正类型,是则通过。
基础类型
具体规则为:byte(1byte)→short(char)(2byte)→int(4)→long(8)→float(4)→double(8),如果按这个顺序,会自动转换;箭头反方向的话必须使用强制转换。
10,基础类型的成员变量与局部变量
java中没有c语言中全局变量的概念,对于基础类型,只有成员变量和局部变量。
成员变量存放于堆中,依附于对象而存在,随着对象而产生和消亡。所以对象a的name存在于堆中,只要有a的引用就可改变它;
局部变量存在于方法内,随着方法的结束而消失。方法changInt的i与main中的i,虽然都是i,但它们是两个变量,作用于两个不同的方法,必须通过返回值进行值传递。
11,访问权限
12,正则表达式
几种写法:1)String s = new String("
aaaaab");
boolean rs = s.matches("^a*b&");
2)
Pattern p = Pattern.
de>compilede>("^a*b$");
Matcher m = p.
de>matcher
de>
("aaaaab");
boolean b = m.
de>matches
de>
(); //匹配整个字符串
boolean b = m.
find
(); //匹配子串,并把匹配过的字串删除继续匹配下面的子串,比如aaab-aab-aab
boolean b = m.
lookingAt()
;//每次从头上匹配子串
具体匹配规则详见util.regex中的Pattern
boolean rs = "\\".matches("^\\\\$");//匹配一条反斜线
boolean rs = "a".matches("^[a-z]{1,3}$");//匹配a-z中任何一个字母出现1-3次
匹配的模式中要写上开始符^和结束符$。
\\s,\\d这些预定义的标示符都要再加一个斜杠表示转译
13,
java7 java8新特性总结
java7:
http://wenku.baidu.com/link?url=s-lktjYYv8TBzqZonvQn0KiS5GUg0-fqT_EB-0WbML7pEJ0mxdZ8ZLL0gFQ7Pq5YLoDG9lRvbVgnG-eqLgE9TgeUe-b9OcbQiIqZWSWdbsO
TransferQueue:
详见并发编程
fork join线程池框架
编程语法方面:http://blog.csdn.net/cyq1984/article/details/4877413
NIO.2 java7对nio做了增强
1)增添了nio.file包,提供了全面的文件IO和文件系统访问支持。比如Path接口表示文件路径。
2)增加了几个异步的Channel就是aio。关于
Asynchronous I/O参见NIO.
G1垃圾收集器
java8:
http://developer.51cto.com/art/201404/435591.htm
1)接口是个双刃剑,好处是面向抽象而不是面向具体编程,缺陷是,当需要修改接口时候,需要修改全部实现该接口的类。Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下:
interface Formula {
double calculate(int a);
default double sqrt(int a) {
return Math.sqrt(a);
}
}
作用:为接口添加新方法使不会再去修改所有实现类了。
2)“Lambda 表达式”(lambda expression)是一个简化的匿名函数,Java 8的一个大亮点是引入Lambda表达式,使用它设计的代码会更加简洁。
不采用Lambda的老方法,匿名类直接new接口:
public static void runThreadUseInnerClass() {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("匿名类实现的线程");
}
}).start();
} //匿名类就是直接在接口里写实现
使用Lambda:
public static void runThreadUseLambda() {
new Thread(() ->System.out.println("lambda实现的线程")).start();
}
作用:简化匿名类的写法;简化集合的批处理,实现了集合内部迭代,提高了处理效率。
加入了注解和对泛型的改进
14,异常处理机制(try......catch.......finnally)
Error:
RuntimeException:用户当然也可以对其捕获。
Exception(除了Runtime之外的):
IOException、SQLException
15,java的uuid
UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,保证这个数字和同一时空中的所有机器都是唯一的。
时间上不重复:同一台机器前后时间产生的 UUID 不重复;空间上不重复:同一时间两台机器上产生的 UUID 不重复;并发生成 UUID 不重复:同一台机器不同生成单元(进程或线程)生成 的 UUID 不重复,尤其是同一时间点生成的 UUID;
UUID是由一个十六位的数字组成,表现出来的形式例如 : 673ae243-b020-46d9-875a-60d228f1e8ab.
在Java中生成UUID主要有以下几种方式:
1. JDK1.5 如果使用的JDK1.5的话,那么生成UUID变成了一件简单的事,以为JDK实现了UUID: java.util.UUID,直接调用即可.
UUID uuid = UUID.randomUUID();
String id = uuid.toString();
2. 第三方开源类库
import org.doomdark.uuid.UUID; import org.doomdark.uuid.UUIDGenerator;
UUIDGenerator generator = UUIDGenerator.getInstance(); UUID uuid = generator.generateRandomBasedUUID();
在使用数据库的时候,需要添加一个唯一的主键,一般使用的是36位的唯一的字符串,我们有两种方式
一、使用数据库自动生成的方式,自动添加唯一的ID值
二、使用JAVA自动生成的UUID,作为数据库字段的主键