JAVA 复习总结(三)

来源:互联网 发布:js 折叠 展开 编辑:程序博客网 时间:2024/05/17 02:39

虚拟机的内存分配

  • 1、寄存器
    JVM内部虚拟寄存器,存取速度非常快,程序不可控制。
  • 2、:保存局部变量的值,包括:
    1)用来保存基本数据类型的值;
    2)保存类的实例,即堆区对象的引用(指针)
    3)也可以用来保存加载方法时的帧
  • 3、:用来存放动态产生的数据,
    比如new出来的对象。注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法。因为同一个类的对象拥有各自的成员变量,存储在各自的堆中,但是他们共享该类的方法,并不是每创建一个对象就把成员方法复制一次。
  • 4、常量池
    JVM为每个已加载的类型维护一个常量池,常量池就是这个类型用到的常量的一个有序集合。包括直接常量(基本类型,String)和对其他类型、方法、字段的符号引用(1)。池中的数据和数组一样通过索引访问。由于常量池包含了一个类型所有的对其他类型、方法、字段的符号引用,所以常量池在Java的动态链接中起了核心作用。常量池存在于堆中。
  • 5、代码段
    用来存放从硬盘上读取的源程序代码。
  • 6、数据段
    用来存放static定义的静态成员。

注意:
1.一个Java文件,只要有main入口方法,我们就认为这是一个Java程序,可以单独编译运行。
2.无论是普通类型的变量还是引用类型的变量(俗称实例),都可以作为局部变量,他们都可以出现在栈中。只不过普通类型的变量在栈中直接保存它所对应的值,而引用类型的变量保存的是一个指向堆区的指针,通过这个指针,就可以找到这个实例在堆区对应的对象。因此,普通类型变量只在栈区占用一块内存,而引用类型变量要在栈区和堆区各占一块内存。

JavaBean的定义

JavaBean是Java中开发的可以跨平台的重要组件,在JSP中常用来封装业务逻辑和数据库操作。
JavaBean实际上就是一个Java类,这个类可以重用。

  • 是一个公有类,并提供无参的构造方法。
  • 属性私有。
  • 具有公有的setter和getter方法。

POJO:
POJO是简单的JavaBean,里面只有封装数据,没有任何业务逻辑代码。
Java的一个特性,数据与行为相分离。数据就是成员变量,行为就是setter和getter方法

抽象类的构造方法

抽象类可以有构造方法,只是不能直接创建抽象类的实例对象而已。
在继承了抽象类的子类中通过super(参数列表)调用抽象类中的构造方法

String有多少字节

Java中无论是汉字还是英文字母都是用Unicode编码来表示的,一个Unicode码是16位,每字节是8位,所以一个Unicode码占两字节。但是英文字母比较特殊,源自于8位(1字节)的ASCII吗,于是在Unicode码仅使用了低8位(1字节)就可以表示,高8位的话不使用也无所谓

this关键字

this关键字主要有三个应用:

  • this调用本类中的属性,也就是类中的成员变量;
  • this调用本类中的其他方法;
  • this调用本类中的其他构造方法,调用时要放在构造方法的首行。

Maven中-DskipTests和-Dmaven.test.skip=true的区别

-DskipTests,不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下。

-Dmaven.test.skip=true,不执行测试用例,也不编译测试用例类。

Java 关键字列表

abstract, assert, boolean, break, byte, case, catch, char, class, const(保留关键字), continue, default, do, double, else, enum, extends, final, finally, float, for, goto(保留关键字), if, implements, import, instanceof, int, interface, long, native, new, package, private, protected, public, return, short, static, strictfp, super, switch, synchronized, this, throw, throws, transient, try, void, volatile, while

保留字列表 (依字母排序 共14组),Java保留字是指现有Java版本尚未使用,但以后版本可能会作为关键字使用:

byValue, cast, false, future, generic, inner, operator, outer, rest, true, var, goto (保留关键字) , const (保留关键字) , null

