面试中的一些问题

android是什么?Android的框架;

android是基于linux平台的自由及开放的操作系统,主要用于移动设备如手机和移动PDA等设备,有google和开放手机联盟共同推出。包括操作系统、中间件、用户界面以及应用程序。

Android的框架从上往下主要包括:applications(应用包括:通讯录、短信等)、application frameworkactivityservice等)、libraries c/c++库)android runtimeandroid运行时)、linux kernal(包含camer 驱动、mediaplayer 驱动等);

2.android四大组件及各自含义;

Activity:活动,一个activity对应一个界面,可以加载对应xml中的控件也可以监听并响应用户事件。

使用方式:继承activity,重写onCreateonStart等方法;

Service:服务,不含界面,不能与用户直接交互,运行于程序后台,通常用于处理一些耗时长的操作,避免阻塞主线程;

使用方法:继承Service,启动模式重写onStartCommond方法,绑定方式重写onBind();注意Service运行在主线程中,因此耗时操作需要另开线程,或者用IntentService

Broadcast Receiver:广播接收器,使用它可以过滤一些事件而只对自己感兴趣的事件作出响应,他没有界面,但是可以通过activityservice来响应响应事件、也可以通过震动、响铃或者notification来响应;

使用方法:继承BroadcastReceiver,重写onReceive方法,onReceive的是处理时间是10S,因此耗时操作不能直接写在里面,需要通过intent传给Service来处理;

注册方式:静态注册,在manifest中注册,应用关闭也存在;动态注册,一般在需要接受广播的组件中onResume时注册,onPause是取消注册;

Content provider:内容提供者,它为android应用之间进行数据共享的统一访问方式。

使用方法:采用ContentResolver来实现增删改查,uri地址格式:conten//唯一标准(通常是包名)/资源路径/资源ID

自定义:继承ContentProvider,实现querydeleteupdate等方法,然后在manifest中注册。

3.Activity启动模式;

Standard:默认模式、标准模式。每次激活activity时,都会重新创建activity实例,退出都会销毁该activity实例;

Single Top:需要被激活的activity位于栈的顶部的时候,不需要重新创建activity实例,否则都需要创建activity实例;

Single Task:只要需要被激活的activity位于栈中,就会将其上面的所有activity移除,通过newInstance重用该activity实例,始终使其处于栈顶;

Single instance:在启动的时候,会开启一个新的BackStack,这个BackStack里只有一个Activity的实例存在,并且把这个BackStack获得焦点。这是一种很极端的模式,它会导致整个设备的操作系统里,只会 存在一个这个Activity示例,无论是从何处被启动的。

4.Activity转屏(ctrl+f12)生命周期变化、界面跳转、回到桌面生命周期变化;

Activity生命周期:onCreate(创建)--onStart(可见、无焦点)--onResume(可见、有焦点)--onPause(可见、无焦点)--onStop(不可见、无焦点)--onDestory(销毁);

Activity生命状态:active--pause--stop--destory

启动activity的过程:onCreate--onStart--onResume

界面跳转:onPause1--onCreate2-onStart2--onResume2--onStop1

界面返回:onPause2--onRestart1--onStart1--onResume1--onStop2--onDestory2

回到主界面:onSaveInstanceState1--onPause1--onStop1

转横屏:onSaveInstanceState()--onPause()--onStop()--onDestory()--onCrate()--onStart()--onRestoreInstanceState()--onResume()

转竖屏:onSaveInstanceState()--onPause()--onStop()--onDestory()--onCreate()--onStart()--onRestoreInstanceState()--onResume()--onSaveInstanceState()--onPause()--onStop()--onDestory ()--onCreate()--onStart()--onRestoreInstanceState()--onResume()

manifest中加入:configChanges=orientation

转横屏:onSaveInstanceState()--onPause()--onStop()--onDestory()--onCreate()--onStart()--onRestoreInstanceState()--onRsume();

转竖屏:onSaveInstanceState()--onPause()--onStop()--onDestory()-onCreate()--onStart()--onRestoreInstanceState()--onResume()--onConfigurationChanged();

manifest中加入:configChanges=orientation|keyboardHidden

转横屏:onConfigurationChanged()

转竖屏:onConfigurationChanged()--onConfigurationChanged();

5.Activity之间数据的传输方式?

Activity之间的数据通过intent.putExtra();传输,简单的直接传递,复杂的可以通过Bundle传输,注意bundle传递的对象必须要经过序列化,实现parcelable

6.同一个应用中,不同的activity中是否可以放在不同的Task中?

答:可以放在不同的Task中。需要为不同的activity设置不同的taskaffinity属性,启动activityIntent需要包含FLAG_ACTIVITY_NEW_TASK标记

7.Activity变成窗口?

两种方式:一种是自定义样式的方式实现:在manifesttheme=@style/myStyle”,另一种是调用系统的窗口样式在manifesttheme=@androidstyle/Theme.dialog”;

8.如何退出activity?完全退出整个应用?

退出activity可以采用finish()、system.exit()killProcess();

退出整个应用有以下几种方式:

用列表记住打开的activity,退出时一一关闭(通过application单例模式实现);

通过广播关闭:在需要关闭的activity中注册广播,收到广播后关闭;

抛出异常关闭:需要处理异常弹出框.

9.Service启动方式及生命周期;

启动模式:Context.startService()--onCreate--onStart--运行--Context.StopService()--onDestory;需要主动调用stopService停止服务,否则可能会一直运行;

绑定模式:Context.bindService()--onCreate--onBind--运行--onUnbind()--onDestory,与绑定的activity生命周期一致,无需手动关闭服务。

10.IntentService

IntentService通过Context.startService(Intent)的方式启动了一个可以处理异步请求的service,使用时只需要继承IntentService,添加一个空的构造方法(调用父类含字符串的方法),重写onHandleIntentIntent.

主要特点:1在应用的主线程外创建一个单独的工作线程来处理传递到onStartCommand()方法的Intent组件;2创建一个工作队列,每次传递一个IntentonHandleIntent,开发人员不需要考虑多线程问题, 3当所有请求处理完后,会自动停止服务不需要开发人员显示调用stopSelf方法,4提供了onBind的实现并返回null5提供了onStartCommond的默认实现,将所有的intent发送到一个工作队列,并进一步发 送到onHandleIntent。应用场景:下载任务

这是一个基于消息的服务,每次启动该服务并不是马上处理你的工作,而是首先会创建对应的Looper,Handler并且在MessageQueue中添加的附带客户Intent的Message对象,当Looper发现有Message的时候 接着得到Intent对象通过在onHandleIntent((Intent)msg.obj)中调用你的处理程序.处理完后即会停止自己的服务.意思是Intent的生命周期跟你的处理的任务是一致的.所以这个类用下载任务中非常好,下 载任务结束后服务自身就会结束退出。

10.Service远程调用;

Aidlandroid interface definition languageandroid接口定义语言)。

在服务端:1)创建aidl2)编译aidl,在eclipse中直接在gen文件夹下面;3)实现aidl中的Stud类;4)将新建的服务添加到manifest中;

在客户端:1)将aidl文件拷贝到客户端,在gen下面自动生成接口类;2)在客户端中通过serviceConnection调用服务器服务remoteService.Stub.asInterface(service);

11.数据存储的方式;

SharePreferences:存储各种参数,以xml格式存储。以key-value的方式存储数据,keyString类型,value可以是基本数据类型和String类型的数据;

       通过preferenceManager.getDefaultSharedPreferences(this);或通过this.getSharedPreferences(MODE_);通过SharedPreferences.Editor存放数据,执行完后需要用Editor,commit();

   通过preferences.registerOnsharedPreferenceChangedListener()监听;

contentProvider:内容提供器,提供数据共享接口。

Sqlite:轻量级的本地数据库,可支持sql语句,注意sqlite不能一次读取过多条数据,会导致溢出,可以先查一下有多少条,然后按每次少于5000取;

File:通过IO流存储和读取,会涉及SDcard权限;IO流分两种:字符流、字节流

网络:通过HTTPwebservice实现数据存储

数据存储在/data/data/packagename/share_prefs(filesdatabase)

12.Android常用控件;

ButtonTextViewListViewEditTextSpinnerGridView

13.Fragment的使用、生命周期;

Fragment:碎片,他有自己的生命周期、布局文件也能处理自己的事件,但是他不能单独存在,必须依附于activity,其生命周期也将受到activity生命周期的影响。

