您的位置:首页 > 编程语言 > Java开发

Java语言学习

2016-05-13 14:20 489 查看

温故而知新

1 面向对象语言特性

抽象

关心对象有那些属性和行为,不关心具体实现。

abstrct class Animal与 class Dog之间的关系

继承

获得现有对象属性和行为,减少实现难度

让变化的软件系统获得延续性

class TonyDog与class Dog之间的关系

多态

不同的子类型对象对同一个事件具备不同的反映

前绑定编译时多态-方法重载(overload)对象内部关系

后绑定运行时多态-方法重写(override)对象和子类的关系

不改变逻辑代码的情况下替换实现

封装

隐藏一切可以隐藏的,对外提供最简洁的接口

2 short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?

short s1 = 1;s1 = s1 + 1;
1是int类型,s1+1需要强制转型才能赋值给s1

s1 += 1;
等价于
s1 = (short) (s1+1);
已经包含了强制转换

3 int和Integer的关系

Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;
Integer f5 = new Integer(100);
int f6 = 100;
System.out.println(f1 == f2);//true
System.out.println(f3 == f4);//false
System.out.println(f1 == f5);//false
System.out.println(f1 == f6);//true


int和Integer远算会自动拆箱,==的int比较是值比较

Integer对象之间的==比较,是地址比较

Integer赋值一个int型数值,会自动装箱,调用的是Integer类的valueOf方法。在Integer内部会自建一个缓存池,缓存Integer(-128)到Integer(127)的对象

/**
* Returns a {@code Integer} instance for the specified integer value.
* <p>
* If it is not necessary to get a new {@code Integer} instance, it is
* recommended to use this method instead of the constructor, since it
* maintains a cache of instances which may result in better performance.
*
* @param i
*            the integer value to store in the instance.
* @return a {@code Integer} instance containing {@code i}.
* @since 1.5
*/
public static Integer valueOf(int i) {
return  i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128];
}

/**
* A cache of instances used by {@link Integer#valueOf(int)} and auto-boxing
*/
private static final Integer[] SMALL_VALUES = new Integer[256];

static {
for (int i = -128; i < 128; i++) {
SMALL_VALUES[i + 128] = new Integer(i);
}
}


4 内存中的栈(stack)、堆(heap)和静态区(static area)

stack 定义的变量、一个对象的引用、函数调用的现场保存

heap 创建的对象、理论上整个内存,甚至虚拟内存都可以当作堆空间使用

static area 定义的常量池

Java6 开始有一种“逃逸分析”技术可以把局部对象放在stack上提升性能

5 重载的方法能否根据返回类型进行区分

假设可以通过返回值来实现重载

定义:

public void fun(int n) {
// do something
}

// Overload
public int fun(int n) {
// do something
}


使用的时候直接使用
fun();
现在编译器如何来推断使用的到底是那个方法?

所以不可以这样

6 JVM加载.class文件的原理

把.class加载到内存,如果class存在父类先加载父类,在一次执行类的初始化操作

PDM-双亲委派机制。除了系统自带的Bootstrap加载器,每个加载器有且仅有一个父加载器,类加载的时候先请求父加载器加载,父加载器无能为力的时候再尝试子加载器加载

Bootstrap 负责加载JVM的核心基础类库

Extension 从系统属性的指定目录加载类库,它的父类是Bootstrap

System 加载系统环境变量目录中的类库,父类是Extension

用户自定义加载器,父类是System

JVM不会向Java程序提供对Bootstrap的引用

7 抽象的(abstract)方法是否可同时是static,同时是本native,同时是synchronized

静态方法 static 不属于类,不可被子类重写,abstract必须被重写,矛盾

本地方法 native 需要使用C、C++代码实现,abstract在抽象类中不会实现,矛盾

同步方法 synchronized 需要关注代码实现细节,abstract并没有代码,矛盾

8 如何把一个对象序列化到本地

对象实现Serializable

转换成Stream

9 GC

可以有效的防止内存泄漏,尤其是在服务器端编程

但是这都是自动实现的,如果程序代码存在问题还是会发生内存泄漏

伊甸园(Eden) 这是对象诞生的地方,大多是对象只在这个地方出现过

幸存者乐园(Survivor) 中生代。年轻代收集(Minor-GC)会把Eden对象移动到这

终身颐养园(Tenured) Minor-GC不会触及到这,Major-GC(全GC)控制区域

当一个线程进入一个对象的synchronized方法A之后,其它线程是否可进入此对象的synchronized方法B

不能,如果一个线程进入一个对象的synchronized方法,表明这个对象锁已经被取走,所有的同步方法都不能进入,只能进入非同步方法。如果执行同步方法,只能在等锁池等待。

线程的基本状态以及状态之间的关系



JDBC操作数据库执行顺序

加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");


建立连接
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "tiger");


创建语句

PreparedStatement ps = con.prepareStatement("select * from emp where sal between ? and ?");
ps.setInt(1, 1000);
ps.setInt(2, 3000);


执行语句
ResultSet rs = ps.executeQuery();


处理结果

关闭资源

DAO

Data Access Object。数据不要暴露在外面直接操作,通过Accessor来操作

事务-ACID

原子性 要么成功 要么失败

一致性 不改变系统状态

隔离性 事务之间互不影响

持久性 执行结果可以固化

脏读 A执行的过程中,B回滚

不可重复读 A在从新读取前面读取过的数据,发现被B修改过了

幻读 A在查询数据的时候,发现插入被B提交的数据

第一类丢失更新 事务A撤销造成事务B提交的数据丢失

第二类丢失更新 A更新覆盖了B更新的数据

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: