Java 基础回顾
说明
Java和面向对象本身包罗万象,我们回顾的重点是基础知识。
以下是问题和参考答案,完全对很难,发现一个“原则上的”错误,期末加2分。
1、面向对象的特征有哪些方面?
答:面向对象的特征主要有以下几个方面:
- 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。
- 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段(如果不能理解请阅读阎宏博士的《Java与模式》或《设计模式精解》中关于桥梁模式的部分)。
- 封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口(可以想想普通洗衣机和全自动洗衣机的差别,明显全自动洗衣机封装更好因此操作起来更简单;我们现在使用的智能手机也是封装得足够好的,因为几个按键就搞定了所有的事情)。
- 多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。多态性分为编译时的多态性和运行时的多态性。如果将对象的方法视为对象向外界提供的服务,那么运行时的多态性可以解释为:当A系统访问B系统提供的服务时,B系统有多种提供服务的方式,但一切对A系统来说都是透明的(就像电动剃须刀是A系统,它的供电系统是B 系统,B系统可以使用电池供电或者用交流电,甚至还有可能是太阳能,A系统只会通过B类对象调用供电的方法,但并不知道供电系统的底层实现是什么,究竟通过何种方式获得了动力)。方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。运行时的多态是面向对象最精髓的东西,要实现多态需要做两件事:1). 方法重写(子类继承父类并重写父类中已有的或抽象的方法);2). 对象造型(用父类型引用引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为)。
2、访问修饰符public,private,protected,以及不写(默认)时的区别?
答:
3、String 是最基本的数据类型吗?
答:不是。Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型(primitive type)和枚举类型(enumeration type),剩下的都是引用类型(reference type)。
4、java中类的属性和方法是什么?
答:你可以把类比作一类事物,比如人类就是一个大类,而一个具体的人,比如小明,就是人类里面的一个对象。这个对象有眼睛、鼻子、耳朵这些器官,这些被称为对象的属性。这个人会跑,会跳会吃饭,这是人的动作,被称为对象的方法
5、属性和方法是类的两个重要的组成部分,请具体说明属性和方法,并举例。
属性和方法是类的两个重要的组成部分,其中,属性提供灵活的机制来读取,编写或计算私有字段的值,而方法则以一部分代码构成代码块的形式存在,用来实现一部分特定的功能。
你可以把类比作一类事物,比如人类就是一个大类,而一个具体的人,比如小明,就是人类里面的一个对象。这个对象有眼睛、鼻子、耳朵这些器官,这些被称为对象的属性。这个人会跑,会跳会吃饭,这是人的动作,被称为对象的方法。
具体而言,
属性是一种用于访问对象或类的特性的成员。属性可以包括字符串的长度、字体的大小、窗体的标题和客户的名称。
方法是一种用于实现可以由对象或类执行的计算或操作的成员。方法在类或结构中声明,声明时需指定访问级别、返回值、方法名称及方法参数,方法参数放在括号中,并用逗号隔开。括号中没有内容表明方法没有参数。
举例:
class People{
//属性
private String name; //名字
private String sex; //性别
//方法
public void eat(Food food){
//吃food 是食物类
}
}
6、int 和Integer 哪个会占用更多的内存?
答:
Integer 对象会占用更多的内存。Integer 是一个对象,需要存储对象的元数据。但是 int 是一个原始类型的数据,所以占用的空间更少。
7、什么是开发平台?
答:
在软件开发的过程中,我们需要很多的工具来辅助我们的工作,不可能什么都从头自己做。
我们把编程的环境和相应的辅助工具统称为开发环境,开发平台就是用来提供这个开发环境的。比如,车床工人需要一个车床才能工作一样。
同样,Java 是一种开发平台
Java 不单纯是一个编程的语言,它自身提供了一系列开发 Java 所需要的环境和工具,
来进行编译、解释、文档生成、打包等。
8、浅析JDK,JRE与JVM的含义和联系。
答:
JDK(Java Development Kit)是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境。SDK是Software Development Kit 一般指软件开发包,可以包括函数库、编译程序等。
JRE(Java Runtime Environment)是指Java的运行环境,是面向Java程序的使用者,而不是开发者。
JVM(Java Virtual Machine)是java虚拟机,它是整个java实现跨平台的最核心的部分,所有的java 程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行,也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。
如果安装了JDK,会发现你的电脑有两套JRE,一套位于Java\jdk\jre ,另外一套位于 Java\jre目录下,后面这套比前面那套少了Server端的Java虚拟机。jdk的bin下有各种java程序需要用到的命令,与jre 下的bin目录最明显的区别就是jdk下才有javac,这一点很好理解,因为jre只是一个运行环境而已,与开发无关,正因为如此,具备开发功能的jdk自己的jre下才会同时有client性质的jvm和server性质的jvm,而仅仅作为运行环境的jre下只需要client性质的jvm.dll就够了。
JRE的地位就像一台PC机一样,我们写好的Win32应用程序需要操作系统帮我们运行,同样的,我们编写的Java程序也必须要JRE才能运行。所以当你装完JDK后,如果分别在硬盘上的两个不同地方安装了两套JRE,那么你可以想象你的电脑有两台虚拟的Java PC机,都具有运行Java程序的功能。所以我们可以说,只要你的电脑安装了JRE,就可以正确运行Java应用程序。
9、举例说明如何定义和使用一个类,核心代码需注释含义。
public class Puppy{
int puppyAge;
public Puppy(String name){
// 这个构造器仅有一个参数:name
System.out.println("Passed Name is :" + name );
}
// 设置年龄
public void setAge( int age ){
puppyAge = age;
}
// 获取年龄
public int getAge( ){
System.out.println("Puppy's age is :" + puppyAge );
return puppyAge;
}
public static void main(String []args){
/* 创建对象*/
Puppy myPuppy = new Puppy( "tommy" );
/* 通过方法来设定age */
myPuppy.setAge( 2 );
/* 调用另一个方法获取age */
myPuppy.getAge( );
/*你也可以像下面这样访问成员变量*/
System.out.println("Variable Value :" + myPuppy.puppyAge );
}
}
10、Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?
答:Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在参数上加0.5然后进行下取整。
11、JAVA中构造方法,实例方法,类方法,有什么区别?
答:
构造方法, 是用来构造类的对象的,方法名和类名相同没有返回值。一般用new 构造方法名() 来创建该类的对象。在不写构造方法的情况下会有一个默认的无参构造方法。
实例方法, 简单地说就是可以通过类的实例(某个对象)调用的方法,也就是我们正常情况下使用的方法。实例方法也称成员方法。
类方法, 简单地说就是直接可以用类名调用的方法,也就是被关键字static修饰的方法,它不需要创建类的对象来调用该方法。
12、描述以下Test 类的基本运行顺序。
1. public class Test {
2. private String name;
3. private int age;
4.
5. public Test() {
6. name = "Tom";
7. age = 20;
8. }
9. public static void main(String[] args) {
10. Test t = new Test();
11. System.out.println(https://www.doczj.com/doc/d98223908.html, + "的年龄是" + t.age );
12. }
13. }
答:
运行的基本顺序是:
(1)先运行到第9 行,这是程序的入口。
(2)然后运行到第10 行,这里要new 一个Test,就要调用Test 的构造方法。
(3)就运行到第5 行,注意:可能很多人觉得接下来就应该运行第6 行了,错!初始化一个类,必须先初始化它的属性。
(4)因此运行到第2 行,然后是第3 行。
(5)属性初始化完过后,才回到构造方法,执行里面的代码,也就是第6 行、第7 行。
(6)然后是第8行,表示new 一个Test 实例完成。
(7)然后回到main 方法中执行第11 行。
(8)然后是第12 行,main方法执行完毕。
13、数组有没有length()方法?String有没有length()方法?
答:数组没有length()方法,有length 的属性。String 有length()方法。JavaScript中,获得字符串的长度是通过length属性得到的,这一点容易和Java混淆。
15、构造器(constructor)是否可被重写(override)?
答:构造器不能被继承,因此不能被重写,但可以被重载。
17、是否可以继承String类?
答:String 类是final类,不可以被继承。继承String本身就是一个错误的行为,对String类型最好的重用方式是关联关系(Has-A)和依赖关系(Use-A)而不是继承关系(Is-A)。
18、初始化子类必先初始化父类,请通过下面的Test类描述父类和子类之间的初始化顺序和运行顺序.
1. public class Test extends Parent {
2. private String name;
3. private int age;
4. public Test() {
5. name="Tom";
6. age=20;
7. }
8. public static void main(String[] args) {
9. Test t = new Test();
10. System.out.println(https://www.doczj.com/doc/d98223908.html, + "的年龄是" + t.age);
11. }
12. }
13. class Parent {
14. private int num = 1;
15. public Parent() {
16. System.out.println("现在初始化父类");
17. }
18. public void test() {
19. System.out.println("这是父类的test方法");
20. }
21. }
答:
上述类的基本运行顺序是:
(1)先运行到第8 行,这是程序的入口。
(2)然后运行到第9 行,这里要new 一个Test,就要调用Test 的构造方法。
(3)就运行到第4 行,注意:初始化子类必先初始化父类。
(4)要先初始化父类,所以运行到第15 行。
(5)然后是第14 行,初始化一个类,必须先初始化它的属性。
(6)然后是第16 行。
(7)然后是第17 行,表示父类初始化完成。
(8)然后是回到子类,开始初始化属性,因此运行到第2 行,然后是第3 行。
(9)子类属性初始化完过后,才回到子类的构造方法,执行里面的代码,也就是第5、6 行。
(10)然后是第7 行,表示new 一个Test 实例完成。
(11)然后回到main 方法中执行第10 行。
(12)然后是第11 行。
19、String和StringBuilder、StringBuffer的区别?
答:Java平台提供了两种类型的字符串:String和StringBuffer/StringBuilder,它们可以储存和操作字符串。其中String是只读字符串,也就意味着String引用的字符串内容是不能被改变的。而StringBuffer/StringBuilder类表示的字符串对象可以直接进行修改。StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer要高。
20、重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?答:
重写是子类的方法覆盖父类的方法,要求方法名和参数都相同;
重载是在同一个类中的两个或两个以上的方法,拥有相同的方法名,但是参数却不相同,方法体也不相同,最常见的重载的例子就是类的构造函数。
方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求。
21、关键字super用途是什么?
答:答:可被用来引用该类的父类,它被用来引用父类的成员变量或方法。父类行为被调用,就好象该行为是本类的行为一样,而且调用行为不必发生在父类中,它能自动向上层类追溯。
在许多情况下,使用默认构造方法来对父类对象进行初始化。当然也可以使用super来显示。
使用super调用父类的构造方法时,无论是super 还是this,都必须放在构造方法的第一行。
通常,可通过从子类构造方法的第一行调用关键字super 的手段,调用一个的父类构造方法作为子类初始化的一部分。
要控制具体的构造方法的调用,必须给super()提供合适的参数。当不调用带参数的super时,缺省的父类构造方法(即,不带参数的构造方法)被隐含地调用。在这种情况下,如果没有缺省的父类构造方法,将导致编译错误。
22、char 型变量中能不能存贮一个中文汉字,为什么?
答:char类型可以存储一个中文汉字,因为Java中使用的编码是Unicode(不选择任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法),一个char类型占2个字节(16比特),所以放一个中文是没问题的。
23、抽象类(abstract class)和接口(interface)有什么异同?
答:抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。接口比抽象类更加抽象,因为抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法。抽象类中的成员可以是private、默认、protected、public的,而接口中的成员全都是public的。抽象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量。有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法。
25、StringBuffer和String、StringBuilder的区别?
答:StringBuffer类和String、StringBuilder一样,也用来代表字符串,String类是不可变类,任何对String的改变都会引发新的String对象的生成;而StringBuffer则是可变类,任何对它所指代的字符串的改变都不会产生新的对象.StringBufferd类与StringBuilder的原理和操作基本相同。区别在于StringBufferd支持并发操作,线性安全的,适合多线程中使用。StringBuilder不支持并发操作,线性不安全的,不适合多线程中使用。StringBuilder效率要略高于StringBufferd。
27、阐述静态变量和实例变量的区别。
答:静态变量是被static修饰符修饰的变量,也称为类变量,它属于类,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝;实例变量必须依存于某一实例,需要先创建对象然后通过对象才能访问到它。静态变量可以实现让多个对象共享内存。
28、是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?
答:不可以,静态方法只能访问静态成员,因为非静态方法的调用要先创建对象,在调用静态方法时可能对象并没有被初始化。
29、下面的程序有错误?请改正并说明错误原因。
class A {
A(String myStr){
}
}
class B extends A{
B(){
}
}
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
}
}
答:
B类是A类的子类,会自动调用父类的构造函数。但是,A类没有定义无参构造方法,程序无法编译通过。通常,如果设计一个类的目的是为了被继承,最好实现一个无参构造方法,这样可以避免编译错误。当调用无参数的super时,缺省的父类构造方法(即,不带参数的构造方法)被隐含地调用。在这种情况下,如果没有缺省的父类构造方法,将导致编译错误。
30、什么是枚举类型?为什么需要枚举类型?请说明和举例.
答:
枚举类型enum 是一种新的类型,在JDK5.0 加入,允许用常量来表示特定的数据集。
这些数据是分配时预先定义的值的集合,而且全部都以类型安全的形式来表示。
在枚举类型没有加入到Java 前,我们要想表达常量的集合,通常采用如下的方式:
public class Test {
public static final int A = 1;
public static final int B = 2;
public static final int C = 3;
public static final int D = 4;
public static final int E = 5;
}
那么我们在使用的时候就采用如下代码:
Test.A 或者Test.B 之类的代码。
但是在这样做的时候,我们需要记住这类常量是Java 中int 类型的常量,这意味着该方法可以接受任何int 类型的值,即使它和Test 中定义的所有级别都不对应。因此需要检测上界和下界,在出现无效值的时候,可能还要包含一个IllegalArgumentException。而且,如果后来又添加另外一个级别(例如TEST.F,那么必须改变所有代码中的上界,才能接受这
个新值。
换句话说,在使用这类带有整型常量的类时,该解决方案也许可行,但并不是非常有效。枚举就为处理上述问题提供了更好的方法。把上面的例子改成用枚举的方式:
public class Test {
public enum StudentGrade {
A, B, C, D, E, F
};
}
可以采用如下的方式进行使用
public class Test {
public enum StudentGrade {
A, B, C, D, E, F
};
public static void main(String[] args) {
System.out.println("学生的平均成绩为==" + StudentGrade.B);
}
}
上面的示例都相当简单,但是枚举类型提供的东西远不止这些。您可以逐个遍历枚举值,也可以在switch 语句中使用枚举值,枚举是非常有价值的。
31、Java 中的构造器链是什么?
答:当你从一个构造器中调用另一个构造器,就是Java 中的构造器链。这种情况只在重载了类的构造器的时候才会出现。
32、接口是否可继承(extends)接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concrete class)?
答:接口可以继承接口,而且支持多重继承。抽象类可以实现(implements)接口,抽象类可继承具体类也可以继承抽象类。
33、一个".java"源文件中是否可以包含多个类(不是内部类)?有什么限制?
答:可以,但一个源文件中最多只能有一个公开类(public class)而且文件名必须和公开类的类名完全保持一致。
34、Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口?
答:可以继承其他类或实现其他接口,在Swing、javaFX编程和Android开发中常用此方式来实现事件监听和回调。
35、内部类可以引用它的包含类(外部类)的成员吗?有没有什么限制?
答:一个内部类对象可以访问创建它的外部类对象的成员,包括私有成员。
36、Java 中的final关键字有哪些用法?
答:(1)修饰类:表示该类不能被继承;(2)修饰方法:表示方法不能被重写;(3)修饰变量:表示变量只能一次赋值以后值不能被修改(常量)。
37、什么是不可变对象(immutable object)?Java 中怎么创建一个不可变对象?
不可变对象指对象一旦被创建,状态就不能再改变。任何修改都会创建一个新的对象,如String、Integer 及其它包装类。
不可变对象对于缓存是非常好的选择,因为你不需要担心它的值会被更改。不可变类的另外一个好处是它自身是线程安全的,你不需要考虑多线程环境下的线程安全问题。
要写出这样的类,需要遵循以下几个原则:
1. 将类声明为final,所以它不能被继承
2. 将所有的成员声明为私有的,这样就不允许直接访问这些成员
3. 对变量不要提供setter方法
4. 将所有可变的成员声明为final,这样只能对它们赋值一次
5. 如果类中包含mutable类对象,那么返回给客户端的时候,返回该对象的一个拷贝,而不是该对象本身(该条可以归为第一条中的一个特例)
当然不完全遵守上面的原则也能够创建immutable的类,比如String的hashcode就不是final的,但它能保证每次调用它的值都是一致的,无论你多少次计算这个值,它都是一致的,因为这些值的是通过计算final 的属性得来的!
下面是一个例子:
public final class Contacts {
private final String name;
private final String mobile;
public Contacts(String name, String mobile) {
https://www.doczj.com/doc/d98223908.html, = name;
this.mobile = mobile;
}
public String getName(){
return name;
}
public String getMobile(){
return mobile;
}
}
38、数据类型之间的转换:
- 如何将字符串转换为基本浮点类型?请举例
答:
调用基本数据类型对应的包装类中的方法parseXXX(String)或valueOf(String)即可返回相应基本类型;例如:
String s="123.456";
double num;
num=Double.parseDouble(s);
- 如何将字符串转为日期型?请举例
一种方法是将字符串…
例如:
String date="2006-11-23"
SimpleDateFormat df =new SimpleDateFormat("yyyy-MM-dd");
java.util.Date cDate = df.parse(date);
java.sql.Date dd = new java.sql.Date(cDate.getTime());
39、如何实现字符串的反转及替换?
答:方法很多,可以自己写实现也可以使用String或StringBuffer/StringBuilder中的方法。有一道很常见的面试题是用递归实现字符串反转,代码如下所示:
public static String reverse(String originStr) {
if(originStr == null || originStr.length() <= 1)
return originStr;
return reverse(originStr.substring(1)) + originStr.charAt(0);
}
40、浅析Java中的final关键字, 并举例说明?
在使用匿名内部类的时候可能会经常用到final关键字。另外,Java中的String类就是一个final类。
在Java中,final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)。下面就从这三个方面来了解一下final关键字的基本用法。
1.修饰类: 当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。
在使用final修饰类的时候,要注意谨慎选择,除非这个类真的在以后不会用来继承或者出于安全的考虑,尽量不要将类设计为final类。
2.修饰方法:使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的Java版本中,不需要使用final方法进行这些优化了。“
因此,如果只有在想明确禁止该方法在子类中被覆盖的情况下才将方法设置为final的。
注:类的private方法会隐式地被指定为final方法。
3.修饰变量:是final用得最多的地方。对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
举个例子:
上面的一段代码中,对变量i和obj的重新赋值都报错了。
41、日期和时间:
- 如何取得年月日、小时分钟秒?
- 如何取得从1970年1月1日0时0分0秒到现在的毫秒数?
- 如何取得某月的最后一天?
- 如何格式化日期?
答:
问题1:
创建java.util.Calendar 实例,调用其get()方法传入不同的参数即可获得参数所对应的值。Java 8中可以使用
java.time.LocalDateTimel来获取,代码如下所示。
public class DateTimeTest {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
System.out.println(cal.get(Calendar.YEAR));
System.out.println(cal.get(Calendar.MONTH)); // 0 - 11
System.out.println(cal.get(Calendar.DATE));
System.out.println(cal.get(Calendar.HOUR_OF_DAY));
System.out.println(cal.get(Calendar.MINUTE));
System.out.println(cal.get(Calendar.SECOND));
// Java 8
LocalDateTime dt = LocalDateTime.now();
System.out.println(dt.getYear());
System.out.println(dt.getMonthValue()); // 1 - 12
System.out.println(dt.getDayOfMonth());
System.out.println(dt.getHour());
System.out.println(dt.getMinute());
System.out.println(dt.getSecond());
}
}
问题2:以下方法均可获得该毫秒数。
Calendar.getInstance().getTimeInMillis();
System.currentTimeMillis();
Clock.systemDefaultZone().millis(); // Java 8
问题3:代码如下所示。
Calendar time = Calendar.getInstance();
time.getActualMaximum(Calendar.DAY_OF_MONTH);
问题4:利用java.text.DataFormat 的子类(如SimpleDateFormat类)中的format(Date)方法可将日期格式化。Java 8中可以用java.time.format.DateTimeFormatter来格式化时间日期,代码如下所示。
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Date;
class DateFormatTest {
public static void main(String[] args) {
SimpleDateFormat oldFormatter = new SimpleDateFormat("yyyy/MM/dd");
Date date1 = new Date();
System.out.println(oldFormatter.format(date1));
// Java 8
DateTimeFormatter newFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
LocalDate date2 = LocalDate.now();
System.out.println(date2.format(newFormatter));
}
}
42、打印昨天的当前时刻。
答:
import java.util.Calendar;
class YesterdayCurrent {
public static void main(String[] args){
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -1);
System.out.println(cal.getTime());
}
}
在Java 8中,可以用下面的代码实现相同的功能。
import java.time.LocalDateTime;
class YesterdayCurrent {
public static void main(String[] args) {
LocalDateTime today = LocalDateTime.now();
LocalDateTime yesterday = today.minusDays(1);
System.out.println(yesterday);
}
}
45、Error和Exception有什么区别?
答:Error表示系统级的错误和程序不必处理的异常,是恢复不是不可能但很困难的情况下的一种严重问题;比如内存溢出,不可能指望程序能处理这样的情况;Exception表示需要捕捉或者需要程序进行处理的异常,是一种设计或实现问题;也就是说,它表示如果程序运行正常,从不会发生的情况。
46、try和finally
try{}里有一个return语句,那么紧跟在这个try后的finally{}里的代码会不会被执行,什么时候被执行?在return前还是后? 在finally中改变返回值可以吗?
答:会执行,在方法返回调用者前执行。
在finally中改变返回值可以吗?
可以,但在finally中改变返回值的做法是不好的,因为如果存在finally代码块,try中的return语句不会立马返回调用者,而是记录下返回值待finally代码块执行完毕之后再向调用者返回其值,然后如果在finally中修改了返回值,就会返回修改后的值。显然,在finally中返回或者修改返回值会对程序造成很大的困扰,C#中直接用编译错误的方式来阻止程序员干这种龌龊的事情,Java中也可以通过提升编译器的语法检查级别来产生警告或错误,强烈建议将此项设置为编译错误。
47、Java语言如何进行异常处理,关键字:throws、throw、try、catch、finally分别如何使用?
答:Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在Java中,每个异常都是一个对象,它是Throwable类或其子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并可以对其进行处理。
Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。
一般情况下是用try来执行一段程序,如果系统会抛出(throw)一个异常对象,可以通过它的类型来捕获(catch)它,或通过总是执行代码块(finally)来处理;
try用来指定一块预防所有异常的程序;catch子句紧跟在try块后面,用来指定你想要捕获的异常的类型;throw语句用来明确地抛出一个异常;
throws用来声明一个方法可能抛出的各种异常(当然声明异常时允许无病呻吟);finally为确保一段代码不管发生什么异常状况都要被执行.
finally在异常处理时提供finally块来执行所有清除操作。主要与try-catch-finally配合使用。finally语句块的作用是无论出现什么情况,finally块中的语句一定会被执行,并且是在return之前执行。
48、什么是Object类?
答:Object类存储在https://www.doczj.com/doc/d98223908.html,ng包中,是所有java类(Object类除外)的终极父类。当然,数组也继承了Object 类。然而,接口是不继承Object类的。
49、列出一些你常见的运行时异常?
答:
- ArithmeticException(算术异常)
- ClassCastException (类转换异常)
- IllegalArgumentException (非法参数异常)
- IndexOutOfBoundsException (下标越界异常)
- NullPointerException (空指针异常)
- SecurityException (安全异常)
50、阐述final、finally、finalize的区别。
答:
- final:修饰符(关键字)有三种用法:如果一个类被声明为final,意味着它不能再派生出新的子类,即不能被继承,因此它和abstract是反义词。将变量声明为final,可以保证它们在使用中不被改变,被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取不可修改。被声明为final的方法也同样只能使用,不能在子类中被重写。
- finally:通常放在try…catch…的后面构造总是执行代码块,这就意味着程序无论正常执行还是发生异常,这里的代码只要JVM不关闭都能执行,可以将释放外部资源的代码写在finally块中。
- finalize:Object类中定义的方法,Java中允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在销毁对象时调用的,通过重写finalize()方法可以整理系统资源或者执行其他清理工作。
51、类ExampleA继承Exception,类ExampleB继承ExampleA。
有如下代码片断:
try {
throw new ExampleB("b")
} catch(ExampleA e){
System.out.println("ExampleA");
} catch(Exception e){
System.out.println("Exception");
}
请问执行此段代码的输出是什么?
答:输出:ExampleA。(根据里氏代换原则[能使用父类型的地方一定能使用子类型],抓取ExampleA类型异常的catch块能够抓住try块中抛出的ExampleB类型的异常)
52、euqals()函数是用来做什么的?为什么不用“==”运算符来判断两个对象是否相等呢?答:equals()函数可以用来检查一个对象与调用这个equals()的这个对象是否相等。
答:虽然“==”运算符可以比较两个数据是否相等,但是要来比较对象的话,恐怕达不到预期的结果。就是说,“==”通过是否引用了同一个对象来判断两个对象是否相等,这被称为“引用相等”。这个运算符不能通过比较两个对象的内容来判断它们是不是逻辑上的相等。
53、阐述ArrayList的存储性能和特性。
答:ArrayList是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢。
补充:遗留容器中的Properties类和Stack类在设计上有严重的问题,Properties是一个键和值都是字符串的特殊的键值对映射,在设计上应该是关联一个Hashtable并将其两个泛型参数设置为String类型,但是Java API中的Properties直接继承了Hashtable,这很明显是对继承的滥用。这里复用代码的方式应该是Has-A关系而不是Is-A关系,另一方面容器都属于工具类,继承工具类本身就是一个错误的做法,使用工具类最好的方式是Has-A关系(关联)或Use-A关系(依赖)。同理,Stack类继承Vector也是不正确的。Sun公司的工程师们也会犯这种低级错误,让人唏嘘不已。
54、import,package的用法和用途
认为 import跟C/C++ 的#include 相似,这是错误的观念。请详细说明Java中import,package的用法和用途。
答:
package名称就像是我们的姓,而 class 名称就像是我们的名字。package名称有很多,就好像是复姓。比如说https://www.doczj.com/doc/d98223908.html,ng.String,就是复姓https://www.doczj.com/doc/d98223908.html,ng,名字为String的类别;
java.io.InputStream则是复姓java.io,名字为InputStream的类别。
Java会使用package这种机制的原因也非常明显,就像我们取姓名一样,光是一间学校的同一届同学中,就有可能会出现不少同名的同学,如果不取姓的话,那学校在处理学生资料,或是同学彼此之间的称呼,就会发生很大的困扰。相同的,全世界的Java类别数量,恐怕比杭州人口还多,而且还不断的在成长当中,如果类别不使用套件名称,那在用到相同名称的不同类别时,就会產生极大的困扰。幸运的是,Java的套件名称我们可以自己取,不像人的姓没有太大的选择(所以有很多同名同姓的),如果依照Java的规范来取套件名称,那理论上不同人所取的套件名称不会相同,也就不会发生名称冲突的情况。
可是问题来了,因为很多套件的名称非常的长,在写程序时,会多打好多字,花费不少时间,比如说:java.io.InputStreamis=https://www.doczj.com/doc/d98223908.html,ng.System.in;
java.io.InputStreamReaderisr=newjava.io.InputStreamReader(is);
java.io.BufferedReaderbr=newjava.io.BufferedReader(isr);
实在是不美观又麻烦。於是,Java大人想了一个办法,就是import。
这个import就是在程序一开头的时候,先说明程序中会用到那些类别的简称,也就是只称呼名字,不称呼他的姓。首先,在代码开头写:
https://www.doczj.com/doc/d98223908.html,ng.System;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importjava.io.BufferedReader;
这几行说明了这四个姓名的类别,在程序中只用他的名字来称呼,所以当程序中提到System就是指https://www.doczj.com/doc/d98223908.html,ng.System,而InputStream就是指java.io.InputStream,依此类推。於是原来的程序就变成:InputStream=System.in;
InputStreamReaderisr=newInputStreamReader(is);
BufferedReaderbr=newBufferedReader(isr);
这样看起来是不是清爽多了呢?如果这些类别用的次数很多,那就更能体会到import的好处了。可是这样还是不够,因为懒是人的天性,还是会有人觉得打太多import了也很浪费时间,於是Java姐姐又提供了一个方法:
https://www.doczj.com/doc/d98223908.html,ng.*;
importjava.io.*;
意思就是,等一下程序中提到的没有姓名的类别,不是姓https://www.doczj.com/doc/d98223908.html,ng,就是姓java.io,如果这两个裡面有同样名字的类别,而不幸的你又只用名字称呼这个类别,那编译器仍然会跟你抱怨,因为它还是不知道你说的这个类别指那一个姓的类别。那可不可以再懒一点呢,只写:import java.*;
历史告诉我们,人可以懒,但不能太懒,这样是不行的。因為那些类别是姓java.io 而不是姓 java。就像姓『诸葛』的人应该不会喜欢你称他為『诸』先生吧。
差不多了,天亮了...
55、设计GUI程序时,大部分事件监听器(处理器)都作为匿名内部类来实现。那么什么是匿名类?什么情况下需要使用匿名内部类?有什么好处?
答:
Java内部类是指在一个外部类的内部再定义一个类;而匿名内部类就是没有名字的内部类。
如果满足下面的一些条件,使用匿名内部类是比较合适的:
●只用到类的一个实例。
●类在定义后马上用到。
●类非常小(4行代码以下)
●给类命名并不会导致你的代码更容易被理解。
事件监听器使用匿名内部类有两大好处。
第一,因为匿名内部类的使用,我们可在同一处实现监听器方法,代码更清晰可读;
第二,第二,事件监听器一般只在一处使用一次,使用匿名内部类可避免不必要的命名类实现
56、toString() 方法实现了什么功能?当toString() 方法没有被覆盖的时候,返回的字符串通常是什么样子的?提供一个正确覆盖toString() 方法的例子.
答1:toString() 方法将根据调用它的对象返回其对象的字符串形式。
答2:当toString() 没有被覆盖的时候,返回的字符串格式是类名@哈希值,哈希值是十六进制的。举例说,假设有一个Employee 类,toString() 方法返回的结果可能是Empoyee@1c7b0f4d。
答3:代码清单:
public class Employee
{
private String name;
private int age;
public Employee(String name, int age)
{
https://www.doczj.com/doc/d98223908.html, = name;
this.age = age;
}
@Override
public String toString()
{
return name + ": " + age;
}
}
方法重载:同一个类中,可以定义同名的多个方法。它们的不同之处在于参数列表不同,这其中包括参数的个数不同或是对应的参数类型不完全相同。这就是方法的重载。当对该类的实力调用相应的方法时,系统将依据所带参数的个数及类型从同名的多个方法中来选择参数列表满足要求的方法,不只如此,在不同的类中也可以定义有相同方法名的方法。
2方法重写:使用类的继承关系,可以从已有的类产生一个新类,在原有特性基础上,增加了新的特性,原类及新类分别称为父类及子类。如果父类中原有的方法不能满足子类的要求,可以在子类中对父类的方法重新编写代码。这称为方法重写,也称为方法的隐藏,意思是子类中看不到父类中的实现代码,子类中定义的方法所用的名字、返回类型及参数表和父类中方法使用的完全一样,从逻辑上看就是子类中的成员方法将隐藏了父类中的同名方法。
二者区别:①方法重载时参数列表必须是不同的,使系统能区别出到底调用哪个方法,而方法重写时参数
列表可以是相同的;②方法重载时,方法的返回类型可能不同,也可能相同;而方法重写时,子类中方法的返回类型和父类中同名方法的返回类型完全一样;③方法重载多出现在同一个类中,方法重写必须是在父子类中。
3如果一个方法只有方法的声明,而没有方法的实现,则称为抽象方法。含有抽象方法的通常称为抽象类。在Java中可以通过关键字abstract把一个类定义为抽象类,每一个未被定义具体实现的抽象方法也应标记为abstract。
从形式上看,在Java中,类class之前可以使用多种修饰符,用来修饰限定所定义的类的特性。凡使用abstract 修饰符修饰的类都是抽象类。从实现上来看,抽象类就是没有具体的概念类。
抽象类一定要派生子类,父类中的抽象方法可以在子类中具体实现,也可以在子类中继续说明为抽象的。换句话说,抽象类是至少含有一个不完整方法的类。由于抽象类的特殊性,因此不能创建抽象类的实例。抽象类通常位于面向对象的类层次结构的顶层,它定义了该类的所有子类的对象可能具有的大致行为类型。具体点行为则在各子类中完成。
4接口是类的另一种表现方式,它是一种特殊的“类”,跟确切地说,他是抽象类功能的另一种实现方法,可将其想象为一个“纯”的抽象类。它也有一个类的基本形式,包括方法名、自变量列表以及返回类型,但不规定方法主体。因此在接口中所有的方法都是抽象方法,都没有方法体。
接口作用:为了保证多重继承,它可以定义多个类的共同属性。而且,Java通过允许一个类实现多个接口从而实现了比多重继承更强大的能力,并具有更加清晰的结构。
接口与抽象类的区别:①在接口中所有的方法都是抽象方法,都没有方法体,而在抽象类中顶一顶方法可以不想与抽象方法;②接口中定义的成员变量都默认为终极类的变量,即系统会将其自动增加final和static 这两个关键字,并且对改变量必须设置初值,而抽象类中没有此限制;③一个类只能由唯一的一个类继承而来,但可以实现多个接口。
1 什么是面向对象程序设计,它与传统的结构式程序有什么不同。 面向对象程序设计是一种适用于设计、开发各类软件的范型。它是将软件看成是一个由对象组成的社会:这些对象具有足够的智能,能理解从其他对象接受的信息,并以适当的行为作出响应;允许低层对象从高层对象继承属性和行为。通过这样的设计思想和方法,将所模拟的现实世界中的事物直接映射到软件系统的解空间。 与传统的结构式程序设计相比,面向对象程序设计吸取了结构式程序设计的一切优点(自顶向下、逐步求精的设计原则)。而二者之间的最大差别表现在: ·面向对象程序采用数据抽象和信息隐藏技术使组成类的数据和操作是不可分割的,避免了结构式程序由于数据和过程分离引起的弊病。 · 面向对象程序是由类定义、对象(类实例)和对象之间的动态联系组成的。而结构式程序是由结构化的数据、过程的定义以及调用过程处理相应的数据组成的 2 用面向对象方法建立模型的思维过程是怎样的。 用面向对象方法建立拟建系统的模型的过程就是从被模拟现实世界的感性具体中抽象要解决的问题概念的过程。这种抽象过程分为知性思维和具体思维两个阶段,其中:·知性思维是从感性材料中分解对象,抽象出一般规定,形成了对对象的普遍认识。·具体思维是从知性思维得到出的一般规定中揭示的事物的深刻本质和规律,其目的是把握具体对象的多样性的统一和不同规定的综合。 3 解释以下概念: ①对象:在现实世界中,对象就是可以感觉到的实体。每个对象具有一个特定的名字以 区别于其他对象;具有一组状态用来描述它的某些特性;具有一组操作,每一个操作决定对象的一种功能或行为(为自身服务的操作和为其他对象提供服务的操作)。而在面向对象系统中,对象是可以标识的存储区域。每个对象的状态被保存在此区域中,而实现一类对象行为的操作(代码)被保存在另外相关的存储器区域中。 ②消息:消息是要求某个对象执行其某种功能操作(方法)的规格说明。因此,消息是 由消息的接收者、消息要求提供的操作(消息名)和必要的参数组成的。 ③类:在现实世界中,类是对一组具有共同特性(属性和行为)的客观对象的抽象。而 在面向对象系统中,类是由程序员自定义的具有特定结构和功能的类型,是一种代码共享的手段。 ④实例:任何一个对象都是该对象所属类的一个具体实例。 ⑤公有消息:是由对象外向对象发送的消息,用于激活该对象的某种方法。 ⑥私有消息:是由对象向自身发送的消息,用于内部操作;该类消息不能从对象外向该 对象发送。 ⑦消息序列:在面向对象系统中一个事件的发生总会有多个对象的多次相互作用才能完 成,使得这些对象能够相互作用的消息组成的序列被称为消息序列。 4 类与实例的关系如何? 类是创建对象的模板,而对象是实现类的实例。属于同一类的不同实例必须具有: ·相同的操作集合; ·相同的静态属性集合; ·不同的对象名和属性动态值。
面向对象程序设计实验指导书 实验一、C++开发环境应用入门(2学时)(选做) 1、实验目的 (1)了解C++开发工具的特点 (2)熟悉C++开发环境 (3)学习用C++编写标准的C++程序 2、实验任务 使用C++来建立一个非图形化的标准C++程序,编译、运行下例程序: #include
浙江理工大学军事理论考试题库 《中国国防》章节 一、单选题 1、国防是国家为了防备和抵抗,制止,保卫国家主权、统一、领土完整和安全所进行的军事活动。( A ) A.侵略、武装颠覆 B.进攻、暴乱 C.进攻、武装颠覆 D.侵略、暴乱 2、中国的国防类型是(B) A.扩张型 B.自卫型 C.联盟型 D.中立型 3、一个国家实施国防的主要手段是(A) A.使用国家武装力量 B.发展经济建设 C.积极外交 D.加强军事实力 4、以下所列的不属于我国古代的国防工程范畴的是(D) A.城池 B.长城 C.京杭大运河 D.兵工厂 5、经各朝代多次修建连接,至明代行成了西起嘉峪关,东至山海关,全长公里的万里长城。(B) A.12800 B.12700 C.12000 D.13000 6、我国古代的国防工程建设汇总,建设的时间最早,数量最多的是(A) A.城池 B.长城 C.京杭大运河 D.海防要塞 7、1884年至1885年,中法交战,爱国将领率领的清军取得镇南关大捷。(A) A.冯子材 B.林则徐 C.丁汝昌 D.吉鸿昌
8、八国联军于年,发动了侵华战争。(B) A.1895 B.1900 C.1901 D.1911 9、八国联军侵华,清政府战败,清政府与八国为达标的侵略者签订了。(A) A. 《辛丑条约》 B.《天津条约》 C.《北京条约》 D.《马关条约》 10、年,中国共产党成立,中国工人阶级开始以自觉的姿态登上历史舞台。(D) A.1911 B.1919 C.1920 D.1921 11、是国防强大的基础。( D ) A.政治开明 B.军事科技发展 C.军队人才培养 D.经济发展 12、中的国防条款在国防法规体系中居于最高地位。(A) A.宪法 B.国防法规 C.兵役法 D.国防教育法 13、我国奉行的国防政策。( B ) A、扩张性 B、防御性 C、自卫性 D、中立性 14、《国防法》是哪年开始颁布实施的?( B ) A、1996 B、1997 C、1998 D、1999 15、国防教育的对象是(C)。 A学生 B、高校学生 C、全体公民 D、符合征兵条件的人 16、国防所维护的国家利益主要是( D ) A、政治利益 B、经济利益 C、外交利益 D、安全利益
信息化战争复习题大学 军事理论课 文档编制序号:[KK8UY-LL9IO69-TTO6M3-MTOL89-FTT688]
信息化战争复习题 一、判断题 1、现阶段和即将到来的战争形式为核威慑下的信息化战争。(√) 2、精确制导武器、电子战设备和指挥自动化系统在战争中得到应用,是信息化战争萌芽的标志。(√) 3、在信息化战争中,信息是核心资源,是决定战争胜负的关键因素。(√) 4、硬杀伤型信息武器,是指以计算机病毒武器和电子战武器为代表的攻击型信息武器。(×) 5、C4ISR系统,是战场指挥、控制、通信、计算机、情报、监视和侦察系统的简称。(√) 6、信息化战争,是信息时代的基本战争形态。(√) 7、信息化战争中,战场空间除陆、海、空、天外,还包括网络、电磁等空间。(√) 8、信息化战争主要是军队的事,与地方政府有关,与大学生无关。(╳) 9、信息化战争中,参战主体除了军队之外,还包括社会团体和个人。(√) 10、国防信息化建设应以国家信息化建设为依托,全民参与。(√)
二、单选题 1、在我国,最早提出“信息化战争”一词的科学家是_____。( D ) A 袁隆平 B 邓稼先 C 周光亚 D 钱学森 2、下列属于信息化军队的是________。(D) A 中国工农红军 B 侵华日军 C 抗美援朝时的志愿军 D 美军数字化部队 3、在信息化战争中,起核心作用的资源是________。( C ) A 机动力 B 火力 C 信息 D 体能 E 技巧 4、美国国家军事指挥中心使用的指挥控制系统是______。( A) A 全球指挥控制系统 B格洛纳斯系统 C 北斗导航定位系统 D 伽利略系统 5、以下武器装备属于信息化武器装备的是( D) A 日本侵华时用的三八步枪 B 二战时德军用的重机枪 C 北洋水师的“镇远”铁甲舰 D 美军的信息士兵系统 6、海湾战争爆发的时间是( A) A 1991年 B 1999年 C 2001年 D 2008年 7、美国轰炸中国驻南联盟大使馆是在哪一年( A) A 1999年 B 2001年 C 2003年 D 2011年 8、现在世界上能够全球作战、全球到达的国家军队是( D)