int i=(10==10==10),i的值是?

  一知半解的人,多不谦虚;见多识广有本领的人,一定谦虚。以下是小编为大家搜索整理的计算机考试java模拟试题,希望能给大家带来帮助!更多精彩内容请及时关注我们应届毕业生考试网!

  1、下面哪些是java语言中的关键字?

  2、下面语句哪个是正确的?

  3、以下程序测试String 类的各种构造方法,试选出其运行效果。

  4、下面语句段的输出结果是什么?

  二、不定项选择题(在每小题的五个备选答案中选出正确答案,并将正确答案的序号填入题干后面的括号内,错选多选,漏选均不得分。)

  1、给出如下代码:

  如何使成员变量m 被函数fun()直接访问?

  3、给出下面的代码段:

  下面哪个表达式是合法的?

  6、如下哪些字串是Java中的标识符?

  7、如下哪些是Java中有效的关键字?

  8、如下哪些是Java中正确的整数表示?

  9、下面的'代码段中,执行之后i 和j 的值是什么?

  10、下面句话是正确的?

  11、下面哪个赋值语句是合法的?

  12、下面哪个是main()函数的合法参数?

  13、下面哪个语句是创建数组的正确语句?

  下面哪个表达式的值与数组下标量总数相等?

  请问哪个语句是正确的?

  16、已知如下代码:

  请问哪个语句是正确的?

  17、已知如下代码:

java语言有什么特性?
跨平台,简单,分布性,半解释半编译,健壮,安全,多线程,面向对象

  • JDK(Java Development Kit,Java开发工具包): 包含JRE以及开发工具,面向开发人员使用。(PS:开发用的)

描述一下JVM加载class文件的原理机制?
JVM将类加载过程分为三个步骤:装载(Load),链接(Link)和初始化(Initialize)链接又分为三个步骤

关键字是对编译器有特殊意义单词,goto是java保留关键字后续中添加意思

必须以字母,下划线美元符号开头,余下可以是字母下划线美元符号数字开头 关键字和保留字和空格不能作为java标识符
类名驼峰命名法,变量名和方法名首字母小写第二个单词大写,包名全部小写,常量名全部大写

指程序里持续不变的值在整个程序运行过程中它是不可改变的

变量是指程序运行过程中随时可以发生变化的量

int是java的原始数据类型,Integer是java为int提供的封装类,java为每个原始数据类型都提供了封装类。

从线程安全角度考虑,String是对象不可变的,显然线程安全。StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的,而StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。

字符型常量和字符串常量的区别
形式上: 字符常量是单引号引起的一个字符 字符串常量是双引号引起的若干个字符
含义上: 字符常量相当于一个整形值(ASCII值),可以参加表达式运算 字符串常量代表一个地址值(该字符串在内存中存放位置) 占内存大小 字符常量只占一个字节 字符串常量占若干个字节(至少一个字符结束标志)

== 解读对于基本类型和引用类型 == 的作用效果是不同的

基本类型:比较的是值是否相同;引用类型:比较的是引用是否相同;

十进制 二进制 八进制 十六进制 类型之间转换?

当前面条件不成立时候后面条件不运行 前者短路,后者不短路

如果是【前++】,那么变量立刻马上+1,然后拿着结果进行使用。【先加后用】

如果是【后++】,那么首先使用变量当前本来的数值,然后变量再+1。【先用后加】

数组下标从0开始 10个数组 0-9
数组赋值一个地址由个,深拷贝和浅拷贝

面向对象和面向过程的区别

优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。

缺点:没有面向对象易维护、易复用、易扩展

优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护

缺点:性能比面向过程低

我认为面向对象,就是现实生活中事物存在的实体,Java把他抽象成类来处理、

类就是一个模板 属性(变量)行为(方法)

封装:把不合理信息封装一个方法,提供公共get set方法

继承:满足is a关系的 鸟是飞机 不对 x

构造器和类型一样,没有返回值,一个类可以有多个构造器(方法重载)
当类被实例化 你写一个构造器 java jvm将不再增送
继承关系2个类 先调用父类构造器然后调用子类构造器 所有类都继承object类