activity中使用fragment有两种方式:一种是在activityxml文件中通过<fragment>来使用,注意必须添加name=“自定义的fragment”;另一种则是直接在activity的代码中创建,通过FragmentManager manager  = getFragmentManager();FragmentTranSaction  ft= manager.beginTranSaction(); MyFragment fragement = new MyFragment(); ft.add(R.id.layout,fragment);ft.commit();

Fragment生命周期:onAttach--onCreate--onCreateView--onActivityStarted--onstart--onResume--onpause--ondestoryView--onDestory--onDetach

Activity一起的生命周期:onCreateActivity--onAttach--onCreate--onCreateView--onStartActivity--onActivityStart--onStart--onResumeActivity--onResume--onPause--onPauseActivity-onStop--onStopActivity--onDestoryView--onDestory--onDetach--onDestoryActivity)。

14.ViewPager的使用;

1.ViewPager用于实现多页面的切换效果,该类存在于Google的兼容包里面,所以在引用时记得在BuilldPath中加入“android-support-v4.jar”;

2.xml文件中添加viewpager;创建每个子页面的xml文件

3.onCreate内实例化viewpager,实例化各个子页面的view,并将view添加到List<View>中;

4.实例化PagerAdapter,重写instantiateItem方法;

5.viewpager.setAdapter(pageAdapter)

15.Listview的优化;

Listview每条数据显示的时候都会执行getView操作,因此Listview的优化主要体现在这个模块。不做优化,即每次滚动都新建View会造成巨大的资源浪费,判断convertview是否为空,在为空时实例化,不 为空时仅仅更换数据可以提高效率2倍,但是通过viewHolderconvertView.setTag可以再提高0.5倍效率。

16.其他的一些加载速度、性能优化:

1)图像:预先缩放视图大小,避免实时缩放;originalImage = Bitmap.createScaledBitmap(originalImage, // 缩放图像view.getWidth(), // 视图宽度view.getHeight(), // 视图高度true); // 线性过滤器

2)背景:默认的情况下窗口有个默认的背景,当高层视图不是透明的或者或者高层视图覆盖整个区域则不需要显示窗口默认背景,因此可以去掉:在onCreategetWindow().setBackgroundDrawable(null); 节省时间;

3)Xml:若窗口包含的视图太多、则绘制时间会很长,界面反应速度会很慢。因此:使用中间件合并视图,如merge可以减少根节点;使用relativeLayout减少层次;使用自定义视图;使用自定义布局;

4)内存分配:在性能敏感的代码里,避免创建java对象:onMeasure();onDraw();getView();onLayout();onTouchEvent();

5)管理好对象:使用软引用:内存缓存;使用弱引用:避免内存泄露。

17.列表中含有按钮如何解决焦点冲突?

1)自定义按钮控件,将按钮对应的数据传给自定义按钮;

2)自定义一个onCLickListener,获取View中的数据,在onClick中进行处理,并将执行结果绑定到Button按钮中即可。

18.自定义控件如何实现?

实现方式有三种:

1)继承已有的控件来实现自定义控件:一般是自定义控件与原有控件有很多相似功能,需要在其上进行扩展的时候;

2)继承LinearLayout来实现自定义控件:一般来说做组合控件的时候可以采用此方法。此时不用onDraw方法,在构造函数中通过inflater来加载xml文件,再addViewv),自定义控件就加在过来了。

3)继承View来实现:通过GDI来绘制组件界面。

了解View属性:Android系统的视图结构的设计也采用了组合模式,即View作为所有图形的基类,ViewgroupView继承扩展为视图容器类。

View的绘图操作:measure()layout()draw(),其内部又分别包含了onMeasure()onLayout()onDraw()三个子方法。

 measure操作主要用于计算视图的大小,即视图的宽度和长度。在view中定义为final类型,要求子类不能修改。measure()函数中又会调用onDraw函数:onMeasure(),视图大小的将在这里最终确定,也就 是说measure只是对onMeasure的一个包装,子类可以覆写onMeasure()方法实现自己的计算视图大小的方式,并通过setMeasuredDimension(width, height)保存计算结果。

layout操作:用于设置视图在屏幕中显示的位置。在view中定义为final类型,要求子类不能修改。layout()函数中有两个基本操作:setFramel,t,r,b),l,t,r,b即子视图在父视图中的具体位置,该函数用于 将这些参数保存起来;onLayout(),在View中这个函数什么都不会做,提供该函数主要是为viewGroup类型布局子视图用的。

draw操作利用前两部得到的参数,将视图显示在屏幕上,到这里也就完成了整个的视图绘制工作。子类也不应该修改该方法,因为其内部定义了绘图的基本操作:绘制背景;如果要视图显示渐变框,这里 会做一些准备工作;绘制视图本身,即调用onDraw()函数。在viewonDraw()是个空函数,也就是说具体的视图都要覆写该函数来实现自己的显示(比如TextView在这里实现了绘制文字的过程)。而对ViewGroup则不需要实现该函数,因为作为容器是“没有内容“的,其包含了多个子view,而子View已经实现了自己的绘制方法,因此只需要告诉子view绘制自己就可以了,也就是下面的dispatchDraw() 方法;绘制子视图,即dispatchDraw()函数。在view中这是个空函数,具体的视图不需要实现该方法,它是专门为容器类准备的,也就是容器类必须实现该方法;如果需要(应用程序调用了setVerticalFadingEdge 或者setHorizontalFadingEdge),开始绘制渐变框;绘制滚动条。从上面可以看出自定义View需要最少覆写onMeasure()onDraw()两个方法。

19.OnClickonTouch的区别,能不能同时使用?

onTouchdown返回false表示是按键事件,若为true则表示是触摸事件,而up标记此事件此事件的结束时间,判断是否为长按(为true表示此时间一直没结束);因此:

1)若onTouchfalse,则:首先是down事件,此时,若长按,则出发onLongClick事件,接着up事件,按键事件结束,触发onClick事件;

2)若onTouchtrue,则线是down事件,然后是up事件,不会触发onClickonLongClick事件;

3)若downtrueupfalse,则表示是触摸事件,不会触发按键事件;

4)若downfalseuptrue,则表示是按键事件,up一直为true,表示此事件一直没有结束,达到长按临界值时就会触发onLongClick事件,不会触发onClick事件;

20.Android图片处理,OOM

Android应用程序的内存大小有限制,根据平台而定有16Mb24Mb。一般耗内存的就是图片、音频和视频,但是音频和视频android采用边解析边播放的方式,因此一般不会出现OOM。因此图片比较容易出 现此类情形:1)显示单张图片,体积大道3000*4000级别时;2)在listViewgallery中一次性加载过多图片;

解决方案:1)采用软引用缓存图片到内存,不要每次都重新加载;2)对于不同分辨率的手机调整图片大小;3)采用低内存编码方式,如比如Bitmap.Config.ARGB_4444比Bitmap.Config.ARGB_8888更省内 存;4)及时回收图像,如果引用了大量Bitmap对象,而应用又不需要同时显示所有图片,可以将暂时用不到的Bitmap对象及时回收掉;5)自定义堆内存分配大小,优化Dalvik虚拟机的堆内存分配;

21.Java对象的引用方式:

java内存管理分为内存分配和内存回收,都不需要程序员负责。垃圾回收的机制主要是看对象是否有引用指向该对象。

1)强引用:创建一个对象并把这个对象赋给一个引用变量,垃圾处理器即使报OOM也不愿意回收强引用;

2)软引用:通过SoftReference类来实现,只具有软引用是,当内存空间足的时候不会被垃圾处理器回收,当内存不足时会被回收;可以单独使用;

3)弱引用:通过weakReference类来实现,只具有弱引用时,当垃圾处理器扫描到它时,不管内存是否够用都会被回收;可以单独使用;

4)虚引用:虚引用不能单独使用,需引用的作用是就跟踪对象被垃圾回收的 状态,程序可以通过检测与虚引用关联的虚引用队列是否已经包含了指定的虚引用,从而了解虚引用的对象是否即将被回收。 一个 对象持有虚引用,任何时候都可能被回收。

如果使用软引用,弱引用,虚引用的引用方式引用对象,垃圾回收就能够随意的释放这些对象,若果希望尽可能减小程序在起声明周期中所占用的内存大小,可以灵活使用这些引用。

  如果使用了这些引用就不能保留这些对象的强引用(强制引用应该置null),否则就浪费了这些类提供的任何好处。