Hibernate延迟加载

LOAD && GET :

load方法来得到一个对象时,此时hibernate会使用延迟加载的机制来加载这个对象,即:当 我们使用session.load()方法来加载一个对象时,此时并不会发出sql语句,当前得到的这个对象其实是一个代理对象,这个代理对象只保存了实 体对象的id值,只有当我们要使用这个对象,得到其它属性时,这个时候才会发出sql语句,从数据库中去查询我们的对象。

相对于load的延迟加载方式,get就直接的多,当我们使用session.get()方法来得到一个对象时,不管我们使不使用这个对象,此时都会发出sql语句去从数据库中查询出来。

Hibernate2延迟加载实现:a)实体对象 b)集合(Collection)

Hibernate3 提供了属性的延迟加载功能

当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。

Java中的隐藏和覆盖

隐藏 和覆盖 均发生在子类与父类之间

覆盖指父类实例方法被子类同名实例方法覆盖

隐藏是针对父类中的成员变量静态方法而言.当子类声明了与父类相同的变量名的变量时就实现了对父类成员变量的隐藏。当子类声明了与父类的静态成员方法中相同方法名,相同参数列表和相同返回类型的方法,则实现了对父类静态方法的隐藏

字符集编码(Character set encoding)和国际化(i18n)

在Java语言中,下列关于字符集编码(Character set encoding)和国际化(i18n)的问题,哪些是正确的?

A 每个中文字符占用2个字节,每个英文字符占用1个字节
B 假设数据库中的字符是以GBK编码的,那么显示数据库数据的网页也必须是GBK编码的。
C Java的char类型,通常以UTF-16 Big Endian的方式保存一个字符。
D 实现国际化应用常用的手段是利用ResourceBundle类

解析:

A 显然是错误的,Java一律采用Unicode编码方式,每个字符无论中文还是英文字符都占用2个字节。
B 也是不正确的,不同的编码之间是可以转换的,通常流程如下:
将字符串S以其自身编码方式分解为字节数组,再将字节数组以你想要输出的编码方式重新编码为字符串。
例:String newUTF8Str = new String(oldGBKStr.getBytes(“GBK”), “UTF8”);
C 是正确的。Java虚拟机中通常使用UTF-16的方式保存一个字符
D 也是正确的。ResourceBundle能够依据Local的不同,选择性的读取与Local对应后缀的properties文件,以达到国际化的目的。

答案:CD

public class Test{static{   int x=5;}static int x,y;public static void main(String args[]){   x--;   myMethod( );   System.out.println(x+y+ ++x);}public static void myMethod( ){  y=x++ + ++x; }}

1.静态语句块中x为局部变量,不影响静态变量x的值
2.x和y为静态变量,默认初始值为0,属于当前类,其值得改变会影响整个类运行。
3.java中自增操作非原子性的
main方法中:
执行x–后 x=-1
调用myMethod方法,x执行x++结果为-1(后++),但x=0,++x结果1,x=1 ,则y=0
x+y+ ++x,先执行x+y,结果为1,执行++x结果为2,得到最终结果为3

ps:

Java中对字段属性是静态绑定,方法成员是动态绑定

静态初始化块,静态变量这两个是属于同一级别的,是按代码写得顺序执行的

System.out.println默认调用的是String.valueOf()方法

该方法判断传入对象,如果是null则直接输出null否则调用toString()方法

valueOf源码

public static String valueOf(Object obj) {    return (obj == null) ? "null" : obj.toString();}

双目运算和单目运算

双目运算有可能会改变数据类型
逆波兰式并不改变数据类型
单目运算不改变

byte b = 1;//print:1System.out.println(b);b = b+1;//Error:不兼容的类型: 从int转换到byte可能会有损失System.out.println(b);b++;//print:2System.out.println(b);b+=1;//print:3System.out.println(b);

原创粉丝点击