a a =new b() 父类对象 只能调用父类属性方法 还能调用子类重写父类方法
不同人执行同一个方法时候是不一样的这就是多态

有继承关系 要有重写 父类引用指向子类对象

方法重载和重写override区别?
重写:存在继承关系的两个类
重载:参数列表不同(可能是,参数个数不同,参数类型不同,相同返回值类型)根返回值无关

访问修饰符?子类必须大于父类
当前包下,不同包存在继承关系2个类 protected

调用当前类的当前对象,this调方法,构造方法

()super调用父类属性,super()调用父类构造器、

final修饰类该类不能被继承,但可以继承别人
final修饰方法改方法不能被重写
final修饰成员变量,值不能被改变

可以通过类名直接调用 静态方法只能访问静态属性

类被加载,构造器之前使用,静态块只能使用静态属性

java只支持值传递 对吗? 对的

抽象类用abstract修饰 可以有属性可以有方法 还可以有抽象方法
抽象类不能被实例化,必须用一个类继承,必须重写改类,要不然该类还是抽象类
interface修饰就是接口,接口除了有属性还有方法。只允许方法的声明没有方法的实现
接口不能被实例化 必须一个类实现接口 important 实现接口要不然改类还是抽象类
抽象方法的类一定是抽象类

java只支持单继承对吗?对的

接口和抽象类什么时候使用?
满足isa关系时候用抽象类
不满足isa关系时候用接口

长度可以改变,存储数据类型多样 集合是个接口
Hashset 无序集合 存储和取出元素可能不一致

泛型:约束集合只能纯一个值
迭代器 it 判断没没有下一个值

文件流 字节流 和字符流 不要记

字节流 复杂文件,音频

字符流 文本文件,首推

第三部分:Java面向对象
1. 面向对象设计思想
2. 面向对象的分析与设计
4. 类中成员变量的定义与意义
5. 构造方法的定义和调用
一个方法里面有多个构造器,(参数列表区分)
当类被实例化调用构造方法
调用当前类的当前对象,this调方法,构造方法
()super调用父类属性,super()调用父类构造器、
6. 面向对象的封装特性
把不合理信息封装一个方法,提供公共get set方法
7. 局部变量和成员变量的作用域问题
8. 静态属性、静态方法、静态代码块
9. 面向对象的继承特性
10. 继承中构造方法的细节
11. 面向对象的多态特性
12. 抽象方法与抽象类

JNI是在学习Android HAL时必须要面临一个知识点,如果你不了解它的机制,不了解它的使用方式,你会被本地代码绕的晕头转向,JNI作为一个中间语言的翻译官在运行Java代码的Android中有着重要的意义,这儿的内容比较多,也是基本的,如果想彻底了解JNI的机制,请查看:

JNI是本地语言编程接口。它允许运行在JVM中的Java代码和用C、C++或汇编写的本地代码相互操作。

在以下几种情况下需要使用到JNI:

l 应用程序依赖于特定平台,平****立的Java类库代码不能满足需要

l 你已经有一个其它语言写的一个库,并且这个库需要通过JNI来访问Java代码

l 需要执行速度要求的代码实现功能,比如低级的汇编代码

通过JNI编程,你可以使用本地方法来:

l 创建、访问、更新Java对象

l 执行运行时类型检查

JVM将JNI接口指针传递给本地方法,本地方法只能在当前线程中访问该接口指针,不能将接口指针传递给其它线程使用。在VM中 JNI接口指针指向的区域用来分配和存储线程本地数据。

当Java代码调用本地方法时,VM将JNI接口指针作为参数传递给本地方法,当同一个Java线程调用本地方法时VM保证传递给本地方法的参数是相同的。不过,不同的Java线程调用本地方法时,本地方法接收到的JNI接口指针是不同的。

在Java里通过System.loadLibrary()来加载动态库,但是,动态库只能被加载一次,因此,通常动态库的加载放在静态初始化语句块中。

通常在动态库中声明大量的函数,这些函数被Java调用,这些本地函数由VM维护在一张函数指针数组中,在本地方法里通过调用JNI方法RegisterNatives()来注册本地方法和Java方法的映射关系。

