不能错过的关于面向对象的java笔试题 Java是一门面向对象的编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。以下是小编整理的不能错过的关于面向对象的java笔试题,欢迎查看。 不能错……
不能错过的关于面向对象的java笔试题
Java是一门面向对象的编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。以下是小编整理的不能错过的关于面向对象的java笔试题,欢迎查看。
不能错过的面向对象的java笔试题 篇1
1)Java 中能创建 Volatile 数组吗?
能,Java 中可以创建 volatile 类型数组,不过只是一个指向数组的引用,而不是整个数组。我的意思是,如果改变引用指向的数组,将会受到 volatile 的保护,但是如果多个线程同时改变数组的元素,volatile 标示符就不能起到之前的保护作用了。
2)volatile 能使得一个非原子操作变成原子操作吗?
一个典型的例子是在类中有一个 long 类型的成员变量。如果你知道该成员变量会被多个线程访问,如计数器、价格等,你最好是将其设置为 volatile。为什么?因为 Java 中读取 long 类型变量不是原子的,需要分成两步,如果一个线程正在修改该 long 变量的值,另一个线程可能只能看到该值的一半(前 32 位)。但是对一个 volatile 型的 long 或 double 变量的读写是原子。
3)volatile 修饰符的有过什么实践?
一种实践是用 volatile 修饰 long 和 double 变量,使其能按原子类型来读写。double 和 long 都是64位宽,因此对这两种类型的读是分为两部分的,第一次读取第一个 32 位,然后再读剩下的 32 位,这个过程不是原子的,但 Java 中 volatile 型的 long 或 double 变量的读写是原子的。volatile 修复符的另一个作用是提供内存屏障(memory barrier),例如在分布式框架中的应用。简单的说,就是当你写一个 volatile 变量之前,Java 内存模型会插入一个写屏障(write barrier),读一个 volatile 变量之前,会插入一个读屏障(read barrier)。意思就是说,在你写一个 volatile 域时,能保证任何线程都能看到你写的值,同时,在写之前,也能保证任何数值的更新对所有线程是可见的,因为内存屏障会将其他所有写的值更新到缓存。
4)volatile 类型变量提供什么保证?(答案)
volatile 变量提供顺序和可见性保证,例如,JVM 或者 JIT为了获得更好的性能会对语句重排序,但是 volatile 类型变量即使在没有同步块的情况下赋值也不会与其他语句重排序。 volatile 提供 happens-before 的保证,确保一个线程的修改能对其他线程是可见的。某些情况下,volatile 还能提供原子性,如读 64 位数据类型,像 long 和 double 都不是原子的,但 volatile 类型的 double 和 long 就是原子的。
5) 10 个线程和 2 个线程的同步代码,哪个更容易写?
从写代码的角度来说,两者的复杂度是相同的,因为同步代码与线程数量是相互独立的。但是同步策略的选择依赖于线程的数量,因为越多的线程意味着更大的竞争,所以你需要利用同步技术,如锁分离,这要求更复杂的代码和专业知识。
6)你是如何调用 wait方法的?使用 if 块还是循环?为什么?(答案)
wait方法应该在循环调用,因为当线程获取到 CPU 开始执行的时候,其他条件可能还没有满足,所以在处理前,循环检测条件是否满足会更好。下面是一段标准的使用 wait 和 notify 方法的代码:
The standard idiom for using the wait method
参见 Effective Java 第 69 条,获取更多关于为什么应该在循环中来调用 wait 方法的内容。
不能错过的'面向对象的java笔试题 篇2
一、选择题:(每题3分,共20题)
1. 下面关于类的说法错误的一项是( )。
A、类属于Java语言中的复合数据类型 中的基本结构单位
C、类是同种对象的集合和抽象
2. 如下所示代码:
public class Test05_01{ }
private float a;
public static void m ( ){ }
D、类就是对象 B、对象是Java语言
如何使成员变量a被方法m( )访问( )。
A、将private float a改为public float a
B、将private float a改为static float a
C、将private float a改为protected float a
D、将private float a改为float a
3. 下面关于类的说法有误的一项是( )。
A、类就是对象 抽象
C、类属于Java语言中的复合数据类型 中的基本结构单位
D、对象是Java语言
B、类是同种对象的集合和
关于Java面向对象的考试题。
4. 下列哪种类成员修饰符修饰的变量只能在本类中被访问( )。
A、protected
B、default
C、private
D、public
5. 下面关于方法的说法不正确的一项是( )。
A、类的私有方法不能被其他类直接访问。
B、Java中的构造方法名必须和类名相同。
C、方法体是对方法的实现,包括变量声明和合法语句。
D、如果一个类定义了构造方法,也可以用该类的默认构造方法。
6. 下列程序的运行结果是( )。
public class Test05_02 extends x{ }
B、编译错误
D、运行成功,但不输出
int ab(){ }
public static void main(String[] args) { }
Test05_02 b = new Test05_02 (); b.ab(); static int a = 10; a++;
System.out.println(a);
A、10 C、11
关于Java面向对象的考试题。
7. 下面关于构造方法的描述有误的一项是( )。
A、构造方法必须要有返回类型的声明。
B、构造方法和类中的方法很相似:有访问修饰符、方法名、参数列表、方法体。
C、构造方法当成是一个特殊的方法,这个方法的作用就是用来产生一个类的实例。
D、构造方法的方法名必须和类名完全相同。
8. 下列关于对象的说法错误的一项是( )。
A、对象成员是指一个对象所拥有的属性或可以调用的方法。
B、由类生成对象,称为类的实例化过程,一个实例可以是多个对象。
C、在创建类的对象时,需要使用Java的new关键字。
D、在Java中要引用对象的属性和方法,需要使用“.”操作符来实现。
9. 类的方法可以不包含下面哪一项( )。
A、方法的参数 C、方法的名称
B、方法的主体 D、方法的返回值类型
10. 下面关于变量说法错误的一项是( )。
A、对于成员变量,我们可以不需要手动的显式初始化,因为系统在创建一个新的对象的时候,会给这些成员变量赋一个初值。
B、对于引用变量,它的默认初值是null而非相应的引用类型对象,也就是说,它并不是指向任何对象的首地址。
关于Java面向对象的考试题。
C、系统会对全局(成员)变量指定默认的值,也会对局部变量赋值。
D、局部变量在使用之前,必须对其进行显式初始化。
11. 下面的各种数据类型的默认初始化值表示错误的一项是( )。
A、int是0
B、float 是0.0
C、char 是‘u0000’
D、boolean是false
12. 下面哪一项不是Java的访问控制符( )。
A、public
B、private
C、void
D、protected
13. Java语言类间的继承关系和接口间的继承关系分别是( )。
A、单继承、不能继承
C、多重继承、单继承
B、多重继承、不能继承
D、单继承、多重继承
14. 如果局部变量和成员变量同名,如何在局部变量作用域内引用成
员变量( )。
A、不影响,系统可以自己区分
B、不能引用,必须改名,使它们的名称不相同
C、在成员变量前加this,使用this访问该成员变量
D、在成员变量前加super,使用super访问该成员变量
15. 下列关于内部类说法错误的一项是( )。
A、内部类可用private或protected修饰符修饰
B、内部类不能有自己的成员方法和成员变量
C、除static内部类外,不能在类内声明static成员
D、内部类可以作为其他类的成员,而且可访问它所在的类的成员
16. 定义外部类时不能用到的关键字是( )。
A、public
B、abstract
C、protected
D、final
17. 下面说法不正确的一项是( )。
A、abstract和final能同时修饰一个类
B、抽象类既可以做父类,也可以做子类
C、声明为final类型的方法不能在其子类中重新定义
D、抽象类中可以没有抽象方法,有抽象方法的类一定是抽象类或接口
18. 有一个类B,下面为其构造方法的声明,正确的是( )。
A、void b(int x) {} C、B(int x) {}
B、void B(int x) {}
D、b(int x) {}
19. 区分类中重载方法的依据是( )。
A、不同的形参名称
B、返回值的类型不同
D、访问权限不同
C、形参列表的类型和顺序
20. 下面说法错误的一项是( )。
A、在Java中,为了节省创建对象的时间和空间,对于一些常用的方法,会将它在内存中缓存起来。
B、在JDK中针对各种基本数据类型分别定义相应的引用类型,称之为封装类(Wrapper Classes)。
C、JDK5.0中,引入了自动装箱/拆箱功能,可以让我们方便的在简单类型和对应的封装类型数据之间转换。