1.请说出作用域public,private,protected,以及不写时的区别:
作用域 当前类 同一package 子孙类 其他package
public √ √ √ √
protected √ √ √ ×
默认 √ √ × ×
private √ × × ×
2.重载(overload)和覆盖(override)的区别?overloaded的方法是否可以改变返回值的类型?
重载表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。
重写表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。子类覆盖父类方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问题。子类方法的访问权限只能比父类的更大,不能更小。如果父类的方法是private类型,那么,子类则不存在覆盖的限制,相当于子类中增加了一个全新的方法。
如果两个方法的参数列表完全一样,不可以通过返回值的不同来实现重载:因为我们有时候调用一个方法时也可以不定义返回结果变量,即不关心其返回结果,这时候假设类中有两个名称和参数列表完全相同的方法,仅仅是返回类型不同,java就无法确定编程者到底是想调用哪个方法,因为他无法通过返回结果类型来判断。
覆盖(override):它是覆盖了一个方法并且对其重写,以求达到不同的作用。对我们来说最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。除了这个典型的用法以外,我们在继承中也可能会在子类覆盖父类中的方法。覆盖要注意一下的几点:
1.覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果。
2.覆盖的方法的返回值必须和被覆盖的方法的返回一致。
3.覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类。
4.被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
重载(overload)是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后再调用是,VM就会根据不同的参数样式,来选择合适的方法执行,在使用重载时要注意以下几点:
1.在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序
2.不能通过访问权限、返回类型、抛出的异常进行重载
3.方法的异常类型和数目不会对重载造成影响
4.对于继承来说,如果某一方法在父类中访问权限是private,那么就不能在子类中对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。
3. ClassLoader如何加载class
jvm理由多个类加载,每个类加载可以负责加载特定位置的类,例如,bootstrap类加载负责加载jre/lib/rt.jar中的类,我们平时用得jdk中的类都位于rt.jar中。extclassloader负责加载jar/lib/ext/*.jar中的类,appclassloader负责classpath指定的目录或jar中的类。除了bootstrap之外,其他的类加载器本身也都是java类,它们的父类是ClassLoader。
4.分层设计的好处:
把各个功能按调用流程进行了模块化,模块化带来的好处就是可以随意组合。
1.实现了软件之间的解耦
2.便于进行分工
3.便于维护
4.提高软件组件的重用
5.便于替换某种产品,比如持久层用的是hibernate,需要更换产品用toplink,就不用改其他业务代码。直接把配置一改。
6.便于产品功能的扩展
7.便于适用用户需求的不断变化
5.序列化接口的id有什么用
对象经常要通过IO进行传送,写程序传递对象时,sun公司就提出一种统一的解决方案,它会把对象变成某个格式进行输入和输出,这种程序对程序员来说是透明的,但是,我们的某个类要想能被sun的这种方案处理,必须实现Serializable接口。
6.hashCode方法的作用:
一般来讲,equals这个方法是给用户调用的,如果你想判断2个对象是否相等,你可以重写equals方法,然后再代码中调用,就可以判断他们是否相等了。简单来讲,equals方法主要是用来判断从表面上看或者从内容上看2个对象是不是相等。
hashcode方法一般用户不会去调用,比如在hashmap中,由于key是不可以重复的,他在判断key是不是重复的时候就判断了hashcode这个方法,而且也用到了equals方法。
7.什么是SOA
SOA:service-oriented architecture面向服务的体系结构,它是一个组件模型,它将应用程序的不同功能单元(成为服务)通过这些服务之间定义良好的接口和契约联系起来。接口时采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言,这使的构建在各种这样的系统中的服务可以以一种统一和通用的方式进行交互。
Web服务是SOA的一种实现。SOA是一个比较虚的概念,例如它只提出定义一些接口和协议,那么这些东西具体应该怎么定义,web服务就将他们具体化了:web服务使用的协议都是基于XML的;SOA只说应该有三种角色,而web服务里这三种觉得都有具体的实现方式。
8.什么是AOP
AOP : Aspect oriented program 面向方面的编程
方面:贯穿到系统的各个模块中的系统一个功能就是一个方面,比如,记录日志,统一异常处理,事务处理,权限检查,这些功能都是软件系统的一个方面,而不是一个点,在各个模块中都要出现。
面向方面编程:把系统的一个方面的功能封装成对象的形式来处理
怎么进行面向方面编程:把功能模块对应的对象作为切面嵌入到原来的各个系统模块中,采用代理技术,代理会调用目标,同时把切面功能的代码(对象)加入进来,所以,用spring配置代理对象时要配两个属性,分别表示目标和切面对象。
9.构造器Constructor是否可以被override(重写)?
构造器不能被继承,一次不能重写,但可以被重载。
10.接口是否可继承接口?抽象类时候可实现接口?抽象类是否可继承具体类?抽象类中可否有静态的main方法?
接口可以继承接口。抽象类可以实现接口。抽象类可以继承具体类。抽象类中可以有静态的main方法。
抽象类和普通类的唯一区别:抽象类不能创建实例对象和允许有abstract方法。
11.写clone()方法时,通常都有一行代码,是什么?
clone有缺省行为,super.clone();因为首先要把父类中的成员复制到位,然后才是复制自己的成员。
12.面向对象的特征有哪些方面?
面向对象的编程语言有封装、继承、抽象、多态等4个主要特征。
1.封装
封装是保证软件部件具有优良的模块性的基础,封装的目标是要实现软件部件的“高内聚、低耦合”,防止程序相互依赖性而带来的变动影响。面向对象的封装就是把描述一个对象的属性和行为的代码封装在一个模块中,也就是一个类中,属性用变量顶i,行为用方法定义,方法可以直接访问同一个对象中的属性。通常情况下,将一个类中的成员变量全部定义成私有的,只有这个类自己的方法才可以访问到这些成员变来那个,这就基本上实现对象的封装。把握一个原则:把对同一事物进行操作的方法和相关的方法放在同一个类中,把方法和它操作的数据放在同一个类中。面向对象的封装性:即将对象封装成一个高度自治和相对封闭的个体,对象状态有这个对象自己的行为来读取和改变。
2.抽象
抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,这个类只考虑这些事物的相似和共性之处。抽象可以避免考虑一些与目标无关的细节。
3.继承
在定义和实现一个类的时候,可以在一个已经存在的类的基础上来进行,把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,继承提高了软件的可重用性和可扩展性。
4.多态
多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是那个类中实现的方法,必须在有程序运行期间才决定。
13. java中实现多态的机制是什么?
java中实现多态的机制靠的是父类或接口中定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。
14.abstract class和interface有什么区别?
含有abstract修饰符的class即为抽象类,abstract类不能创建实例对象。含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。abstract class类中定义抽象方法必须在具体 子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。
接口可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。
下面比较一下两者的语法区别:
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量。
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4.抽象类中的抽象方法的访问类型可以是public,protected和默认类型,单接口中的抽象方法只能是public类型的,并且默认为public abstract类型。
5.抽象类中可以包含静态方法,接口中不能包含静态方法。
6.抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,单接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
7.一个类可以实现多个接口,但只能继承一个抽象类。
接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用,例如,模板方法设计模式是抽象类的一个典型应用,假设某个项目的所有servlet类都要用相同的方式进行权限判断、记录访问日志和处理异常,那么就可以定义一个抽象的基类,让所有的servlet都继承这个抽象基类,在抽象基类的service方法中完成权限判断、记录访问日志和处理异常的代码,在各个子类中只是完成各自的业务逻辑代码。
父类方法中间的某段代码不确定,留给子类干,就用模板方法设计模式。
14. abstract 的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
abstract的method不可以是static的,因为抽象的方法是要被子类实现的,而static与子类扯不上关系
native方法表示该方法要用另外一种以来平台的编程语言实现的,不存在着被子类实现的问题,所以,它也不能是抽象的, 不能与abstract混用。
关于synchronized与abstract合用的问题,也不行,synchronized应该是作用在一个具体的方法上才有意义。而且,方法上的synchorized同步所使用的同步锁对象是this,而抽象方法上无法确定this是什么。