本地方法可以由C或C++来实现,C语言版本:

由上面两段代码对比可知,本地代码使用C++来实现更简洁。

两段本地代码第一个参数都是JNIEnv*env,它代表了VM里的环境,本地代码可以通过这个env指针对Java代码进行操作,例如:创建Java类对象,调用Java对象方法,获取Java对象属性等。jobject obj相当于Java中的Object类型,它代表调用这个本地方法的对象,例如:如果有new

如果本地方法声明为static类型

用Java代码调用C\C++代码时候,肯定会有参数数据的传递。两者属于不同的编程语言,在数据类型上有很多差别,应该要知道他们彼此之间的对应类型。例如,尽管C拥有int和long的数据类型,但是他们的实现却是取决于具体的平台。在一些平台上,int类型是16位的,而在另外一些平台上市32位的整数。基于这个原因,Java本地接口定义了jint,jlong等等。

由Java类型和C/C++数据类型的对应关系,可以看到,这些新定义的类型名称和Java类型名称具有一致性,只是在前面加了个j,如int对应jint,long对应jlong。

我们看看jni.h和jni_md.h头文件,可以更直观的了解:

wchar_t。所以jchar就是相当于C/C++中的宽字符。所以如果要在本地方法中要定义一个jchar类型的数据,规范的写法应该是jchar c=L'C'; 实际上,所有带j的类型,都是代表Java中的类型,并且jni中的类型接口与本地代码在类型大小是完全匹配的,而在语言层次却不一定相同。在本地方法中与JNI接口调用时,要在内部都要转换,我们在使用的时候也需要小心。

Java对象在C\C++代码中的形式如下:

所有的_j开头的类,都是继承于_jobject,这也是Java语言的特别,所有的类都是Object的子类,这些类就是和Java中的类一一对应,只不过名字稍有不同而已。

在Java中,Class类型代表一个Java类编译的字节码,即:这个Java类,里面包含了这个类的所有信息。在JNI中,同样定义了这样一个类:jclass。了解反射的人都知道Class类是如何重要,可以通过反射获得java类的信息和访问里面的方法和成员变量。 JNIEnv有几个方法可以取得jclass对象:

FindClass会在系统classpath环境变量下寻找name类,注意包的间隔使用 “/ “,而不是”. “,如:

获得对象对应的jclass类型:

获得一个类的父类jclass类型:

JNI本地方法访问Java属性和方法

在JNI调用中,不仅仅Java可以调用本地方法,本地代码也可以调用Java中的方法和成员变量。在Java1.0中“原始的”Java到C的绑定中,程序员可以直接访问对象数据域。然而,直接方法要求虚拟机暴露他们的内部数据布局,基于这个原因,JNI要求程序员通过特殊的JNI函数来获取和设置数据以及调用java方法。

为了在C/C++中表示属性和方法,JNI在jni.h头文件中定义了jfieldID和jmethodID类型来分别代表Java对象的属性和方法。我们在访问或是设置Java属性的时候,首先就要先在本地代码取得代表该Java属性的jfieldID,然后才能在本地代码进行Java属性操作。同样的,我们需要调用Java对象方法时,也是需要取得代表该方法的jmethodID才能进行Java方法调用。

可以看到这四个方法的参数列表都是一模一样的,下面来分析下每个参数的含义:

上一节讲到的jclass类型,相当于Java中的Class类,代表一个Java类,而这里面的代表的就是我们操作的Class类,我们要从这个类里面取的属性和方法的ID。

这是一个常量字符数组,代表我们要取得的方法名或者变量名。

这也是一个常量字符数组,代表我们要取得的方法或变量的签名。

什么是方法或者变量的签名呢?

我们来看下面的例子,如何来获得属性和方法ID:

上述代码中的id_show取得的jmethodID到底是哪个show方法呢?由于Java语言有方法重载的面向对象特性,所以只通过函数名不能明确的让JNI找到Java里对应的方法。所以这就是第三个参数sig的作用,它用于指定要取得的属性或方法的类型签名。