22.GC是什么,什么时候会出现内存泄露?

GC是垃圾收集器。java对内存的释放采取的垃圾自动回收机制,在编程的时候不用考虑变量不用时释放内存,java虚拟机可以自动判断出并收集到垃圾,但一般不会立即释放它们的内存空间,当然也可 以在程序中使用System.gc()来强制垃圾回收,但是要注意的是,系统并不保证会立即进行释放内存。要请求垃圾收集,可以调用下面的方法之一:System.gc();或者Runtime.getRuntime().gc()。

  1. 数据库的cursor没有关闭

2.构造adapter,没有使用缓存contentview

  1. 衍生listview的优化问题-----减少创建view的对象,充分使用contentview,可以使用一静态类来优化处理getview的过程

4.Bitmap对象不使用时采用recycle()释放内存

5.activity中的对象的生命周期大于activity

6.调试方法: DDMS==> HEAPSZIE==>dataobject==>[Total Size]

23.Support包的作用?

   版本兼容,高版本兼容低版本。如api-8(android2.2)必会兼容api-4(android 1.6);但是反之则不会,你使用2.2的平台版本build了一个apk,若想能在1.6上运行,则需要做向下兼容。android support-xxgoogle 官方的向下兼容包.如名所示,会帮助构建程序向下兼容到1.6版本.不过也并非万能的,还是会受限制.

24.多线程的实现方式及区别、线程启动方式,销毁方式?

多线程的实现方式有:继承Thread和实现Runnable。重写run方法。启动方式:myThread.start();new Thread(new myRunnable()).start();销毁方式:

区别:实现Runnable的好处:避免了单继承的局限性;适合多个相同代码的线程去处理同一个资源(同一runnable实例的多个线程);增强了程序的健壮性,代码能被多个线程共享,代码是独立的。

25.线程同步及线程池的概念;

线程同步:同步是为了防止多个线程访问同一数据对象,对对象造成破坏。同步两步骤:1)将需要同时被多个线程访问的资源设置为private类型;2)对于会修改需要同步资源的代码用关键字synchronized 法或代码块。每一个对象有且仅有一个锁;当程序运行到非静态同步方法上时,会获得与该类实例有关的锁,其他线程会等待该同步方法释放锁才能获得该锁的机会。

同步与锁:1)只能同步方法和代码块,不能同步变量和类;2)每一个对象有且仅有一个锁;3)不必同步类中的所有方法,可以同时含有同步方法和非同步方法,4)如果两个线程执行一个类中同步方法,并 且使用同一个实例,则只能有一个线程获得锁,另一个需要等待第一个释放锁为止;5)一个类中含有同步和非同步方法时,多线程可以对非同步方法任意访问;6)线程sleep时不会释放所;7)线程可以获得 多个锁,如在一个类的同步方法中调用另一类的同步方法则会获得两个锁;8)同步损坏并发性,应尽量减少同步范围;9)使用同步块时需要指定在哪个对象上同步,synchronizedthis);10要同步静态方 法,需要一个用于整个类对象的锁,这个对象是就是这个类(XXX.class)

静态同步与非静态同步的区别:1、调用同一个对象中非静态同步方法的线程将彼此阻塞。如果是不同对象,则每个线程有自己的对象的锁,线程间彼此互不干预。2、调用同一个类中的静态同步方法的线程将 彼此阻塞,它们都是锁定在相同的Class对象上。3、静态同步方法和非静态同步方法将永远不会彼此阻塞,因为静态方法锁定在Class对象上,非静态方法锁定在该类的对象上。4、对于同步代码块,要看清 楚什么对象已经用于锁定(synchronized后面括号的内容)。在同一个对象上进行同步的线程将彼此阻塞,在不同对象上锁定的线程将永远不会彼此阻塞。静态同步与非静态同步不会相互影响;

线程安全:当一个类已经很好的同步以保护它的数据时,这个类就称为“线程安全的”;

线程死锁:两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。原因一般是两个对象的锁相互等待造成的。原因:因为系统资源不足;进程运行推进的顺 序不 合适;资源分配不当。

线程同步方法:1)用synchronized 2wait()+notify/notifyall()wait(long)+notify()/notifyall()wait(long,int)+notify()/notifyall();

同步块与同步方法的区别:同步块是对一段代码同步,其锁是括号中的对象的锁,因此住一次对象不要选择可能在锁的作用域改变值得对象,为null会报错。

26.线程的运行状态

1)新状态:线程对象已创建,还没有调用start();

2)可运行状态:调用start()后或者线程在运行之后或者阻塞回来以后的状态,注意调用start()方法后并不会立马进入运行状态,需要等调度程序调用,即分片处理到达该线程才会进入运行状态;

3)运行状态:线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一一种方式。

4)阻塞/等待/睡眠:这是线程有资格运行时它所处的状态。实际上这个三状态组合为一种,其共同点是:线程仍旧是活的,但是当前没有条件运行。换句话说,它是可运行的,但是如果某件事件出现,他可能返回到可运行状态。

5)死亡状态:当线程的run()方法完成时就认为它死去。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦死亡,就不能复生。 如果在一个死去的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。

27.线程的优先级

范围:1-10;默认的优先级为父类优先级,mainThread的优先级为Normal=5;最大优先级为父类最大优先级,且不能超过父类的最大优先级;可通过setPriority来修改优先级;当设计多线程应用程序的时候,一定不要依赖于线程的优先级。因为线程调度优先级操作是没有保障的,只能把线程优先级作用作为一种提高程序效率的方法,但是要保证程序不依赖这种操作。

28.Android屏幕自适应;

1)使用layout_weightlayout_width=0pxlayout_height=0px或者wrap_contentmatch_parent或者dp

2)定义不同的尺寸文件;

3)代码中实现:首先我们要做的是获取当前屏幕的宽高度,DisplayMetrics displayMetrics = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);Constant.displayWidth =  displayMetrics.widthPixels;Constant.displayHeight = displayMetrics.heightPixels;LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,(int) (Constant.displayHeight * 0.1f +  0.5f));

4)多个布局,针对largsmall等写不同xml文件,在manifest<supports-screens android:largeScreens="true"android:normalScreens="true" android:anyDensity="true" />

5)不同分辨率采用不同分辨率的图片;

6)不要使用Absolutely,像素用dip,文本用sp

29..9文件的使用?

.9.pngandroid平台上定义的一种可以被拉伸不失真的图片格式,边缘含有11个像素点的区域,用于对图片的可扩展区和内容区进行定义;

特点:1)可拉伸不变形;2)可扩展区允许内容被延伸;3)内容区用于显示文字和其他内容;4)占用资源小,节省流量,提升加载速度。

30.图片、视频的基本参数,如dppxptsp之间的定义及区别;

Dipdevice independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGAHVGAQVGA 推荐使用这个,不依赖像素。Dpdip一致

px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。

pt: point,是一个标准的长度单位,1pt1/72英寸,用于印刷业,非常简单易用; 

sp: scaled pixels(放大像素). 主要用于字体显示best for textsize

31.NDK是什么?

NDK全称:Native Development Kit。NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将sojava应用一起打包成apk;NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出哪些文件需要编译编译特性要求等),就可以创建出so

好处:使用NDK,我们可以将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率;使用NDK,我们可以将需要保密的应用逻辑使用C开发。毕竟,Java包都是可以反编译的;NDK促使专业so组件商的出现。

32.ANR是什么?怎么产生,怎么预防,如何定位?

ANRapplication not responding。产生的原因是应用长时间无响应,在activity中响应时间一般是5S,超过5S就会报ANR,因此应该避免将一些耗时的操作直接放在主线程中,可以采用开启线程和service后台处理来解决这问题。应该注意的是service中也是需要开新线程的。

33.Handler机制、Looper

andriod提供了Handler 和 Looper 来满足线程间的通信。Handler先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(MessageExchange)UIthread 通常就是main thread,而Android启动程序时会替它建立一个MessageQueue 

1)Handler创建消息:Handler创建消息时首先查询消息池中是否有消息存在,如果有直接从消息池中取得,如果没有则重新初始化一个消息实例。使用消息池的好处是:消息不被使用时,并不作为垃圾回收,而是放入消息池,可供下次Handler创建消息时使用。消息池提高了消息对象的复用,减少系统垃圾回收的次数。

