声明:以下内容为个人期末对JAVA基础知识的总结,来源于各种资料搜索和个人理解整理而出,也许有不妥的地方,欢迎学习指教
1.Java语言具有可移植性、可跨平台运行特点的原因是什么?
Java——编译器——jvm——平台
Java用编译器编译成.class的字节码文件,字节码类似于机器指令,同一字节码可以在任何带jvm虚拟机的平台运行,从而实现java的跨平台性。所谓语言的跨平台性并不是说是源文件的跨平台性(如果要这么定义那么任何的语言都是跨平台性的),而是指源文件编译生成的文件的跨平台性。因为Java字节码是结构中立的,所以Java 的程序是可移植的。他们可以不经过重新编译而在任何一个机器上运行。
2.为什么说Java语言具有健壮、安全的特性?
Java 编译器检测出许多别的语言只有在首次执行的时候才会指出的问题。
Java 已经清除了几种在其它语言中被发现易于出错的编程结构。
Java具有运行时异常处理特性,垃圾回收机制,它为健壮性提供了编程支持。
Java 实现了几种安全机制以保护你的系统遭受危险程序的破坏 。
3.简述Java虚拟机(JVM)的作用是什么?
JVM就是Java虚拟机,它是一个虚构出来的计算机,可在实际的计算机上模拟各种计算机的功能。JVM有自己完善的硬件结构,例如处理器、堆栈和寄存器等,还具有相应的指令系统。JVM是java字节码执行的引擎,还能优化java字节码,使之转化成效率更高的机器指令。Java程序的跨平台特性主要就是因为JVM实现的。在编译java程序时会将写好的源程序通过编译器编译生成.class文件(又称为字节码文件),不同的平台对应着不同的JVM,之后就是通过JVM内部的解释器将字节码文件解释成为具体平台上的机器指令执行,所以就可以实现java程序的跨平台特性。
4.简述JVM的垃圾回收机制。
确保被引用对象的内存不被错误的回收。当一个对象不再有任何一个引用变量指向它时,这个对象就被应用抛弃。Jvm会自动回收那些不再被引用的对象的内存空间,这就是jvm回收机制。
如果你认为不再需要某个对象时,可以显式地给该对象的引用变量赋null值,如果该对象没有被任何引用变量所引用,java虚拟机将自动回收它所占的空间。
5.简述软件开发的过程。
软件开发过程包括:需求规范、系统分析、系统设计、实现、测试、部署、维护。
6.什么是短路运算符“(short-circuit operator)?试举例说明。
短路运算符就是我们常用的“&&”、“||”,一般称为“条件操作”。
“&&”运算符检查第一个表达式是否返回“false”,如果是“false”则结果必为“false”,不再检查其他内容。
“||”运算符检查第一个表达式是否返回“true”,如果是“true”则结果必为“true”,不再检查其他内容。
7.简述使用JDK中的调试工具jdb时,可以使用的调试方法。
略..........
8.什么是Unicode编码?
Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
Unicode码是由Unicode协会建立的一种编码方案。它支持使用世界各种语言所书写的文本的交换、处理和显示。Unicode码一开始 被设计为16位的字符编码。基本数据类型char试图通过提供一种能够存放任意字符的简单数据类型来利用这个设计。但是,一个16位的编码所能产生的字符只有65 536个,它是不足以表示全世界所有字符的。因此,Unicode标准被扩展为1112 064个字符。这些字符都远远超过了原来16位的限制,它们称为补充字符(supplementary character)。
9.什么是函数签名(Method signature)?试举例说明。
函数签名(或者类型签名,抑或方法签名)定义了函数或方法的输入与输出。
签名可包含以下内容:参数及参数的类型,一个的返回值及其类型,可能会抛出或传回的异常,该方法在面向对象程序中的可用性方面的信息(如public、static或prototype)。
在Java中,方法签名包括方法名和参数列表,返回值和函数上声明的异常并不属于函数签名的构成部分。下两个函数签名不同:
doSomething(String[] y);
doSomething(String y)
10.Java语言中,函数的参数传递有哪几种?不同类型参数传传递的区别是什么。试举例说明。
java的方法参数传递方式有两种,按值传递和引用传递。值传递的时候,将实参的值copy一份给形参,在方法内部改变参数的值,外部数据不会跟着发生改变。引用传递的时候,将实参的地址值copy一份给形参,在方法内部修改对象的内容,外部数据也会跟着发生改变。
值传递:
int i = 10;
add(i);
void add(int temp){
temp +=5; }
引用传递:
class Person {
String name = "java";
public void setName(String name){
this.name = name; }
}
void changeName (Person p1){
p1.setName("javascript");
}
public static void main (String[] args){
Person p = new Person(); changeName(p);
}
11.什么是局部变量?什么是局部变量的作用域?可不可以在一个函数声明名字相同的变量多次?局部变量的初始化与实例变量的初始化有什么异同?
在方法中定义的变量成为局部变量。
局部变量作用域:从声明该变量的地方开始,直到包含该变量的块结束为止。局部变量都必须在使用之前进行声明。可以在一个方法的不同块里声明相同的变量多次, 但是不能在嵌套块或同一块中两次声明同一变量。
成员变量无需初始化,只要为一个类定义了类变量或实例变量,系统就会在这个类的准备阶段或创建该类的实例时进行默认初始化。局部变量必须经过初始化之后才能使用,系统不会为局部变量执行初始化。
12.如何声明一个数组引用变量,如何创建一个数组?什么时候为数组分配内存?什么是数组的越界访问?怎样避免下标越界?
元素类型[] 数组引用变量;
举例:double[] myList;
数组引用变量 = new 元素类型[数组大小];
举例:myList = new double[10];
元素类型[] 数组引用变量 = new 元素类型[数组大小];
可简化为:double[] myList =new double[10];
Java在声明数组时并不为数组元素分配内存,除非数组已经创建,否则不能给它分配任何元素。当创建时用到运算符new时才在堆中为数组分配内存。
如果一个数组定义为有n个元素,那么,对这n个元素(下标为0 到 n-1的元素)的访问都合法,如果对这n个元素之外的访问,就是非法的,称为“越界。当访问超过数组下标时,数组越界访问。
解决方法:可以用传递数组元素个数的方法即:用两个实参,一个是数组名,一个是数组的长度。
13.什么是不规则数组(ragged array,锯齿数组),试举例说明。
二维数组中的每一行本身就是一个数组,因此,各行的长度就可以不同。这样的数组称为锯齿数组(ragged array)。使用语法new int[5][]创建数组时,必须指定第一个下标。语法new int[][]是错误的。
int[][] jagged = new int[3][];
jagged[0] = new int[2] {1,2 };
jagged[1] = new int[6] { 3,4,5,6,7,8};
jagged[2] = new int[3] { 9,10,11};
14.什么是构造函数?构造函数有返回值吗?构造函数如何命名?构造函数可以重载吗?什么是缺省构造函数(default constructor,默认构造函数)?什么情况下,系统才会自动给一个类提供缺省构造函数?
构造函数是一种特殊的方法。主要用来在创建对象时初始化对象,没有返回值。构造函数的名字必须与类型同名。构造函数可以重载,一个类可定义多个构造函数,具有相同的名字,参数个数或参数类型不同。在建立对象时不必给出实参的构造函数,成为缺省构造函数。
一个类可以不定义构造方法,在这种情况下,类中隐含定义一个方法体为空的无参构造方法,这个构造方法称为缺省构造方法。每个类都有构造函数,如果没有定义,则系统自动生成一个缺省的构造函数。在对多个对象进行相同的初始化时,运用缺省构造函数较为方便。
Class T{
Public int a;
T(){
a=1;}
}
15.操作符new的作用是什么?构造函数的作用是什么?什么时候会被调用?构造函数的执行顺序是什么(父类与子类的构造函数)?
new操作符通过为新对象分配内存并返回对该内存的引用来实例化类。new运算符也调用对象构造函数。
构造函数用来处理对象的初始化,不需要用户来调用,建立对象时自动执行。在父类与子类的构造函数执行中,先父类后子类,在类自身与其数据成员的构造函数执行中,先自身后数据成员。
构造方法的执行顺序:①如果子类没有定义构造方法,则调用父类的无参构造方法,再调用子类的缺省构造方法;②如果子类定义了构造方法,且其第一行没有super,则不论子类构造方法是有参数还是无参数,在创建子类对象时,首先执行父类的无参构造方法,然后执行子类的构造方法。若子类第一行是有参数或无参数的super,则直接转到对应的有参或无参父类构造方法中,且该语句作为子类构造方法的第一条语句;③如果子类调用父类有残构造方法,可以通过super(参数)调用所需的父类构造方法,且该语句作为子类构造方法的第一条语句。
16.什么是引用类型?试举例画图说明基本类型变量和引用类型变量的区别。试举例说明基本类型变量的复制操作(=)和对象类型变量的复制操作(=)有何不同。
(1)引用类型:引用是一种数据类型(保存在栈中),保存了对象在内存(heap,堆空间)中的地址,这种类型既不是我们平时所说的简单数据类型也不是类实例(对象);
(2)基本类型变量和引用类型变量的区别:对于基本变量来说,对应内存所存储的值是基本类型值。对引用类型变量来说,对应内存所存储的值是一个引用,是对象的存储地址。
(3)基本类型变量的复制操作(=)和对象类型变量的复制操作(=)的区别:对基本变量而言,就是将一个变量的实际值赋给另一个变量。对引用类型变量而言,就是将一个变量的引用赋给另一个变量。
17.什么是实例变量、实例函数、静态变量、静态函数。调用实例函数与静态函数有何异同。静态变量的作用域是什么?
实例变量:也叫做对象变量,是在类声明的内部但是在类的其他成员方法之外声明的。属于一种特定的实例。
实例方法:也叫做对象方法,被类的实例调用,是属于类的某个对象的。
静态变量:由关键字static修饰的变量,被类的所有实例所共享
静态方法:由关键字static修饰的方法,不绑定到某个特定的对象,即不需要创建对象就可以直接用类名.方法名(参数列表);进行使用。
实例函数可以调用实例函数,静态函数,以及访问实例数据域或静态数据域。静态函数可以调用静态函数及访问静态数据域。然而静态方法不能调用实例方法或者访问实例数据域。
静态变量:被类中的所有对象共享,无论变量在哪里声明。
18.java中,当类的成员前用private、protected、public、默认(成员前无任何修饰符)修饰时,成员的可访问性分别是什么?
public:类、数据或方法对在任何包中的任何类都是可见的。
private:数据或方法可以被声明它的类访问。
protected:允许子类访问定义在父类中的数据域或方法,不允许非子类访问这些数据域和方法。
默认:同一个包内可访问。
19.什么是不可变类(Immutable Classes)、不可变对象(Immutable Objects)?以String为例,说明不可变类的优点?
(1)一旦创建其内容就不能再改变的对象称为不可变对象,它的类被称为不可变类。如果一个类是不可变的,那么它所有的数据域必须都是私有的,而且没有对任何一个数据域提供公共的set方法。一个类的所有数据域都是私有的且没有修改器并不意味着它一定是不可变类。(为了防止用户修改,可把类定义为不可变类)
要使一个类称为不可变的,它必须满足以下的要求:所有数据域都是私有的;没有修改器方法;没有一个返回指向可变数据域的引用的访问器方法。
(2)String:String为不可变类,保证了String类的安全和效率。从安全上讲,因为不可变类的对象不能被改变,他们可以在多个线程之间进行自由共享;从效率上讲,设计成final,JVM可以直接定位到String类的相关方法上,提高执行效率。
对于String不可变类来说,不可变类更加的安全,效率更好;
1.因为对象的内容不能被改变,所以在多个线程同时读一个资源的时候,不会引发竞态条件的,并且在写资源的时候,String不能写,所以线程安全;
2.便于实现String缓冲池,对于相同字符串的String引用变量,他们都指向池中的同一个内存地址,对于大量使用字符串的情况下,可以节约空间,提高效率
3.因为String类是不可变类,所以可以防止程序员错误的修改变量的值,使得程序更加的安全。
20.简述类的下述设计原则:内聚性、分担责任、重用、一致性、清晰性、封装性。
内聚性:类应该描述一个单一的实体,而所有的类操作应该在逻辑上相互配合,支持一个一致的目的。
分担责任:如果一个实体担负太多的职责,就应该按各自职责将它分为几个类。如:String类、StringBuffer类和StringBuilder类都用于处理字符串,但是它们的职责各有不同。String类处理不可变字符串,StringBuilder类创建可变字符串,StringBuffer和StringBuilder类似,只是StringBuffer类还包括更新字符串的同步方法。
重用:类是为了重用而设计的,用户可以以不同的组合和顺序,在不同环境中合并多个类。因此,应该设计一个类,这个类应该没有对用户使用它的目的及使用时间的限制,设计属性以确保用户可以按值的任何顺序和任何组合来设置属性,所设计的方法实现的功能应该与它们出现的顺序无关。
一致性:遵循标准Java程序设计风格和命名习惯,为类、数据域和方法选取具有信息的名字
封装性:一个类应该使用 private 修饰符隐藏其数据,以免用户直接访问它。这使得类更易于维护。
清晰性:为使设计清晰 ,内聚性 、一致性和封装性都是很好的设计原则。除此之外,类应该有一个很清晰的合约,从而易于解释和理解。
完整性:类是为许多不同用户的使用而设计的。为了能在一个广泛的应用中使用,一个类应该通过 属性和方法 提供多种方案以适应用户的不同需求。例如:为满足不同的应用需求,String 类包含了 40 多种很实用的方法。
21.什么是关联?什么是聚集?什么是组合?聚集和组合的UML图标识是什么?
(1)关联:是一种常见的二元关系,描述两个类之间的活动。例如:学生选取课程是Student类和Course类之间的一种关联,而教师教授课程是Faculty类和Couese类之间的关联。关联由两个类之间的实线表示,可以有一个可选的标签描述关系。
(2)聚集:是关联的一种特殊形式,代表两个类之间的归属关系。聚集建模has-a关系。所有者对象被称为聚集对象,它的类称为聚集类。而从属对象被称为被聚集对象,它的类称为被聚集类。
(3)组合:一个对象可以被多个其他的聚集对象所拥有,如果一个对象只归属于一个聚集对象,那么他和聚集对象之间的关系就称为组合。例如:“一个学生有一个名字”就是学生类Student和名字类Name之间的一个组合关系,而“一个学生有一个地址”是学生类Student和地址类Address之间的一个聚集关系,因为一个地址可以被几个学生所共享。
在UML中,附加在聚集类上的实心菱形表示他和被聚集类之间具有组合关系,而附加在聚集类上的空心菱形表他和被聚集类之间具有聚集关系。
关系的强弱:组合 > 聚集 > 关联 > 依赖
22.简述生成子类对象时,如何调用父类的构造函数?
在子类构造方法中,用关键字super调用。
若没有显式使用关键字super,将自动调用父类无参构造方法。
构造方法用于构建一个类的实例。不同于属性和普通方法,父类的构造方法不会被子类继承。它们只能使用关键字super从子类的构造方法中调用。语句super()调用父类的无参构造方法,而语句super(parameters)调用与参数匹配的父类构造方法。语句super()和super(parameters)必须出现在子类构造方法的第一行,这是显式调用父类构造方法的唯一方式。如果没有显式使用关键字super,那么将自动调用父类的无参构造方法。
23.什么是构造函数链?关键字super的作用是什么?使用super时应注意什么?
构造一个类的实例时,将会调用沿着继承链的所有父类的构造函数。这就被称为构造函数链(constructor chaining)。
关键字super代指父类,可以用于调用父类的普通方法和构造方法。
super访问构造方法必须出现第一句。this 和 super 访问构造方法不能同时存在一个构造函数中。super()指的是对象,均不可以在static环境中使用。包括:static变量,static方法,static语句块。
24.java中,什么是函数覆盖?什么是函数重载?试比较覆盖与重载?java中的重载与C++的重载有何不同。试举例说明。
方法覆盖:子类从父类中继承方法。有时,子类需要修改父类中定义的方法的实现,这个操作被称作覆盖(method overriding)。仅当实例方法是可访问时,它才能被覆盖。因为私有方法在它的类本身以外是不能访问的,所以不能覆盖它。如果子类中定义的方法在父类中是私有的,那么这两个方法完全没有关系。
方法重载:方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数。
比较:
重载意味着使用同样的名字但是不同的签名来定义多个方法,重写意味着在子类中提供一个对方法的新的实现。
方法重写发生在通过继承而相关的不同类中,方法重载可以发生在同一个类中,也可以发生在由于继承而相关的不同类中。
方法重写具有同样的签名和返回值类型,方法重载具有同样的名字,但是不同的参数列表。
Java中一个类的函数重载可以在本类中的函数和来自父类中的函数之间进行,而C++类中的函数重载只能是本类中的(即不包括来自父类的函数)
25.简述多态的概念和多态的意义。
多态的概念:根据实际的对象类型决定函数调用的具体目标,同样的调用语句在实际运行时有多种不同的表现形态
多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)
Java多态必要条件:必须有继承关系,必须有方法覆盖,必须有父类引用指向子类对象。
多态意味着父类的变量可以指向子类对象,降低了代码的耦合性,简化了书写,从某种程度上来说,提高了效率,也提高程序的可复用性,扩充性和可维护性
1.可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
3.接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。
4.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
5.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
26.什么是引用变量的声明类型?什么是引用变量的实际类型?什么是动态绑定?
Object o = new GeometricObject(); System.out.println(o.toString());
一个变量必须被声明为某种类型。变量的这个类型称为它的声明类型。这里,o的声明类型Object。一个引用类型变量可以是一个null值或者是一个对声明类型实例的引用。变量的实际类型是被变量引用的对象的实际类。这里o的实际类型是GeometricObject,因为o指向使用new GeometricObject()创建的对象。o调用哪个toString()方法由o的实际类型决定,这称为动态绑定。当从引用变量调用实例方法时,该变量的实际类型在运行时决定使用该方法的哪个实现,这称为动态绑定。
27.父类与子类的引用变量之间,在互相转换时,转换规则是什么?instanceof运算符的作用是什么?试举例说明。
(1)对象的引用可以类型转换为对另外一种对象的引用,这称为对象转换。
总是可以将一个子类的实例转化为一个父类的变量,称为向上转换,因为子类的实例永远是它父类的实例。
当把一个父类的实例转换为它的子类变量时(称为向下转换),必须使用转换记号“(子类名)”进行显式转换,向编译器表明你的意图。
如:Apple x = (Apple)fruit;
(2)使用instanceof运算符来检测一个对象是否是另一个对象的实例:
Object myObject = new Circle();
... // Some lines of code
if (myObject instanceof Circle) {
System.out.println("The circle diameter is " + ((Circle)myObject).getDiameter());
……
}
28.试比较equals函数和比较操作符“==”。
equals()函数比较两个对象的内容。如果想让equals函数能够判断两个对象是否具有相同的内容,可以在定义这些对象的类时,覆盖equals函数。
比较运算符= =用来比较两个基本数据类型的值是否相等,或者判断两个对象是否具有相同的引用。
29.什么是this引用变量,其作用是什么?通过this调用同一个类的构造主法时,此语句是否可以出现在构造函数的任意位置上?
This是指向调用对象本身的引用名。它可以在构造方法内部用于调用同一类的其他构造方法,也可以引用对象的实例成员。
This在构造函数中应出现在任何可执行语句之前。
30.简述final修饰类、变量、函数时,其作用是什么。
final修饰类是不能被继承
fianl修饰方法不能在子类中被覆盖,可直接使用
final修饰变量,称为常量,初始化以后不能改变值。
31.定义一个子类时,使用哪一个关键字表示继承?什么是单一继承?什么是多重继承?Java支持多重继承吗?为了实现类似多重继承的功能,在java中应该如何做?
Extends
一个java类只可能直接继承自一个父类,这种限制称为单一继承。
允许从几个类中派生出一个子类的的能力称为多重继承。
Java中通过接口来实现多重继承。
32.简述与使用if语句处理异常相比,使用throw-try-catch-finally语句处理异常有什么优点。
可以抛出一个异常并被catch块捕捉,并且强制执行finally语句块;将检测错误从处理错误中分离出来。
33.异常处理的优点和缺点分别是什么?
异常处理的优点:它能使方法抛出一个异常给它的调用者。这个调用者可以处理该异常。
如果没有这个能力,那么被调用的方法就必须自己处理异常或终止该程序。异常处理将错误处理代码从正常的程序设计任务中分离开,这样,程序会更易阅读和修改。
缺点:由于异常处理需要初始化新的异常对象,需要从调用栈返回而且还需要沿着方法调用链来传播异常以便找到它的异常处理器,所以,异常处理通常需要更多的时间和资源
34.简述异常处理的过程。如何定义一个自定义异常类?关键字throw和throws的作用分别是什么?
声明、抛出和捕获异常。
Java提供相当多的异常类,尽量使用API中的异常类。如果预定义的类不够则定义自定义的异常类。通过扩展Exception类或其子类定义自定义的异常类。
throw和throws的作用:
throw关键字作用是抛出一个异常,抛出的时候是抛出的是一个异常类的实例化对象
throws关键字声明的方法表示此方法不处理异常,而交给方法调用处进行处理。(声明异常)
35.简述try{…}catch(….){….}catch(….){….}结构的工作过程。
工作过程:如果在执行try块的过程中没有出现异常,则跳过catch子句。如果try块中的某条语句抛出一个异常,Java就会跳过try块中的剩余语句,然后开始查找处理这个异常的代码过程。从第一个到最后一个逐个检查catch块,判断在catch块中的异常类实例是否是该异常对象的类型。如果是,就将该异常对象赋值给所声明的变量,然后执行catch块中的代码。如果没有,Java会退出这个方法,把异常传递给调用这个方法的方法,继续同样的过程来查找处理器。如果在调用的方法链中找不到处理器,程序就会终止并在控制台上打印出错误信息。
36.什么是是检查型异常(checked exceptions)?什么是非检查型异常(unchecked exceptions)?
RuntimeException、Error以及它们的子类都被称为非检查型异常。
所有其它异常都被称为检查型异常(checked exceptions),意思是编译器会强制程序员检查并处理它们。
37.什么是抽象类型?抽象类的作用是什么?抽象类是否可实例化?
Java中可以定义没有方法体的方法,该方法由其子类来具体的实现。该没有方法体的方法我们称之为抽象方法,含有抽象方法的类我们称之为抽象类。
作用:通过继承它实现多态,后期绑定,可以为将来要实现的东西做好接口,更利于代码的维护和重用。接口就是更纯粹的抽象类。
*不能使用new操作符来实例化抽象类。可以定义它的构造方法,这个构造方法被它子类的构造方法中调用。
38.接口是什么?接口的作用是什么?如何定义一个接口?如何使用一个接口?接口可不可以实例化?
接口(interface)是一种与类相似的结构,它只包含常量和抽象方法。
接口在许多方面都与抽象类很相似,但是它的目的是指明多个对象的共同行为。
为了区分接口和类,Java采用下面的语法来定义接口:
(1)定义一个接口:
修饰符 interface 接口名{
/常量声明/
/方法签名/
}
(2)使用接口:使用implements实现接口继承
...implements 接口名称[, 其他接口名称, 其他接口名称..., ...] ...
class A implements B{
}//通过A来实现这个接口B
*由于接口中所有的数据域都是public final static而且所有方法都是public abstract ,所以Java允许忽略这些修饰符。
*不能使用new操作符创建接口的实例。
39.什么是浅复制(Shallow Copy)和深复制(Deep Copy)?如何实现深复制?
浅拷贝,并不拷贝对象本身,仅仅是拷贝指向对象的指针;深拷贝是直接拷贝整个对象内存到另一块内存中。
(1)浅复制:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
(2)深复制:被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。
实现深复制:
- 通过在调用构造函数进行深复制
- 重载clone()方法
40.从数据成员、构造函数、成员函数三方面对比一下接口与抽象类。
|
变量(数据成员) |
构造方法 |
成员方法 |
抽象类 |
无限制 |
子类通过构造方法连调用构造方法,不能用new操作符实例化 |
无限制 |
接口 |
所有的变量必须是public static final |
没有构造方法,接口不能用new操作符实例化 |
所有的方法必须是公共的抽象实例方法 |
41.JavaFX中,什么是舞台(Stage), 场景 (Scene), 节点(Nodes)?三者之间的关系是什么?面板(pane)作用是什么?
舞台(Stage):是JavaFX用户接口的顶级容器,用Stage类表示。在Windows中,它通常就是一个窗口。当JavaFX启动时,一个舞台被自动创建,并通过参数传递给start方法。
场景:用以管理控件和其他节点。
节点:节点是可视化组件。比如一个形状、一个图像视图、一个UI组件或者一个面板。
三者之间的关系:舞台是用于显示一个场景的窗体,可以将一个节点加入到一个场景中(节点置于场景中,场景设置于舞台中。)
面板作用:将节点放入其中,并自动的将节点布局在一个希望的位置和大小,将节点布局在一个面板中,再将面板布局在一个场景中。
42.JavaFX中,什么是属性绑定?有哪两种属性绑定?
属性绑定:可以将一个目标对象绑定到源对象中。源对象的修改将自动反映到目标对象中。
将一个目标对象和一个源对象绑定。如果源对象中的值改变了,目标对象也将自动改变。目标对象称为绑定对象或者绑定属性,源对象称为可绑定对象或可观察对象。
单向绑定:一个属性的改变将反映到另一个对象上,反之不行。
双向绑定:一个属性的改变将反映到另一个对象上,反过来也一样,这称为双向绑定。
43.描述面板StackPane、FlowPane、GridPane、Borderpane、HBox、VBox的布局特点是什么。
44.简述JavaFX中一个事件从触发到被处理的过程。
一个源对象触发一个事件,然后一个对该事件感兴趣的对象(事件处理器/事件监听者)来处理它。
45.什么是事件源对象?什么是事件对象?描述两者之间的关系。
产生一个事件并触发它的组件称为事件源事件。
一个事件对象包含与事件相关的任何属性,是从一个事件源上产生的对象。
事件是从一个事件源上产生的对象。触发一个事件意味着产生一个事件并委派处理器处理该事件。
46.文本IO与二进制IO有何区别?
二进制IO不涉及编码和解码,因此比文本IO更高效。文本IO是建立在二进制IO的基础上,它能提供一层抽象,用于字符层的编码与解码。对于文本I/O而言,编码和解码是自动进行的。
(1)文本IO需要进行编码和解码。写入字符是,JVM将Unicode转化为特定文件编码,而读取时,反之;
(2)二进制IO不需要转化。如果文件写入字节,就是将原始的字节复制到文件中。当从文件读取字节时,就会返回文件的确切字节。
47.什么是内部类?什么是匿名内部类?
内部类:或称嵌套类。是定义在另一个类范围中的类,内部类对于定义处理器类非常有用。
匿名内部类:没有名字的内部类,将进一步实现定义一个内部类以及创建一个内部类的实例。
48.什么是UTF-8?为什么使用UTF-8?
UTF-8:是一种针对Unicode的可变长度字符编码,又称为万国码
UTF-8是一种编码方案,它允许系统和Unicode及ASCII码一起高效操作。由于有些语言的字符一个字节可以显示,而有些需要两个字节可以显示,因为UTF-8采用可变长度的字符编码,所以可以正常显示各种语言。
49.什么可序列化的(serializable)对象?一个对象如何实现可序列化。
可以写到输出流中的对象称为可序列化对象。
可序列化对象必须实现Serializable接口,实现这个接口可以启动java的序列化机制,自动完成存储对象的数组的过程。
50.JVM(java虚拟机)中有几个比较重要的内存区域:函数区、常量池、堆区、栈区,这几个区域在java类的生命周期中扮演着比较重要的角色,他们的作用分别是什么?
方法区:在java的虚拟机中有一块专门用来存放已经加载的类信息、常量、静态变量以及方法代码的内存区域,叫做方法区。
常量池:常量池是方法区的一部分,用于存放编译期生成的各种字面量与符号引用,如String类型常量就存放在常量池。
堆区:用于存放类的对象实例。
栈区:也叫java虚拟机栈,是由一个一个的栈帧组成的后进先出的栈式结构,栈桢中存放方法运行时产生的局部变量、方法出口等信息。当调用一个方法时,虚拟机栈中就会创建一个栈帧存放这些数据,当方法调用完成时,栈帧消失,如果方法中调用了其他方法,则继续在栈顶创建新的栈桢。用于存放编译期可知的各种 基本数据类型、对象引用类型