JAVA基础复习.doc_第1页
JAVA基础复习.doc_第2页
JAVA基础复习.doc_第3页
JAVA基础复习.doc_第4页
JAVA基础复习.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一、JAVA基础1.简述Java编译及运行过程首先,Java 源文件(*.java)经过Java的编译器编译成Java字节码(*.class)文件;然后,进行类加载和字节码校验;最后,Java字节码经过JVM的解释为具体平台的具体指令,并执行。2.名词解释JVM、JRE、JDKJVM (Java Virtual Machine)称之为Java虚拟机,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实 现的。JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。 JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。JRE(Java SE Runtime Environment)称之为Java SE运行时环境,提供了运行Java应用程序所必须的软件环境,包含有Java虚拟机(JVM)和丰富的类库(Libraries)。无论是开发Java 应用还是仅仅运行一个已经开发好的Java应用都必须安装JRE。JDK( Java Development Kit)称为Java开发工具包,是JRE的超集,或者说JDK包含了JRE。JDK中除了包含有JRE的所有内容之外还提供了编写Java程序所必须的 编译器和调试工具等。对于编写Java开发的人士一般需要下载JDK,目前的主流版本为JDK 6。3.变量的命名可以由字母、数字、“_”或“$”符组成,但是不能以数字开头。中文可以作为变量名,但不提倡使用。Java大小写敏感,即:严格区分大小写,在给命名变量时需要注意。不能使用Java保留字(一些Java语言规定好的,有特殊含义的字符),如:int、if、else、for、break等。4.Unicode字符类型char事实上是一个16位无符号整数(都是正数),这个值是对应字符的编码,Java字符类型采用Unicode字符集编码(通用码、统一码、万国码),而Unicode是世界通用的定长字符集,所有的字符都是16位(2个字节)来表示。5.在对char型变量赋值时,可以采用如下三种方式: 字符直接量:形如A,变量中实际存储的是该字符的Unicode编码(无符号整数值),一个char型变量只能存储一个字符。 整型直接量:范围在065535之间的整数,变量中实际存储的即该整数值,但表示的是该整数值所对应的Unicode字符。 Unicode形式:形如u0041,Unicode字符的16进制形式。6.不同基本类型转换不同的基本类型直接可以相互转化,主要有两种方式: 自动类型转化(隐式类型转换):从小类型到大类型可以自动完成。类型的大小关系如下图 - 3所示:图- 3强制转化:从大类型到小类型需要强制转换符,语法如下:(需要转换成的类型变量因为大类型的精度值大于小类型,取值范围大于小类型,所以,当使用强制转化时,有可能会造成精度的损失或者溢出,所以,在使用强制转化时要求显式的告诉编译器,正在进行强制转换。7.赋值表达式本身也有值,其本身之值即为所赋之值。 8.使用switch时需要注意两个问题:第一,case后面的常量值必须不同,第二,switch后面的整型表达式的值必须是整型或字符型。从JDK 7.0开始,switch-case可以支持字符串表达式,将更加方便程序的操作。 switch(整型表达式) case 整型常量值1: /入口1 语句1; 语句2; case 整型常量值2: /入口2 语句3; default: /默认入口 语句n; 9. 关于for循环for的三个表达式都可以省略,但分号不能省略表达式1和3中可以有逗号break终止循环,continue跳过循环体中的剩余语句,进入下一次循环10. 声明数组的语法为: 数据类型 数组名 = new 数据类型 大小 ,int arr 与 int arr 两种写法均可静态初始化数组(组声明的同时进行初始化)int arr = 10,23,30,-10,21 ;此种写法只能用于声明时的初始化,不能用于先声明后赋值的情况动态初始化数组(对于已声明的数组)int arr;arr = new int 10,23,30,-10,21 ;注意:new之后的中不可以写长度,而元素的个数就是数组的长度。11. 数组的复制 System.arraycopy方法用于数组复制若想实现数组的复制,可以使用System.arraycopy( )方法,其结构如下:publicstaticvoid arraycopy(Object src, int srcPos,Object dest, int destPos, int length)如上代码的,每一个参数的意义见下列表:src:源数组srcPos:源数组中的起始位置dest:目标数组destPos : 目标数组中的起始位置length:要复制的数组元素的数量通过下面的代码,可实现数组的复制:int a = 10 ,20 ,30 ,40 ,50 ;int a1 = new int 6 ;System.arraycopy( a , 1 , a1 , 0 , 4 ); 结果:20,30,40,50如上方法的意义可以理解为:将a数组的从下标1开始的4个元素复制到a1数组中,a1数组从下标0位置开始赋值。程序执行完后,a1的值为20,30,40,50,0,0。其交互效果如图 3所示:图- 3 Arrays.copyOf方法用于数组复制使用java.util.Arrays类的copyOf方法可实现数组的复制,其结构如下所示:类型 newArray = Arrays.copyOf ( 类型 original , int newLength )Arrays.copyOf()方法示例代码如下所示:int a = 10,20,30,40,50 ;int a1 = Arrays . copyOf ( a, 6 );上段代码执行后,a1的结果为:10 20 30 40 50 0,分析其执行过程为:声明一个整型数组,数组变量名称为a,赋初始值为10 20 30 40 50,声明整型数组a1,将a数组数据复制到a1数组,设置其为6个长度,因a数组只有5个元素,所以最后一位补0。故而输出结果为10 20 30 40 50 0。总结出Arrays.copyOf()方法的特点如下列表所示:生成的新数组是原始数组的副本;newLength小于源数组,则进行截取;(自己通过代码演示效果);newLength大于源数组,则用0或 null进行填充; 数组的“扩容”Java语法规定,数组的长度在创建后是不可改变的,这点需要明确。而所谓的扩容实际上是指创建一个更大的新数组并将原有数组的内容复制到其中。可以通过Arrays.copyOf()方法,简便的实现数组的扩展,代码如下:int a = 10,20,30,40,50 ;a = Arrays . copyOf ( a, a.length+1 );上段代码执行后,输出a数组的数据为:10,20,30,40,50,0。此时a数组的长度为6,实现了所谓的“扩容”。12.简述JVM垃圾回收机制垃圾回收机制是Java提供的自动释放内存空间的机制。垃圾回收器(Garbage Collection,GC)是JVM自带的一个线程(自动运行着的程序),用于回收没有任何引用指向的对象。Java程序员不用担心内存管理,因为垃圾收集器会自动进行回收管理。13.Java程序是否会出现内存泄露会出现内存泄漏。一般来说内存泄漏有两种情况。一是在堆中分配的内存,在没有将其释放掉的时候,就将所有能访问这块内存的方式都删掉;另一种情况则是在 内存对象明明已经不需要的时候,还仍然保留着这块内存和它的访问方式(引用)。第一种情况,在Java中已经由于垃圾回收机制的引入,得到了很好的解决。 所以,Java中的内存泄漏,主要指的是第二种情况。14.JVM如何管理内存,分成几个部分?分别有什么用途?JVM内存分为“堆”、“栈”和“方法区”三个区域,分别用于存储不同的数据。堆内存用于存储使用new关键字所创建的对象;栈内存用于存储程序运行时在方法中声明的所有的局部变量;方法区用于存放类的信息,Java程序运行时,首先会通过类装载器载入类文件的字节码信息,经过解析后将其装入方法区。类的各种信息(包括方法)都在方法区存储。例:Foo foo = new Foo();foo.f();以上代码的内存实现原理为:1.Foo类首先被装载到JVM的方法区,其中包括类的信息,包括方法和构造等。2.在栈内存中分配引用变量foo。3.在堆内存中按照Foo类型信息分配实例变量内存空间;然后,将栈中引用foo指向foo对象堆内存的首地址。4.使用引用foo调用方法,根据foo引用的类型Foo调用f方法。15.继承使用继承可以实现代码的重用,在java语言中,需要通过extends关键字实现类的继承。继承完成后,子类(Sub class)可以继承父类(Super class)的成员变量及成员方法,同时子类也可以定义自己的成员变量和成员方法。届时,子类将具有父类的成员及本类的成员。java语言不支持多重继承,即:一个类只能继承一个父类,但一个父类可以有多个子类。java规定,子类在构造之前必须先构造父类。事实上,子类的构造方法中是必须要通过super关键字来调用父类的构造方法的,这样才可以保证妥善的初始化继承自父类的成员变量。如果子类的构造方法中没有调用父类的构造方法,则java编译器会自动的加入对父类无参构造方法的调用。在子类构造方法中没有写super调用父类构造方法,这时编译器会默认添加super()来调用父类的无参构造方法,但是父类中又没有定义无参的构造方法,因此会发生编译错误。针对上面的问题,可以有两种解决方案,方案一为在父类中添加无参的构造方法,方案二为在子类构造方法中显示调用父类的有参构造方法(常常使用),这样可以保证父类的成员变量均被初始化,声明了父类型的引用来指向子类型的对象。但是通过父类的引用只能访问父类所定义的成员,而不能访问子类所扩展的部分。16.重写和重载的区别 重载: 是指在一个类中定义多个方法名相同但参数列表不同的方法,在编译时,根据参数的个数和类型来决定绑定哪个方法。 重写: 是指在子类中定义和父类完全相同的方法,在程序运行时,根据对象的类型(而不是引用类型)而调用不同的方法。首先,重载遵循所谓“编译期绑定”,即在编译时根据参数变量的类型判断应该调用哪个方法重写遵循所谓“运行期绑定”,即在运行的时候,根据引用变量所指向的实际对象的类型来调用方法17.import import中的*只代表类,不代表包。import 名名.*”语句并不包含该名的子包中的类。在Eclipse中,可以使用“Ctrl+Shift+O”,自动完成import语句。18、封装的意义(待补充)降低代码出错的可能性,更便于维护。当内部实现细节改变时,只要保证对外的功能定义不变,其他的模块不需要更改。19.访问控制修饰符private修饰的成员变量和方法仅仅只能在本类中调用,而public修饰的成员变量和方法可以在任何地方调用。使用protected修饰的成员变量和方法可以被子类及同一个包中的类使用。而默认访问控制即不书写任何访问控制符,默认访问控制的成员变量和方法可以被同一个包中的类调用。private修饰的内容是对内实现的封装,如果“公开”它将会增加维护的成本。public修饰的内容是对外提供的可以被调用的功能,需要相对稳定。对于类的修饰可以使用public和默认方式。 其中,public修饰的类可以被任何一个类使用,而默认访问控制的类只可以被同一个包中的类使用。而protected和private访问修饰符是不可以修饰类的,但其可以修饰内部类。20.static关键字static修饰成员变量:static关键字可以修饰成员变量,它所修饰的成员变量不属于对象的数据结构,而是属于类的变量,通常通过类名来引用static成员。当创建对象后,成员变量是存储在堆中的,而static成员变量和类的信息一起存储在方法区, 而不是在堆中,一个类的static成员变量只有“一份”(存储在方法区),无论该类创建了多少对象。static修饰方法:通常的方法都会涉及到对具体对象的操作,这些方法在调用时,需要隐式的传递对象的引用(this)。static方法中是不可以使用this关键字的。另外,由于static在调用时没有具体的对象,因此在static方法中不能对非static成员(对象成员)进行访问。static块static块为属于类的代码块,在类加载期间执行的代码块,只执行一次,可以用来在软件中加载静态资源(图像、音频等等)21. final关键字final修饰变量:final关键字修饰变量,意为不可改变。final可以修饰成员变量,也可以修饰局部变量,当final修饰成员变量时,可以有两种初始化方式:声明同时初始化构造函数中初始化final关键字修饰局部变量,在使用之前初始化即可。final修饰方法final关键字修饰的方法不可以被重写。使一个方法不能被重写的意义在于:防止子类在定义新方法时造成的“不经意”重写。final修饰类final关键字修饰的类不可以被继承。使一个类不能被继承的意义在于:可以保护类不被继承修改,可以控制滥用继承对系统造成的危害。在JDK中的一些基础类库被定义为final的,例如:String、Math、Integer、Double 等等。static final常量static final 修饰的成员变量称为常量,必须声明同时初始化,并且不可被改变。常量建议所有字母大写。实际应用中应用率较广,因为static final常量是在编译期被替换的,可以节约不必要的开支,22.抽象方法和抽象类由abstract修饰的方法为抽象方法,抽象方法只有方法的定义,没有方法体实现,用一个分号结尾。即方法五要素中,抽象方法缺少了一要素(即:方法体)。也可以将抽象方法理解为不完整的方法。若将抽象方法包含在类中,则该类也应该为抽象的,可以理解为,该类也不完整。抽象类由abstract关键字声明。抽象类是不能实例化对象的,而一个类不能实例化是没有意义的,所以,需要定义类来继承抽象类,而如果一个类继承了抽象类,则其必须重写其抽象方法(变不完整为完整),除非该类也声明为抽象类。抽象类不可以实例化,即使一个类中没有抽象方法,也可以将其定义为抽象类,同样,该类不可以实例化。需要注意一点:abstract和final关键字不可以同时用于修饰一个类,因为final关键字使得类不可继承,而abstract修饰的类如果不可以继承将没有任何意义。两者放在一起,会起冲突。23.抽象类的意义定义抽象类的意义在于:1 为其子类提供一个公共的类型(父类引用指向子类对象);2 封装子类中的重复内容(成员变量和方法);3 定义有抽象方法,子类虽然有不同的实现,但该方法的定义是一致的。(子类需要实现此抽象方法)。24.接口接口可

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论