2)Handler发送消息:UI主线程初始化第一个Handler时会通过ThreadLocal创建一个Looper,该LooperUI主线程一一对应。使用ThreadLocal的目的是保证每一个线程只创建唯一一个Looper。之后其他Handler初始化的时候直接获取第一个Handler创建的LooperLooper初始化的时候会创建一个消息队列MessageQueue

3)3Handler处理消息:UI主线程通过Looper循环查询消息队列UI_MQ,当发现有消息存在时会将消息从消息队列中取出。首先分析消息,通过消息的参数判断该消息对应的Handler,然后将消息分发到指定的Handler进行处理。

34.Collection类,Arraylistlinklist的区别,优缺点、arrayListvector的区别,MapHashMapHashTableSet的原理?

Collection-->set-->hashsetlinkedhashset: sortedSet-->TreeSet

  List-->arrayList:ArrayList 能够动态地增加或减小其大小。数组列表以一个原始大小被创建。 当超过了它的大小,类集自动增大。当对象被删除后,数组就可以缩小。Arrays.asList()返回一个列表      LinkedList:提供了一个链接列表数据结构;

 ArrayList 底层采用数组完成,而 LinkedList 则是以一般的双向链表(double-linked list)完成,其内每个对象除了数据本身外,还有两个引用,分别指向前一个元素和后一个元素。如果我们经常在 List   的开始处增加元素,或者在 List 中进行插入和删除操作,我们应该使用 LinkedList , 否则的话,使用 ArrayList 将更加快速。

Map-->hashMap: 映射(map)是一个存储关键字和值的 关联或者说是关键字/值对的对象。给定一个关键字,可以得到它的值。关键字和值都是对 象。关键字必须是唯一的。但值是可以重复的。有些映射可以接收 null 关键字和 null 值。而 有的则不行。

SortedMap-->TreeMap:

35.泛型,通配符,限制性通配符与非限制性通配符;

泛型是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样。

泛型的作用:1提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中(或者如果幸运的话,还存在于代码注释中)。通过在变量声明中捕获这一附加的类型信息,泛型允许编译器实施这些附加的类型约束。类型错误现在就可以在编译时被捕获了,而不是在运行时当作 ClassCastException 展示出来。将类型检查从运行时挪到编译时有助于您更容易找到错误,并可提高程序的可靠性。2消除强制类型转换。 泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。3潜在的性能收益。在泛型的初始实现中,编译器将强制类型转换(没有泛型的话,程序员会指定这些强制类型转换)插入生成的字节码中。但是更多类型信息可用于编译器这一事实,为未来版本的 JVM 的优化带来可能。

通配符:<?>,它们为一个泛型类所指定的类型集合提供了一个有用的类型范围。

限制性通配符:<? Extends >

36.常用代码管理工具;

SVNlinuxwindows都支持,在任何任何因特网接入点获取最新代码;安全性和版本管理功能较强,可以实现异地开发的支持,但 SVN 安装和使用多采用命令行方式,学习曲线高,同时不提供对变更管理的功能,对于小型团队,可以采用 SVN 进行管理。

VSS 的使用简便易学,但 VSS 的功能和安全性较弱,且只对 windows 平台进行支持,建议作为项目配置管理的入门时采用的工具;

ClearCase 功能完善,安全性好,可以支持复杂的管理,但学习曲线和学习成本高,需要集成 ClearQuest 才能完成完整的配置管理功能。大公司如果采用异地多研发中心同时开发的模式,推荐使用ClearCase

37.代码的质量审查;

  • 1编码标准、代码重复、代码覆盖率、依赖项分析、复杂度监控 2)工具:CheckStyle、PMD 的 CPD 、Coverlipse 、JDepend 、Eclipse Metric 、findbugs

38.AsyncTask的使用;

Asynctask:异步任务,是一个轻量级的异步类。使用于一些简单的异步处理之中,不太适用于多个异步后台任务处理中。使用该类时只需要继承它,并且复写它的doInbackGround()(与主线程无关,不能在 这里操作)、onPreExcute()、onPostExcute()方法即可,AsyncTask定义了三种泛型类型 ParamsProgressResultParams 启动任务执行的输入参数,比如HTTP请求的URLProgress 后台任务执行的百分 比。Result 后台执行任务最终返回的结果,比如String。相对于来说,handler则不适用于处理一些简单的异步处理之中,这样反而显得代码过多,结构过于复杂,子线程在主线程中通过start开启,同时handler 将子线程执行的消息通过handler.sendToTarget()传递给主线程的messageQuenelooper通过循环检查messageQuene中的message执行处理过程,并反馈到主线程UI控制上面。

39.Http的含义?HTTPHTTPS的区别?HTTP的方法有哪些?http的实现原理、异步HTTP的实现原理?

HTTP:超文本传输协议。用于从服务器传输超文本到本地浏览器(客户端)的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示。特点是:1)支持客户端/服务器模式;2)简单快速:客户端向服务器请求时,只需要传递请求方法和路径;3灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。4HTTP 0.91.0使用非持续连接:限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。HTTP 1.1使用持续连接:不必为每个web对象创建一个新的连接,一个连接可以传送多个对象。5无状态:HTTP协议是无状态协议(可通过cookiessession来保持状态,第一次客户端请求时成功后服务端返回一个session,之后每一次请求客户端将此session发给服务器,服务器检验合法后再返回相应数据)。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。

HTTPS:安全超文本传输协议。比HTTP(明文传输)协议多提供了SSL安全机制。HTTP端口80HTTPS端口:443.它的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全; 另一种就是确认网站的真实性,凡是使用了 https 的网站,都可以通过点击浏览器地址栏的锁头标志来查看网站认证之后的真实信息,也可以通过 CA 机构颁发的安全签章来查询

请求方法:Head向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。

      Post向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。

  GET向特定的资源发出请求。类似于查询,不会修改服务器数据,可认为是数据安全的和幂等的。提交给服务器的请求行的长度不要超过1K

  PUT向指定资源位置上传其最新内容,类似于添加功能;

  DELETE请求服务器删除Request-URI所标识的资源。类似于删除功能;

  TRACE回显服务器收到的请求,主要用于测试或诊断;

HTTP原理:HTTP是基于TCP的协议,TCP是一个端到端的面向连接的协议。所谓的端到端可以理解为进程到进程之间的通信。所以HTTP在开始传输之前,首先需要建立TCP连接。在传输完成之间并不断开TCP连接

  TCP:面向连接;数据流;保证正确性;保证顺序;结构复杂;系统资源要求多。

        3次握手:客户端向服务器发送同步序列号标志位SYN;服务端收到客户端请求返回带有确认应答ACK和同步序列SYN;客户端再回复确认应答ACK,完成三次握手。

  UDP:面向无连接;数据报;可能丢包;不保证顺序;结构简单;系统资源要求少。(应用于DNS

HTTP请求的基本过程

HTTP协议是无状态的连接,可以多个连接同时进行,不需要等到另一个连接完毕才进行。

1)建立连接:HTTP协议是TCP/IP模型中的应用层协议,两个应用程序之间的通信必须先建立TCP连接。通过网址找到对应IP,建立TCP连接;

2)客户端向服务器发送请求信息;

3)服务器返回响应请求信息;

4)客户端获取返回信息后解析;

5)关闭连接。

异步HTTP原理:

1)定义一个MyHandler抽象类类继承自Handler,构造方法onSuccess();onStart();onStop()onFailure()等。

2)封装一个异步MyHTTP类,构造如POST方法,传入参数URLStr以及MyHandler,在方法内新建子线程,通过MyHandler发送消息到主线程messagequene中,从而操作UI

