Android程序员面试分类模拟1.docx
Android程序员面试分类模拟1论述题1. 什么是实例变量?什么是局部变量?什么是类变量?什么是final变量?正确答案:实例变量:变量归对象所有,只有在实例化对象后才可以。每当实例化一个对象时(江南博哥),会创建一个副本并初始化,如果没有显示初始化,会初始化一个默认值:各个对象中的实例变量互不影响。局部变量:在方法中定义的变量,在使用前必须初始化。类变量:用StatiC可修饰的属性;变量归类所有,只要类被加载,这个变量就可以被使用(类名,变量名所有实例化的对象共享类变量。final变量:表示这个变量为常量,不能被修改。2. Java中作用域有哪些?正确答案:在计算机程序中,声明在不同地方的变量具有不同的作用域,例如:局部变量、全局变量等。在JaVa语言中,作用域是由花括号的位置决定的,它决定了其定义的变量名的可见性与生命周期。在JaVa语言中,变量的类型主要有3种:成员变量、静态变量和局部变量。类的成员变量的作用范围与类实例化对象的作用范围相同,当类被实例化的时候,成员变量就会在内存中分配空间并初始化,直到这个被实例化对象的生命周期结束时,成员变量的生命周期才结束。被StatiC修饰的成员变量被称为静态变量或全局变量,与成员变量不同的是静态变量不依赖于特定的实例,而是被所有实例所共享,也就是说只要一个类被加载,JW就会给类的静态变量分配存储空间。因此,就可以通过类名和变量名来访问静态变量。局部变量的作用范围与可见性为它所在的花括号内。此外,成员变量也有4种作用域,它们的区别如下表所示。作用域的对比作用域/可见性当前类同-package/类其他packagepublicJprivateJX××protected×default××public:表明该成员变量或方法对所有类或对象都是可见的,所有类或对象都可以直接访问。private:表明该成员变量或方法为私有的,只有当前类对其有访问权限,除此之外其他类或者对象都没有访问权限。protected:表明成员变量或方法对该类自身,与它在同一个包中的其他类,在其他包中的该类的子类都可见。default:只有自己和与其位于同一包内的类可见。如果父类与子类位于同一个包内,则子类对父类的default成员变量或方法都有访问权限,但是如果父类与子类位于不同的PaCkage(包)内,则没有访问权限。需要注意的是这些修饰符只能修饰成员变量,不能用来修饰局部变量。private与protected不能用来修饰外部类(只有publicabstract或final能用来修饰外部类),但它们可以用来修饰内部类。3. Overload和OVelTide有什么区别?正确答窠:OVerload(重载)和OVei'ride(覆盖)是JaVa多态性的不同表现。其中,Overload是在一个类中多态性的一种表现,是指在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型。在使用重载时,需要注意以下几占1)重载是通过不同的方法参数来区分的,例如:不同的参数个数、不同的参数类型或不同的参数顺序。2)不能通过方法的访问权限、返回值类型和抛出的异常类型来进行重载。3)对于继承来说,如果基类方法的访问权限为PriVate,那么就不能在派生类时对其重载,如果派生类也定义了一个同名的函数,这只是一个新的方法,不会达到重载的效果。OVellide是指派生类函数覆盖基类函数。覆盖一个方法并对其重写,以达到不同的作用。在使用覆盖时需要注意以下几点:1)派生类中的程盖的方法必须要和基类中被溟盖的方法有相同的方法名和参数。2)派生类中的覆盖方法的返回值必须和基类中被覆盖方法的返回值相同。3)派生类中的覆盖方法所抛出的异常必须和基类中被覆盖的方法所抛出的异常一致或是其子类。4)基类中被覆盍的方法不能为private,否则其子类只是定义了一个方法,并没有对其实现覆番。重载与覆盖的区别主要有以下几个方面的内容:D覆盖是子类和父类之间的关系,是垂直关系;重载是同一个类中方法之间的关系,是水平关系。2)覆盖只能由个方法或只能由一对方法产生关系;方法的重载是多个方法之间的关系。3)覆盖要求参数列表相同;重载要求参数列表不同。1. 覆盖关系中,调用方法体是根据对象的类型(对象对应存储空间类型)来决定的;而重载关系是根据调用时的实参表与形参表来选择方法体的。4. 如何理解UniCOdC编码?正确答案:对于计标质而言,它只能识别01字串,但是Ol字串可读性太差,因此就需要把可读性更好盼字符串转换为Ol字串存储在计算机中。那么如何建立可读字符与Ol字串之间的关系呢?这就需要一个标准,在Java中使用的是Unicode标准,这个标准定义了字符与数字之间的映射关系。Unicode的第一个版本是用两个字节(16bit)来表示所有字符,其实Unicode标准主要涉及两个方面:D规范会定义字符与数字之间的映射关系,也就是说规范会给每个字符指定唯一的数字。2)如何在计算机中存储字符对应的数字。于是出现r不同的存储方式,例如:UTF-8和UTF-16等编码。为了理解不同编码的区别,下面以UTF-8和UTF-16为例来介绍它们的区别。UTFT6使用定长的字节存储,也就是说,对于任意的字符,都是用两个字节来存储,而UTF-8则使用变长的字节来存储。例如“汉”字对应的UniCode编码是6C49(二进制:0110110001001001,十进制:27721)。如果使用UTFT6来存储这个汉字,那么只需要使用两个字节存储6C49即可。但是如果要使用UTF-8来存储6C49,首先需要确定需要几个字节来保存这个数字,而UTF-8由于里面有额外的标志信息,所有1个字节只能表示2的7次方128个字符,两个字节只能表示2的11次方2048个字符,而3个字节能衣示2的16次方,65536个字符。显然“汉”的编码介于2048与65536之间,因此需要3个字节来保存。UTF-8使用下面的方法来确定一个字符使用了几个字节来保存:1)1个字节,使用OXXXXXXX的格式,XX代表任意实际的编码;2)2个字节:1IOxxxxxIOxxxxxx;3)3个字节:11IOxxxxIOxxxxxx1Oxxxxxxo显然,对于“汉”,使用UTF-8保存的时候,保存的内容为IUo(HlO1011000110001001(E68189)下面通过一个例子来加深理解:importjava.io.UnsupportedEncodingException;publicclassTestprivatestaticfinalStringHEX_DIGITS=Pl23456789ABCDEF”;publicstaticStringhexConvert(bytebuf,intlength)if(buf=null)return(null);StringBuffcrsb=newStringBuffer(2*length):for(inti=0;i<length;i+)sb.appcnd(HEX-DGITS.charAt(bufife0x000000F0)>>4):sb.append(HEXDIGITS.charAt(bufi&0x000000F);Ireturn(sb.toString():)publicstaticvoidencodeBytes(Stringstr)throwsIlnsupportedEncodingExceptionSystem,out.Println("""+str+"”占用的字节数”);byteb;b=str.getBytes("UTF-8");System,out.printIn(wUTF8编码:"+b.length+”字节"+"HEX=ThexConvert(b,b.length):b=str.gelBytes("UTFT6");SyStem.out.printIn("UTF16编码:"+b.length+”字节"+"HEX="+hexConvert(b,b.length):b=str.getBytes("Unicode");System,out.printin(Unicode:"+b.length+”字节,+*HEX=*+hexConvert(b»b.length);b=str.getBytesO;System,out.Println("默认编码“+System,getProPerly("file.encoding")+"编码:"+b.length+”字节"+"HEX="+hexConvert(b,b.length);publicstaticvoidmain(Stringargs)throwsUnsupportedEncodingException(encodeBytes("汉");encodeBvtes(*a*);)程序运行结果为:"汉"占用的字节数UTF8编码:3字节HEX=E6B189IJTFI6编码:4字节HEX=FEFF6C49Unicode:4字节HEX=FEFF6C49默认编码UTF-8编码:3字节HEX=E6B189"a"占用的字节数UTF8编码:1字节HEX=61UTF16编码:4字节HEX=FEFFo061Unicode:4字节HEX=FEFFO061默认编码UTF-8编码:1字节HEX=61从运行结果可以发现,“汉”这个字符在使用UTF-8编码的时候与上面的分析结果相同,而使用UTF-8保存英文字符只需要1个字节。而UTF-16使用了4个字节来保存所有字符,其中开头的两个字节表示字节序,FEFF表示大端(从左到右填充),FFEF表示小端(从右到左填充)。如果指定字节序,那么就只需要两个字节。上面介绍的UniCode只能表示65536个字符,为了表示更多的字符,出现了UniCodC的第二个版本,可以用4个字节表示所有字符,相对应地也就出现了UTF-8、UTF-16和UTF-32等编码。这里就不详细介绍了。JVM规范规定JaVa采用UTF-16编码作为内码,也就是说在JVM内部,字符是用两个字节表示的。5. 运行时异常和普通异常有什么区别?正确答案:Java提供Jz两种错误的处理类,分别为Error和Exception.且它们拥有共同的父类:ThrowableeErrOr表示程序在运行期间出现了非常严重的错误,且该错误是不可恢复的,由于这属于JVM层次的严重错误,会导致程序终止执行。此外,编译器不会检杳ErrOr是否被处理,因此在程序中不推荐去捕获ErrOr类型的异常,主要原因是运行时异常多是由于逻辑错误导致的,属于应该解决的错误,也就是说一个正确的程序中是不应该存在Error的。OUlofMCmoryE门pr、ThreadDcath等都属于错误。当这些异常发生时,JVM一般会选择将线程终止。EXCePtiOn表示可恢复的异常,是编译器可以捕捉到的。它包含两种类型:运行时异常(运runtimeexception)和普通异常(有时也被叫作CheCkedexception)。1)检查异常走在程序中最经常碰到的异常,所有继承闩EXCePtion并且不是运行时异常的异常都是检查异常,例如最常见的10异常和SQ1.异常。对于这种异常,都发生在编译阶段,Java编译器强制程序去捕获此类型的异常,即把可能会出现这些异常的代码放到try块中,把对异常的处理的代码放到catch块中。这种异常一般在如下几种情况中使用。异常的发生并不会导