(参数1类型签名参数2类型签名参数3类型签名.......)返回值类型签名

3) 根据获取的ID,来取得和设置属性,以及调用方法。

l 获得、设置属性和静态属性

取得了代表属性和静态属性的jfieldID,就可以使用JNIEnv中提供的方法来获取和设置属性/静态属性。

获取属性/静态属性的形式:

设置属性/静态属性的形式:

Set方法的第一个参数代表要设置的属性所属的对象或jclass对象,第二个参数即属性ID,第三个参数代表要设置的值。

取得了代表方法和静态方法的jmethodID,就可以用在JNIEnv中提供的方法来调用方法和静态方法。

上面的Type这个方法的返回值类型,如Int,Char,Byte等等。

第一个参数代表调用的这个方法所属于的对象,或者这个静态方法所属的类。

后面的参数,就代表这个方法的参数列表了。

上述方法的调用有三种形式:

静态方法的调用方式和成员方法调用一样。

1) 本地代码创建Java对象

JNIEnv提供了下面几个方法来创建一个Java对象:

本地创建Java对象的函数和前面本地调用Java方法很类似:

第一个参数jclass class 代表的你要创建哪个类的对象

第二个参数jmethodID methodID 代表你要使用哪个构造方法ID来创建这个对象。

只要有jclass和jmethodID ,我们就可以在本地方法创建这个Java类的对象。

指的一提的是:由于Java的构造方法的特点,方法名与类名一样,并且没有返回值,所以对于获得构造方法的ID的方法env->GetMethodID(clazz,method_name ,sig)中的第二个参数是固定为类名,第三个参数和要调用的构造方法有关,默认的Java构造方法没有返回值,没有参数。例如:

2) 本地方法对Java字符串的操作

在Java中,字符串String对象是Unicoode(UTF-16)编码,每个字符不论是中文还是英文还是符号,一个字符总是占用两个字节。在C/C++中一个字符是一个字节, C/C++中的宽字符是两个字节的。所以Java通过JNI接口可以将Java的字符串转换到C/C++的宽字符串(wchar_t*),或是传回一个UTF-8的字符串(char*)到C/C++,反过来,C/C++可以通过一个宽字符串,或是一个UTF-8编码的字符串创建一个Java端的String对象。

可以看下面的一个例子:

由上面的代码可知,从java端取得的String属性或者是方法返回值的String对象,对应在JNI中都是jstring类型,它并不是C/C++中的字符串。所以,我们需要对取得的 jstring类型的字符串进行一系列的转换,才能使用。

JNIEnv提供了一系列的方法来操作字符串:

将一个jstring对象,转换为(UTF-16)编码的宽字符串(jchar*)。

将一个jstring对象,转换为(UTF-8)编码的字符串(char*)。

这两个函数的参数中,第一个参数传入一个指向Java 中String对象的jstring引用。第二个参数传入的是一个jboolean的指针,其值可以为NULL、JNI_TRUE、JNI_FLASE。

如果为JNI_TRUE则表示开辟内存,然后把Java中的String拷贝到这个内存中,然后返回指向这个内存地址的指针。

如果为JNI_FALSE,则直接返回指向Java中String的内存指针。这时不要改变这个内存中的内容,这将破坏String在Java中始终是常量的规则。

如果是NULL,则表示不关心是否拷贝字符串。

使用这两个函数取得的字符,在不适用的时候,要分别对应的使用下面两个函数来释放内存。

第一个参数指定一个jstring变量,即要释放的本地字符串的资源

第二个参数就是要释放的本地字符串

3.6 Java数组在本地代码中的处理

上面是JNIEnv提供给本地代码调用的数组操作函数,大致可以分为下面几类:

2) 对象类型数组的操作

3) 对基本数据类型数组的操作

基本数据类型数组的操作方法比较多,大致可以分为如下几类:

这类函数可以把Java基本类型的数组转换到C/C++中的数组。有两种处理方式,一是拷贝一份传回本地代码,另一种是把指向Java数组的指针直接传回到本地代码,处理完本地化的数组后,通过Realease<Type>ArrayElements来释放数组。处理方式由Get方法的第二个参数isCopied来决定。