3)在Activity需要使用的地方用MyHttp(urlStr,myHandler{//复写onStart等方法处理UI即可})

40.WEBSERVICE

能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都 可以相互交换数 据。Web Service是自描述、 自包含的可用网络模块, 可以执行具体的业务功能。Web Service减少了应用接口的花费。

主要技术:1xml:可扩展标记语言 2SOAP简单对象访问协议用于交换xml标准通用标记语言下的一个子集)编码信息的轻量级协议。它有三个主要方面:XML-envelope为描述信息内容和如何处理内 容定义了框架,将 程序对象编码成为XML对象的规则,执行远程过程调用(RPC)的约定 :SOAP使用XML消息调用远程方法,这样web services可以通过HTTP协议的postget方法与远程机器交互,而 且,SOAP更加健壮和灵活易用;

Web Service本身其实是在实现应用程序间的通信。我们现在有两种应用程序通信的方法:RPC远程过程调用 和消息传递。使用RPC的时候,客户端的概念是调用服务器上的远程过程,通常方式为实例化 一个远程对象并 调用其方法和属性。RPC系统试图达到一种位置上的透明性:服务器暴露出远程对象的接口,而客户端就好像在本地使用的这些对象的接口一样,这样就隐藏了底层的信息,客户端也就根本不 需要知道对象是在哪台机器上。

41.推送方案及区别;

客户端获取服务器最新数据的方式:第一种是客户端使用Pull(拉)的方式,就是隔一段时间就去服务器上获取一下信息,看是否有更新的信息出现。第二种就是 服务器使用Push(推送)的方式,当服务器端有新信息了,则把最新的信息Push到客户端上。

1)轮询(pull):应用程序应当阶段性的与服务器进行连接并查询是否有新的消息到达,你必须自己实现与服务器之间的通信,例如消息排队等。而且你还要考虑轮询的频率,如果太慢可能导致某些消息的延迟,如果太快,则会大量消耗网络带宽和电池。

2)SMSpush):通过拦截SMS消息并且解析消息内容来了解服务器的意图,并获取其显示内容进行处理。但是问题是这个方案的成本相对比较高,我们需要向移动公司缴纳相应的费用。我们目前很难找到免费的短消息发送网关来实现这种方案。

3)持久连接(push):这个方案可以解决由轮询带来的性能问题,但是还是会消耗手机的电池。这个方案存在着很多的不足之处,就是我们很难在手机上实现一个可靠的服务

解决方案:

1)C2DMcloud to device messaging):

2)MQTT协议实现android推送:

3)RSMB实现推送:

4)XMPP协议实现推送:

5)第三方平台:百度云推送、极光推送

6)自己搭建一个平台。

42.JSON解析方式;

JSON就是一串字符串 只不过元素会使用特定的符号标注。生成: JSONObject jsonObject = new JSONObject();jsonObject.put(key, value);

解析方式:1jsonObject.get(“key”);2)用GSON:Gson gson = new Gson();list = gson.fromJson(jsonString, new TypeToken<list<t>>();t = gson.fromJson(jsonString, cls);

3FastJson t = JSON.parseObject(jsonstring, cls);list = JSON.parseArray(jsonstring, cls);list = JSON.parseObject(jsonstring,new TypeReference<list<map<string,  object="">>>() {}.getType());效率最高。

43.分页查询的原理是什么?

分页的意义在于减少每次传输的数据量,根据用于所需查找某一页信息,减少不必要的信息传递,节省流量。分页可以在客户端、服务器和数据库进行,但是在客户端的方式效率最低。通过客户端通过首次进请求获得总的页数,当前页数这些信息,然后每次请求可以指定页数进行跳转。

44.ZXING开元框架,二维码基本原理。

ZXING是一个二维码的开元框架,集成了二维码扫描、解析等工作,只需要根据自己所需修改部分效果即可。二维码用到的包是:

45.XMPP协议、ASMACK包(只实现了文本传输,语音和图片是如何进行的)

XMPP协议:Extensible Messageing and presence protocol,可扩展消息与存在协议。是一种基于XML的协议,它继承了xml灵活的发展性具有良好的可扩展性,经过扩展后的xmpp可以通过发送扩展的信息来处理用户的需求,以及在xmpp顶端建立如内容发布系统和基于地址的服务等应用程序。XMPP包含了针对服务器端的软件协议,使之能与另一个进行通话,这使得开发者更容易建立客户应用程序或给一个配好系统添加功能。

46.Android的新技术有哪些?

 

47.Android的开发环境有哪些?

Eclipse+adt;  

48.有没有用过别人的框架?

49.有没有涉及源码?

50.Static的使用?静态块在什么时候加载?

static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。 用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象市,不生成static变量的副本,而是类的所有实例共享同一个static变量。static变量前可以有private修饰,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静态成员方法中使用--废话),但是不能在其他类中通过类名来直接引用,这一点很重要。

静态变量和实例变量:对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。 对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。

静态方法:静态方法可以直接通过类名调用,任何的实例也都可以调用,
因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。

静态块:static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。

static和final一块用表示什么 :static final用来修饰成员变量和成员方法,可简单理解为“全局常量”!对于变量,表示一旦给值就不可修改,并且通过类名可以访问;对于方法,表示不可覆盖,并且可以通过类名直接访问。

51.Finalfinallyfinalized的区别?

final为关键字;final定义基本类型变量时,要求变量初始化必须在声明时或者构造函数中,不能用于其它地方。该关键字定义的常量,除了初始化阶段,不能更改常量的值。final定义对象的引用,该引用的初始化与定义常量时的要求一致; 该关键字定义的对象内容可以改变,但是引用指向的地址不能改变;定义参数:如果传入该参数定义的变量时,方法不能对该参数内容进行修改(错误),与定义变量的修改规则相同;java方法中传递基本类型时是传值的,java方法对于对 象的传递是传参的;<归根结底,java中方法的传递是依靠传递副本:对于基本类型,首先建立一个Copy,并将传入的值赋值给Copy,然后对Copy进行操作;对于对象类型,首先建立一个引用Copy,并将传入的对象引用赋值给Copy> 使用final关键字定义的类,不能被子类继承;修饰方法,方法不能被覆盖

finally为为区块标志,用于try语句中;finally{}用于标识代码块,与try{}进行配合,不论try中的代码执行完或没有执行完(这里指有异常),该代码块之中的程序必定会进行;

finalize()为方法;finalize()方法在Object中进行了定义,用于在对象“消失”时,由JVM进行调用用于对对象进行垃圾回收,类似于C++中的析构函数;用户自定义时,用于释放对象占用的资源(比如进行I/0操作);

52.抽象类与接口的区别?

1)接口是抽象类的变体,接口中所有的方法都是抽象的,而抽象类允许含有普通方法;2接口可以多继承,抽象类不行,只能单继承;3抽象类可以有自己的成员变量,而接口只能有static final类型的成员变量;4abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。 5.接口中的方法默认都是 public,abstract 类型的。

 

53.==equals的区别?什么时候需要重写equals方法?

==是应用对象的地址相等,而equals是值相等。队医基本数据类型,==也是比较值是否相等。

默认equals在比较两个对象时,是看他们是否指向同一个地址的。
但有时,我们希望两个对象只要是某些属性相同就认为他们的qualstrue。比如:
Student s1 = new Student(1,"name1");
Student s2 = new Student(1,"name1");
如果不重写equals的话,他们是不相同的,所以我们要重些equals,判断只要他们的id和名字相同equals就为true,在一些集合里有时也这样用,集合里的contain也是用equals来比较

54.熟练掌握一下算法与数据结构知识:

1)二叉树的生成,遍历、深度、层数、求第K曾的节点数、求节点所在的层数、求两节点的公告最低父节点;

2)链表的生成、插入、删除、查找;

3)线性表的生成、插入、删除、查找;

4)常用的排序法有哪些?代码实现;

直接插入排序、希尔排序、快速排序、冒泡法、选择法、堆排序。

55.什么是内部类?Nest ClassInner Class的区别?

nest class就是static inner class,而inner class就是no-static inner class。可见用inner class可以模拟closure的特性,就是运行时定义class的某些状态。inner class和nest class之间的区别就是后者是静态类。前者必须通过wrap class的实例来调用new,e.g. new Test().new innerClass。因为nest class是静态类,所以可以添加static member 或者static method,而inner class 不行。匿名内部类是inner class的一种特殊形式,所以也不能添加static member 或者static method。

56.Java面向对象的特性有哪些?分别说明;

封装:一个类继承另一个类,则称继承的类为子类,被继承的类为父类。继承后子类自动拥有了父类的属性和方法,但特别注意的是,父类的私有属性和构造方法并不能被继承。
另外子类可以写自己特有的属性和方法,目的是实现功能的扩展,子类也可以复写父类的方法即方法的重写。

继承:封装也称为信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只
保留一些对外接口使之与外部发生联系。系统的其他部分只有通过包裹在数据外面的被授权的操作来与这个抽象数据类型交流与交互。也就是说,用户无需知道对象内部方法的实现细节,但可以根据对象提供的外部接口(对象名和参数)访问该对象。

多态:相同的事物,调用其相同的方法,参数也相同时,但表现的行为却不同。对象的方法在实例时不能明确是哪个方法,需要到具体运行时才能知道调用的哪个方法。

