上一篇主要介绍的是Java相关的面试题,其实已经重复的说过,在Android面试中,Java相关的面试大概要占到20%,甚至是大于20%,因此不得不显得尤其重要,毕竟目前的开发中,Java语言开发毕竟仍是占到绝大部分的。java
这篇继续Java相关的面试题分享:面试
抽象类每每用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不一样,可是本质上相同的具体概念的抽象。具体分析以下:编程
1.由于抽象类不能实例化对象,因此必需要有子类来实现它以后才能使用。这样就能够把一些具备相同属性和方法的组件进行抽象,这样更有利于代码和程序的维护。设计模式
好比本科和研究生能够抽象成学生,他们有相同的属性和方法。这样当你对其中某个类进行修改时会受到父类的限制,这样就会提醒开发人员有些东西不能进行随意修改,这样能够对比较重要的东西进行统一的限制,也算是一种保护,对维护会有很大的帮助。
2.当又有一个具备类似的组件产生时,只须要实现该抽象类就能够得到该抽象类的那些属性和方法。
好比学校又新产生了专科生这类学生,那么专科生直接继承学生,而后对本身特有的属性和方法进行补充便可。这样对于代码的重用也是很好的体现。安全
因此,Java中抽象类对于代码的维护和重用有很好的帮助,也是Java面向对象的一个重要体现。多线程
应用都是基于规则的应用,也就是基于语法的应用,咱们能够根据语法上的异同点来总结抽象类和接口的应用场景架构
相同点没有什么可说的,咱们从不一样点下手。并发
抽象类中不必定都是抽象的方法,也能够有具体实现的方法,这样就能够把你们公用的方法提高到抽象类中,而后具体的方法能够留给子类本身实现(此处经典的应用,模板方法设计模式)。因此抽象类能够更好的实现代码的复用编程语言
接口和抽象类的概念不同。这个能够理解为接口是对动做的抽象,抽象类是对根源的抽象(即对本质的抽象与其余类的本质不一样)。操作系统
抽象类表示的是,这个对象是什么。接口表示的是,这个对象能作什么。好比,男人,女人,这两个类(若是是类的话……),他们的抽象类是人。说明,他们都是人。人能够吃东西,狗也能够吃东西,你能够把“吃东西”定义成一个接口,而后让这些类去实现它。
因此,在高级语言上,一个类只能继承一个类(抽象类)(正如人不可能同时是生物和非生物),可是能够实现多个接口(吃饭接口、走路接口)。
当你关注一个事物的本质的时候,用抽象类;当你关注一个操做的时候,用接口。
另外一个重要的概念就是多态,多态经过分离作什么和怎么作,从另外一个角度将接口和实现分离出来。多态不但可以改善代码的组织结果和可读性,还能建立可扩展的程序----即不管在项目最初建立时仍是在须要添加新功能时均可以“生长”的程序。因为接口更关注于动做的实现,多态主要是分离“作什么”和“怎么作”,因此接口的另外一个重要的应用就是多态的实现(固然抽象类也能够实现多态,可是接口更加合适)。
抽象类的功能要远超过接口,可是,定义抽象类的代价高。由于高级语言来讲(从实际设计上来讲也是)每一个类只能继承一个类。在这个类中,你必须继承或编写出其全部子类的全部共性。虽然接口在功能上会弱化许多,可是它只是针对一个动做的描述。并且你能够在一个类中同时实现多个接口。在设计阶段会下降难度的。
答案是确定的,能够。
抽象类中能够没有抽象方法,但有抽象方法的必定是抽象类。因此,java中 抽象类里面能够没有抽象方法。注意即便是没有抽象方法和属性的抽象类,也不能被实例化。
一、定义接口的重要性:在Java编程,abstract class 和interface是支持抽象类定义的两种机制。正是因为这两种机制的存在,才使得Java成为面向对象的编程语言。
二、定义接口有利于代码的规范:对于一个大型项目而言,架构师每每会对一些主要的接口来进行定义,或者清理一些没有必要的接口。这样作的目的一方面是为了给开发人员一个清晰的指示,告诉他们哪些业务须要实现;同时也能防止因为开发人员随意命名而致使的命名不清晰和代码混乱,影响开发效率。
三、有利于对代码进行维护:好比你要作一个画板程序,其中里面有一个面板类,主要负责绘画功能,而后你就这样定义了这个类。但是在不久未来,你忽然发现现有的类已经不可以知足须要,而后你又要从新设计这个类,更糟糕是你可能要放弃这个类,那么其余地方可能有引用他,这样修改起来很麻烦。若是你一开始定义一个接口,把绘制功能放在接口里,而后定义类时实现这个接口,而后你只要用这个接口去引用实现它的类就好了,之后要换的话只不过是引用另外一个类而已,这样就达到维护、拓展的方便性。
四、保证代码的安全和严密:一个好的程序必定符合高内聚低耦合的特征,那么实现低耦合,定义接口是一个很好的方法,可以让系统的功能较好地实现,而不涉及任何具体的实现细节。这样就比较安全、严密一些,这一思想通常在软件开发中较为常见。
<? extends T>限定参数类型的上界:参数类型必须是T或T的子类型
<? super T> 限定参数类型的下界:参数类型必须是T或T的超类型
总结为:
<? extends T> 只能用于方法返回,告诉编译器此返参的类型的最小继承边界为T,T和T的父类都能接收,可是入参类型没法肯定,只能接受null的传入
<? super T>只能用于限定方法入参,告诉编译器入参只能是T或其子类型,而返参只能用Object类接收
? 既不能用于入参也不能用于返参
首先答案是不能!
这个问题有两个关键字,一个是静态方法,一个是重写。
咱们来先说说重写,可能不少初学的朋友分不清重写和重载的区别。
重写:子类继承父类后,定义了一个和父类中的如出一辙方法,这个如出一辙是值方法名和参数的定义如出一辙。这时候子类要实现这个方法,就称为对父类方法的重写。
重载:子类继承父类后,定义了一个和父类中相同名字的方法,可是参数不同(必须),实现也不一样(可选),这就是重载。
静态方法:java中,static修饰符修饰的方法就是静态方法。所谓静态就是指:在编译以后所分配的内存会一直存在(不会被回收),直到程序退出内存才会释放这个空间。
在java中,全部的东西都是对象,对象的抽象就是类,对于一个类而言,若是要使用他的成员(类中的属性,方法等),通常状况下,必须先实例化对象后,经过对象的引用才能访问这些成员。
可是,若是要使用的成员使用了static修饰,就能够不经过实例化得到该成员。
就好比,如今有个桌子,我想吃苹果,通常状况下,我须要先拿个盘子(对象的实例化)去装苹果才能吃到苹果,如今有个苹果直接放在桌子上(用static修饰过的静态方法),这样我就能够直接从桌子上拿到苹果。可能你们会有疑问,既然静态方法(能不经过实例化就使用成员)这么方便,为何不都使用静态方法。
你们回到static这个修饰符的功能定义:所谓静态就是指:在编译以后所分配的内存会一直存在(不会被回收),直到程序退出内存才会释放这个空间。
java的回收机制会定时的回收已经使用过的对象的内存来释放内存给应用程序。若是所有都是静态变量和静态方法,内存都被占用了,java程序哪里还有运行的空间呢?就比如,你回家就看到桌子上摆满了苹果,那你买的梨子就没地方放了。
如今回到题目中来,父类的静态方法能不能被重写。答案是不能。
由于静态方法从程序开始运行后就已经分配了内存,也就是说已经写死了。全部引用到该方法的对象(父类的对象也好子类的对象也好)所指向的都是同一块内存中的数据,也就是该静态方法。子类中若是定义了相同名称的静态方法,并不会重写,而应该是在内存中又分配了一块给子类的静态方法,没有重写这一说。
进程是一个术语,用来描述一组资源和程序运行所需的内存分配。对于每个被加载到内存的exe,在它的生命周期中操做系统会为之建立一个单独隔离的进程。一个进程的失败不会影响其余的进程。每一个进程是由私有的虚拟地址空间、代码、数据和其余各类系统资源组成的。
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程本身基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),可是它可与同属一个进程的其余的线程共享进程所拥有的所有资源。系统建立好进程后,实际就启动执行了该进程的主线程,主线程终止了,进程也就随之终止,每个进程至少有一个线程(即主线程,它无需由用户主动去建立,是由系统在应用程序启动后建立的),用户根据须要在应用程序中建立其余线程,使多个线程并发的运行在同一个进程中。
一个线程能够建立和撤销另外一个线程;同一个进程中的多个线程之间能够并发执行.
相对进程而言,线程是一个更加接近于执行体的概念,它能够与同进程中的其余线程共享数据,但拥有本身的栈空间,拥有独立的执行序列。
进程和线程的主要差异在于它们是不一样的操做系统资源管理方式。进程有独立的地址空 间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不一样执行路径。线程有本身的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,因此多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行而且又要共享某些变量的并发操做,只能用线程,不能用进程。
1) 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
2) 线程的划分尺度小于进程,使得多线程程序的并发性高。
3) 另外,进程在执行过程当中拥有独立的内存单元,而多个线程共享内存,从而极大地提升了程序的运行效率。
4) 线程在执行过程当中与进程仍是有区别的。每一个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。可是线程不可以独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
5) 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分能够同时执行。但操做系统并无将多个线程看作多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。