其第三个参数mode可以取下面的值:

l 0:对Java的数组进行更新并释放C/C++的数组

1.7局部引用与全局引用

Java代码与本地代码里在进行参数传递与返回值复制的时候,要注意数据类型的匹配。对于int, char等基本类型直接进行拷贝即可,对于Java中的对象类型,通过传递引用实现。VM保证所有的Java对象正确的传递给了本地代码,并且维持这些引用,因此这些对象不会被Java的gc(垃圾收集器)回收。因此,本地代码必须有一种方式来通知VM本地代码不再使用这些Java对象,让gc来回收这些对象。

JNI将传递给本地代码的对象分为两种:局部引用和全局引用。

l 局部引用:只在上层Java调用本地代码的函数内有效,当本地方法返回时,局部引用自动回收。

l 全局引用:只有显示通知VM时,全局引用才会被回收,否则一直有效,Java的gc不会释放该引用的对象。

默认的话,传递给本地代码的引用是局部引用。所有的JNI函数的返回值都是局部引用。

2) 手动释放局部引用情况

虽然局部引用会在本地代码执行之后自动释放,但是有下列情况时,要手动释放:

l 本地代码访问一个很大的Java对象时,在使用完该对象后,本地代码要去执行比较复杂耗时的运算时,由于本地代码还没有返回,Java收集器无法释放该本地引用的对象,这时,应该手动释放掉该引用对象。

这个情形的实质,就是允许程序在native方法执行期间,java的垃圾回收机制有机会回收native代码不在访问的对象。

l 本地代码创建了大量局部引用,这可能会导致JNI局部引用表溢出,此时有必要及时地删除那些不再被使用的局部引用。比如:在本地代码里创建一个很大的对象数组。

在上述循环中,每次都有可能创建一个巨大的字符串数组。在每个迭代之后,native代码需要显示地释放指向字符串元素的局部引用。

l 创建的工具函数,它会被未知的代码调用,在工具函数里使用完的引用要及时释放。

l 不返回的本地函数。例如,一个可能进入无限事件分发的循环中的方法。此时在循环中释放局部引用,是至关重要的,这样才能不会无限期地累积,进而导致内存泄露。

局部引用只在创建它们的线程里有效,本地代码不能将局部引用在多线程间传递。一个线程想要调用另一个线程创建的局部引用是不被允许的。将一个局部引用保存到全局变量中,然后在其它线程中使用它,这是一种错误的编程。

在一个本地方法被多次调用时,可以使用一个全局引用跨越它们。一个全局引用可以跨越多个线程,并且在被程序员手动释放之前,一直有效。和局部引用一样,全局引用保证了所引用的对象不会被垃圾回收。

JNI允许程序员通过局部引用来创建全局引用, 全局引用只能由NewGlobalRef函数创建。

下面是一个使用全局引用例子:

在native代码不再需要访问一个全局引用的时候,应该调用DeleteGlobalRef来释放它。如果调用这个函数失败,Java VM将不会回收对应的对象。

1.8 本地C代码中创建Java对象及本地JNI对象的保存

通常在JVM里创建Java的对象就是创建Java类的实例,再调用Java类的构造方法。而有时Java的对象需要在本地代码里创建。以Android中的Bitmap的构建为例,Bitmap中并没有Java对象创建的代码及外部能访问的构造方法,所以它的实例化是在JNI的c中实现的。

C代码中某次被调用时生成的对象,在其他函数调用时是不可见的,虽然可以设置全局变量但那不是好的解决方式,Android中通常是在Java域中定义一个int型的变量,在本地代码生成对象的地方,与这个Java域的变量关联,在别的使用到的地方,再从这个变量中取值。

在注册native函数之前,C中就已经把Java域中的属性的jfieldID得到了。通过下列方法:

总结一下,c++中生成的对象如何保存和使用:

4) 另外的调用过程中,通过JNIEnv::GetIntField()获取Java对象的属性,再转化为真实的对象类型。

我要回帖

更多关于 int的值 的文章

 

随机推荐