57.Sleepwait的异同?

Sleep不释放锁;wait释放锁,等到notifynotifyall唤醒。sleep(milliseconds)可以用时间指定来使他自动醒过来,如果时间不到你只能调用interreput()来强行打断;wait()可以用notify()直接唤起. sleep是Thread类的静态方 法。wait是Object的方法sleep()是让某个线程暂停运行一段时间,其控制范围是由当前线程决定wait()是由某个确定的对象来调用的。

sleep和wait的区别有:

1,这两个方法来自不同的类分别是Thread和Object;2,最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。;3,wait,notify和notifyAll只能在同步 控制方法或者同步控 制块里面使用,而sleep可以在;任何地方使用synchronized(x){x.notify()//或者wait()}4,sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

58.关于相关、依赖、聚合的概念;

依赖(Dependency)关系是类与类之间的联接。依赖关系表示一个类依赖于另一个类的定义。例如,一个人(Person)可以买车(car)和房子(House),Person类依赖于Car类和House类的定义,因为Person类引用了Car和House。与关 联不同的是,Person类里并没有Car和House类型的属性,Car和House的实例是以参量的方式传入到buy()方法中去的。一般而言,依赖关系在Java语言中体现为局域变量、方法的形参,或者对静态方法的调用。

关联(Association)关系是类与类之间的联接,它使一个类知道另一个类的属性和方法。关联可以是双向的,也可以是单向的。在Java语言中,关联关系一般使用成员变量来实现。

聚合(Aggregation) 关系是关联关系的一种,是强的关联关系。聚合是整体和个体之间的关系。例如,汽车类与引擎类、轮胎类,以及其它的零件类之间的关系便整体和个体的关系。与关联关系一样,聚合关系也是通过实例变量实现 的。但是关联关系所涉及的两个类是处在同一层次上的,而在聚合关系中,两个类是处在不平等层次上的,一个代表整体,另一个代表部分。

组合(Composition) 关系是关联关系的一种,是比聚合关系强的关系。它要求普通的聚合关系中代表整体的对象负责代表部分对象的生命周期,组合关系是不能共享的。代表整体的对象需要负责保持部分对象和存活,在一些情况下将 负责代表部分的对象湮灭掉。代表整体的对象可以将代表部分的对象传递给另一个对象,由后者负责此对象的生命周期。换言之,代表部分的对象在每一个时刻只能与一个对象发生组合关系,由后者排他地负责生命周期。部分和整体 的生命周期一样。

59.设计4个线程、两个递增、两个递减(代码实现);

60.UML了解不?如何画?

61.常用的设计模式有哪些?

单例模式、观察者模式、工厂模式等。

62.堆内存与栈内存?

堆内存:new创建出来的对象;垃圾回收器管理;动态分配内存,存取速度慢;

栈内存:基本类型的变量和对象的引用;超过变量作用域释放;取速度快,仅次于寄存器,两者都是java用来在ram存数据的地方。

63.什么是sdkadt

    Sdksoftware development kit,软件开发包。SDK是一些公司针对某一项技术为软件开发人员制作的一套辅助开发或者减少开发周期的工具。通常包含对应的jar包以及说明文档。

Adtandroid development tool,安卓开发工具。

64.ERRORException的区别?

    error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。 

    exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。

65.运行时异常与普通异常,常见的异常有哪些?

     普通异常又叫做checked 异常,也就是我们经常遇到的IO异常,以及SQL异常都是这种异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。 

运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。比如:我们从来没有人去处理过NullPointerException异常,它就是运行时异常,并且这种异常还是最常见的异常之一。 
    出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。运行时异常是Exception的子类,也有一般异常的特点,是可以被Catch块处理的。只不过往往我们不对他处理罢了。也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。如果不想终止,则必须扑捉所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。在这个场景这样处理可能是一个比较好的应用,但并不代表在所有的场景你都应该如此。如果在其它场景,遇到了一些错误,如果退出程序比较好,这时你就可以不太理会运行时异常,或者是通过对异常的处理显式的控制程序退出。

 

66.Try-catch-finally的执行,含有return的执行过程?

try中没有异常的情况下trycatchfinally的执行顺序 try --- finally

如果try中有异常,执行顺序是try --- catch --- finally

如果try中没有异常并且try中有return这时候正常执行顺序是try ---- finally --- return

如果try中有异常并且try中有return这时候正常执行顺序是try----catch---finally--- return

总之 finally 永远执行!

try-catch-finally里都没有return finally 之后有个return ,如果try中有异常,finally执行完后,还能执行return吗?那是不可能执行的了,try中有异常以后,根据java的异常机制先执行catch后执行finally,此时错误异常已经抛出,程序因异常而终止,所以你的return是不会执行的。

67.&&&|||的区别?

&按位与:两边是数字时进行按位与运算,当两边是bool类型时执行与运算,判断左右表达式的真假;

&&逻辑与:当左边为假时,右边不再执行;

|按位或:两边是数字时进行按位或运算,当两边是bool型或表达式时执行或运算,判断左右表达式的真假;

||逻辑或:当左边为真时,右边不再计算。

68.StringstringBufferStringBuilder的区别?

String:字符串常量,定义为final类型,不能改变其值,在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。

StringBuffer:字符串变量,线程安全的,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。但是常量相加的时候还是推荐使用String,对象相加的时候推荐StringBuffer

StringBuilder:与StringBuffer类似,字符串变量,非线程安全的。

69.Xml的解析方式及区别?

XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便。

解析方式:SAX和DOM

SAX:事件驱动。当解析器发现元素开始、元素结束、文本、文档的开始或结束等时,发送事件,程序员编写响应这些事件的代码,保存数据。优点:不用事先调入整个文档,占用资源少;SAX解析器代码比DOM解析器代码小,适于Applet,下载。缺点:不是持久的;事件过后,若没保存数据,那么数据就丢了;无状态性;从事件中只能得到文本,但不知该文本属于哪个元素;使用场合:Applet;只需XML文档的少量内容,很少回头访问;机器内存少;

DOM:解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构。优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能;缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)。 

70.Mysql的基本语句使用,连表查询?

创建一个数据库表:CREATE TABLE MYTABLE (name VARCHAR(20), sex CHAR(1));

显示表的结构:DESCRIBE MYTABLE;

往表中加入记录:insert into MYTABLE values (”hyq”,”M”);

删除表:drop TABLE MYTABLE;

清空表:delete from MYTABLE;

更新表中数据:update MYTABLE set sex=”f” where name=’hyq’;

连表查询:select * from table a as a ,table b as b where a.cc=b.cc

71.JSP包含哪些?

1、request对象 客户端请求,此请求会包含来自GET/POST请求的参数通过它才能了                   解到客户的需求,然后做出响应。

        2、response对象 响应客户请求的有关信息

3、session对象 它指的是客户端与服务器的一次会话,从客户端连到服务器的一个      WebApplication开始,直到客户端与服务       器断开连接为止。

       4、out对象   它是JspWriter类的实例,是向客户端输出内容常用的对象

5、page对象   它是指向当前JSP页面本身,有点象类中的this指针,它是 java.lang.Object类的实例

6、application对象 它实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动,直到服务器的关闭

7、exception对象 它是一个例外对象,当一个页面在运行过程中发生了例外,就产生这个对象。

       8、pageContext对象 它提供了对JSP页面内所有的对象及名字空间的访问

       9、config对象 它是在一个Servlet初始化时,JSP引擎向它传递信息用的 

72.Servlet的生命周期;

1)初始化阶段  调用init()方法

2)响应客户请求阶段  调用service()方法

3)终止阶段  调用destroy()方法

73.androidManifest中含有那些东西?

权限、包名、版本号、四大组件等。

74.Contentvalues存放数据的格式?

key-value的方式存储,其中keyString类型,value可为基本数据类型和String

75.android动画的分类有哪些、特点及区别?

有两种:TweenFrame

Tween这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化;在xml文件中:alphaAlphaAnimation;ScaleScaleAnimation

Frame传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。Zaixml文件中:translateTranslateAnimationrotateRoateAnimation

76.Android的五中布局方式?

LinearLayout:线性布局;

RelativeLayout:相对布局;

AbsolutelyLayout:绝对布局;

FrameLayout:帧布局;

TableLayout:表格布局。

77.Java的基本数据类型有哪些?

Intfloatdoublecharbytelongshortboolean

78.Androiddvm进程与linux进程的是一个概念吗?

    DVMdalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念。

79.Android工程的结构,分别含有什么?

Src--源代码

Lib--库文件

Gen--自动生成的文件,R文件,资源索引

Res--资源文件:raw:原始文件,如MP3文件、视频文件等;drawable:图片文件;layout:布局文件;values:字符串文件等;

androidManifest:清单文件,包含权限、四大组件的申明等。

80.java.io包中的objectinputstreamobjectoutputstream类;

用于从底层输入流中读取对象类型的数据和对象类型的数据写入到底层输出流。将对象中所有成员变量的取值保存起来就等于保存了对象,将对象中所有成员变量的取值还原就相等于读取了对象。 所读写的对象必须实现了Serializable接口

81.JavaIO流;

包括字节流和字符流。

字节流:InputStream OutputStream;字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串;如果是音频文件、图片、歌曲,就用字节流好点;字节流转换成字符流可以用 InputSteamReader OutputStreamWriter,并转换成BufferdReader BufferedWriter 他们具有缓冲区

字符流:Reader Writer ;处理单元为1个字节,操作字节和字节数组;如果是关系到中文(文本)的,用字符流.

82.重载与复写的区别?

    重载:方法名称相同,参数的个数或者类型不同;发生在同一个类中;

    重写:方法名称相同,参数的个数和类型相同,方法体不同;发生在继承关系中,是由子类进行复写

  1. 请使用命令行的方式创建一个名字为myAvd,sdk版本为2.2,sd卡是在d盘的根目录下,名字为scard.img,并指定屏幕大小HVGA

84.Androidjni的调用过程?

1)安装和下载Cygwin,下载 Android NDK;

2)在ndk项目中JNI接口的设计;

3)使用C/C++实现本地方法;

4)JNI生成动态链接库.so文件;

5)将动态链接库复制到java工程,在java工程中调用,运行java工程即可.

85.请继承SQLiteOpenHelper实现:

创建一个版本为1的“diaryOpenHelper.db”的数据库,.同时创建一个 “diary” 表(包含一个_id主键并自增长,topic字符型100长度, content字符型1000长度);.在数据库版本变化时请删除diary表,并 重新创建出diary表。

86.页面上现有ProgressBar控件progressBar,请用书写线程以10秒的的时间完成其进度显示工作。

87.如何捕获ANR异常?如何定位?

 

88.设计一个应用节约电量?

1)service是后台服务,长期存在会比较耗内存,也会耗电量,因此尽量关闭不必要的后台服务;

2)算法上进行优化,减少运算复杂度;

3)设置应用长期不触碰让屏幕变暗以节省电量。

89.你是如何解决问题的,常看哪些书、上哪些网站?

90.请解释下Android程序运行时权限与文件系统权限的区别。

运行时权限是Dalvik( android授权) ;文件系统 是linux 内核授权。

91.系统上安装了多种浏览器,能否指定某浏览器访问指定页面?

可以,通过intent实现。具体如下:

Intent intent = new Intent();  intent.setAction("android.intent.action.VIEW");

Uri content_url = Uri.parse("http://www.163.com");

intent.setData(content_url);
  intent.setClassName("com.android.browser","com.android.browser.BrowserActivity");
startActivity(intent); 

  1. 你如何评价Android系统?

优点:

1)开源特性,得到众多厂商及软件开发者的支持;

2)无缝结合的Google应用

3)自由性极高的Android将会让我们更加的接近网络化,而让我们不要再为花费烦扰,这里主要说的是通过软件我们可以实现各种各样的网络会话,而不是长途,漫游。

4)减少运营商的束缚。

 缺点:

1)安全和隐私:由于手机与互联网的紧密联系,个人隐私很难得到保守。除了上网过程中经意或不经意留下的个人足迹,Google这个巨人也时时站在你的身后,洞穿一切,因此,互联网的深入将会带来新一轮的隐私危机。

2)首先开卖Android手机的不是最大运营商;

3)运营商仍然能够影响到Android手机

4)同类机型用户减少;

5)过分依赖开发商缺少标准配置。

93.你认为android未来的发展趋势,前景如何?(自己总结回答)

1)市场足够大,Android这几年的发展可谓有目共睹,就像前面所说,每天的设备激活数目就达到了50万台

2)有足够多的大公司参与其中,或者成就了一些公司:除了Google本身外,Motorola移动、HTC,前者借Android咸鱼翻身,后者借Android成了市值超越Nokia的公司。

3)开放平台取代了封闭平台。让参与者均能通过自己的努力而获得利益。

  1. 什么情况会导致Force Close ?如何避免?能否捕获导致其的异常?

程序出现异常,比如nullpointer避免:编写程序时逻辑连贯,思维缜密。能捕获异常,在logcat中能看到异常信息

95.程序调试方式?

1)断点Debug:在需要调试的地方加上断点,F11运行程序,F5逐句调试,F6略过方法,F7逐句进入方法后退出,ctrl+R运行到光标处,F8断点运行到结束。

2)Logcat:在代码中通过Log.i;Log.v等标记打印的数据,在LogCat中对应可以查看;另外也可以在Logcat中创建过滤器,Log cat->create filter->设置Filter Nameby tab name

3)Adb:通过连接手机或者模拟器进行调试,虚拟机的调试可以通过DDMS调试监控服务;

4)traceView:跟踪并报告程序运行过程中的所有方法调用和每个方法的耗时。

96.Android本身的api并未声明会抛出异常,则其在运行时有无可能抛出runtime异常,你遇到过吗?诺有的话会导致什么问题?如何解决?

会,比如nullpointerException。我遇到过,比如textview.setText()时,textview没有初始化。会导致程序无法正常运行出现forceclose。打开控制台查看logcat信息找出异常信息并修改程序。

97.Intentintentfilter的区别?

Intent是一种在不同组件之间传递的请求消息,是应用程序发出的请求和意图。作为一个完整的消息传递机制,Intent不仅需要发送端,还需要接收端。

IntentFilter类表示Intent过滤器大部分情况下每一个component都会定义一个或多个IntentFilter, 用于表明其可处理的Intent.一般来说, componentIntentFilter应该在AndroidManifest.xml文件中定义。定义的方法<activity>, <receiver>, <service>元素中增加一个或多个<intent-filter>子元素.

Intent分为显示Intent(明确指定了目标组件名称的Intent,显式Intent更多用于在应用程序内部传递消息 )和隐式Intent没有明确指出目标组件名称的Intent,通过intent-filter 来寻找与隐式Intent相关的对象,它不会用组件名称定义需要激活的目标组件,它更广泛地用于在不同应用程序之间传递消息 )。一个声明了IntentFilter的组件既可以响应显式Intent请求,也可以响应隐式Intent请求。在通过和 IntentFilter比较来解析隐式Intent请求时,Android将以下三个因素作为选择的参考标准。

Action:action属性是一个字符串代表某一种特定的动作. Intent类预定义了一些action常量开发者也可以自定义action. 一般来说自定义的action应该以application的包名作为前缀然后附加特定的大写字符串例如"cn.xing.upload.action.UPLOAD_COMPLETE"就是一个命名良好的action.

Data:data属性指定所操作数据的URI. data经常与action配合使用如果actionACTION_EDIT, data的值应该指明被编辑文档的URI; 如果actionACTION_CALL, data的值应该是一个以"tel:"开头并在其后附加号码的URI; 如果actionACTION_VIEW, data的值应该是一个以"http: "开头并在其后附加网址的URI...

Category:category属性也是一个字符串, 用于指定一些目标组件需要满足的额外条件. 

98.如何将打开res aw目录中的数据库文件

Android中不能直接打开res aw目录中的数据库文件,而需要在程序第一次启动时将该文件复制到手机内存或SD卡的某个目录中,然后再打开该数据库文件。复制的基本方法是使用getResources().openRawResource方法获得res aw目录中资源的 InputStream对象,然后将该InputStream对象中的数据写入其他的目录中  相应文件中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法来打开任 意目录中的SQLite数据库文件

99.sim卡的EF 文件有何作用 

SIM卡里的所有文件按树来组织:
主文件MF(Master File)——每一块SIM卡只有一个唯一的主文件其他所有文件都是它的子孙主文件只有文件头,里面存放着整个SIM卡的控制和管理信息
专用文件DF(Dedicated File)——也是只有一个文件头里面存放着整个目录的管理控制信息专用文件相当于一个目录的根.
基本文件EF(Elementary File)——既有文件头,也有文件体文件头存放该文件的位置和控制信息文件体存放真正的数据整个SIM卡中只有基本文件有文件体也只有基本文件才用来存放数据.

sim卡的文件系统有自己规范,主要是为了和手机通讯,sim本 身可以有自己的操作系统,EF就是作存储并和手机通讯用的

100.Android引入广播机制的用意

1)从MVC的角度考虑(应用程序内)其实回答这个问题的时候还可以这样问,android为什么要有那4大组件,现在的移动开发模型基本上也是照搬的web那一套MVC架构,只不过是改了点嫁妆而已。android的四大组件本质上就是为了实现移动或者说嵌入式设备上的MVC架构,它们之间有时候是一种相互依存的关系,有时候又是一种补充关系,引入广播机制可以方便几大组件的信息和数据交互;

2)程序间互通消息(例如在自己的应用程序内监_听系统来电);

3)效率上(参考UDP的广播协议在局域网的方便性);

4)设计模式上(反转控制的一种应用,类似监_听者模式)。

101.嵌入式操作系统内存管理有哪几种,各有何特性 

什么是嵌入式实时操作系统, Android 操作系统属于实时操作系统吗

嵌入式实时操作系统是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致运行的嵌入式操作系统。主要 用于工业控制、 军事设备、 航空航天等领域对系统的响应时间有苛刻的要求,这就需要使用实时系统。又可分为软实时和硬实时两种,而android是基于linux内核的,因此属于软实时。

102.一条最长的短信息约占多少byte? 

中文70(包括标点),英文160,160个字节

103.说说mvc模式的原理,它在android中的运用 

mvcmodel-view-controller。

Model应用程序的主体部分,所有的业务逻辑都应该写在该层。

View是应用程序中负责生成用户界面的部分。也是在整个mvc架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。

Controller是根据用户的输入,控制用户界面数据显示及更新model对象状态的部分,控制器更重要的一种导航功能,用户出发的相关事件,交给model处理。

Androidmvc

Model(模型层):对数据库的操作、对网络等的操作都应该在model里面处理,当然对业务计算等操作也是必须放在的该层的。

View(视图层):一般采用xml文件进行界面的描述,使用的时候可以非常方便的引入,当然,如何你对android了解的比较的多了话,就一定 可以想到在android中也可以使用javascript+html等的方式作为view层,当然这里需要进行javajavascript之间的通 信,幸运的是,android提供了它们之间非常方便的通信实现。

Controller(控制层):android的控制层的重 任通常落在了众多的acitvity的肩上,这句话也就暗含了不要在acitivity中写代码,要通过activity交割model业务逻辑层处理, 这样做的另外一个原因是android中的acitivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉

  1. DDMSTraceView的区别

DDMS是一个程序执行查看器,在里面可以看见线程和堆栈等信息,TraceView是程序性能分析器。

105.java中如何引用本地语言

通过JNI实现本地C语言的调用。本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法。在JAVA程序中,首先需要在类中声明所调用的库名称,如下:

static {

       System.loadLibrary(goodluck);

}

还需要对将要调用的方法做本地声明,关键字为native。并且只需要声明,而不需要具体实现。如下:

public native static void set(int i);

public native static int get();

然后编译该JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就会生成C/C++的头文件。

106.谈谈Android进程间通信有哪些:

contentProvider:不同应用间数据的共享;

Intent:在四大组件中来去自如,可以实现不同进程间的通信;

BroadcastReceiver:一旦注册、可以接受不同进程间的消息,也算进程通信的一种;

Service:服务可以控制其他应用的一些事件,也算进程间通信;

Activity:不同activity之间的通信;

远程调用:客户端调用服务端应用,属于进程调用的典型;

IBinderBinder是一种进程间通信机制,它是一种类似于COMCORBA分布式组件架构,通俗一点,其实是提供远程过程调用(RPC)功能。在Android系统的Binder机制中,由一系统组件组成,分别是ClientServerService  ManagerBinder驱动程序,其中ClientServerService Manager运行在用户空间,Binder驱动程序运行内核空间。Binder就是一种把这四个组件粘合在一起的粘结剂了,其中,核心组件便是Binder驱动程序了,Service Manager 提供了辅助管理的功能,ClientServer正是在Binder驱动和Service Manager提供的基础设施上,进行Client-Server之间的通信。

107.Activityservice属于同一进程吗?是同一线程吗?

同一个包内的activityservice,如果service没有设定属性android:process=":remote"的话,service会和activity跑在同一个进程中,由于一个进程只有一个UI线程,所以,serviceacitivity就是在同一个线程里面的。因此耗时 的操作必须在service中新开线程而不能直接放在service中。android:process=":remote"值得注意他的用法!!!如果Activity想访问service中的对象或方法,如果service设定属性android:process=":remote",那么就是跨进程访 问,跨进程访问容易出现意想不到的问题,还是慎重给service 设定属性android:process=":remote"

108.View, surfaceView, GLSurfaceView有什么区别

1)view是最基础的,必须在UI主线程内更新画面,速度较慢。

2)SurfaceView view的子类,类似使用双缓机制,在新的线程中更新画面所以刷新界面速度比view快

3)GLSurfaceView SurfaceView的子类,opengl 专用的

109.自己的理解描述下Android数字签名。

(1)所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序;

(2)Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证;

(3)如果要正式发布一个Android程序,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布。

(4)数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。

110.Gravitylayout_grivaty的区别?

Gravity相对于元素本身来说所处的位置;

Layout_gravity相对于父元素来说,处于父元素的什么位置。

111.DalvikJVM的区别:

(5)基于的平台不同:dalvik基于寄存器,JVM基于栈;

(6)运行环境不同:在有限的内存中,允许同时运行多个davlik实例,并且每一个Dalvik应用作为一个独立的Linux进程执行。 JVM只能运行一个JVM实例,因平台的不一致进程也不一致;

(7)运行语言:Dalvik可以运行不同的语言,如javaScalaJVM可以运行不同的语言,如javaPython语言

(8)运行格式不同:JVM一般是.classDalvik.dexKVM一般是.class 

(9)编写语言:Dalvik是一般由CC++编写,JVM一般是C++java编写,KVM一般是CC++ 

(10)效率不同:Dalvik是基于寄存器所以效率高于基于栈的JVMKVM 加载函数不同:DalvikDexfile加载class类文件,JVMKVMClassLoader 

112.Socket通信编程:

Socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。 网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址 和一个端口号唯一确定。在java中,Socket和ServerSocket类库位于java .net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例, 完成所需的会话。

服务端:1)创建一个ServerSocket,用于监听客户端Socket的连接请求 :实例ServerSocket:ServerSocket server = new ServerSocket(PORT); 

    2)采用循环不断接受来自客户端的请求:通过server .accept()返回一个对应客户端的socket;socket.getOutputStream()获得传给客户端的输出流;

客户端:实例socket:Socket socket = new Socket(HOST, PORT);通过socket.getInputStream()获得服务端的输入流。

113.双缓冲技术原理以及优缺点:

创建一幅后台图像,将每一帧画入图像,然后调用drawImage()方法将整个后台图像一次画到屏幕上去。

优点:双缓冲技术的优点在于大部分绘制是离屏的。

        将离屏图像一次绘至屏幕上,比直接在屏幕上绘制要有效得多。

        双缓冲技术可以使动画平滑。

缺点:要分配一个后台图像的缓冲,如果图像相当大,这将占用很大一块内存。

114.Selector的使用方式:

selector是在文件夹drawable中进行定义的xml文件。主要是用来描述控件不同状态时的效果。它主要定义控件在下pressedselectedfocused及平常状态下的属性。

越前面定义的状态,其优先级越高。对定得某个状态,如果某个属性没有显示说明,则表示此时该属性为任意值,都没关系。

115.能说一下java的反射(reflection)机制吗

Java运行时环境中,对于任意一个类,能否知道这个类中有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的,这种动态获取类的信息以及动态调用对象的方法的功能来自java反射机制。

反射提供的功能:1)在运行时判断任意一个对象所属的类;2)在运行时任意构造一个类的对象;3)在运行时任意判断一个类所具有的成员变量和方法;4)在运行时调用任意一个对象的方法。

 

 

原文地址:https://www.cnblogs.com/liangstudyhome/p/4096112.html