1.什么是OOAD?OOAD怎么实现?
OOAD(Object Orient Analysis Design,面线对象的分析与设计)是现代软件企业广为采用的一项有效技术。OOAD方法要求在设计中要映射现实世界中指定问题域中的对象和实体,例如:顾客、汽车和销售人员等。这就需要设计要金肯地接近现实世界,即一最自然的方式表述实体。<br /> 使用UML建模语言创建系统的分析模型与设计模型是OOAD实现的主要手段。
2.请分述类及对象的创建模式
总共有五种创建模式,分别是单例模式,工厂方法模式,抽象工厂模式,建造模式,原型模式,其中工厂方法模式是 类创建模式,其余四种是对象创建模式。<br /> 单例模式(Singleton,对象创建模式):单例模式确保其一个类只有一个实例,而且自行实例化并向整个系统提供实例。<br /> 工厂方法模式(Factory Method,类创建模式):核心工厂类不再负责所有产品的创建,而是将具体的创建工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。<br /> 抽象工厂模式(Abstract Factory,对象创建模式):抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。简单来说就是创建一组相关或相互依赖的复杂对象。<br /> 建造模式(Builder,对象创建模式):将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同内部表象的产品对象。建造模式使得产品内部表象可以独立变化,客户不必知道产品内部组成的细节。建造模式可以强制是想一种分步骤进行的建造过程。<br /> 原型模式(Prototype,对象创建模式):通过给出一个原型对象来指明所要创建的对象类型,然后用赋值这个原型对象的方法创建出更多同类型的对象。原始原型模式允许动态的增加或减少产品类,产品类不需要费的有任何事先确定的等级结构,原始原型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。
3.什么时候需要改写hashCode方法?为什么?
在改写equals方法的时候总是要改写hashCode方法。如果不这样的化,就会违反Object类的hashCode方法的通用约定,导致这个类无法与所有基于散列值的集合类结合在一起正常工作,包括HashMap,HashSet和Hashtable。
4.继承和重载的区别?
Java的继承是子类对象继承父类对象的成员属性和成员方法,只允许单继承。<br /> 在继承的过程中可以实现方法的重写(也成为了覆盖),即子类定义一个方法,覆盖从父类那里继承来的同名方法。每当子类对象调用该方法时都是子类自己定义的方法,只有使用super关键字或者父类名为前缀时,才会调用父类原来的方法。方法覆盖师,子类应与父类有完全相同的方法名,返回值类型和参数列表,子类中的覆盖方法不能使用父类中被覆盖的方法更严格的访问权限。<br /> 方法重载要求是由两个或多个方法名相同,知识方法参数列表不同的方法,它对返回值类型没有限制。
5.abstract class和interface有什么区别?
首先,从语法角度来说。abstract class方法中可以有自己的数据成员,也可以有非abstract的成员方法,并赋予方法的默认行为,而在interface方式中一般不定义成员数据变量,所有的方法都是abstract,方法不能拥有默认的行为。 <br /> 其次,从编程的角度来说。abstract class在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系,而一个类可以实现多个interface。 <br /> 最后,从问题域的角度来说。abstract class在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在“is a”关系,即父类和派生类在概念本质上应该是相同的。对于interface来收则不然,并不要求interface的实现者何interface定义在概念本质上是一致的,仅仅是实现了interface定义的契约而已。
6.面向对象的三个基本特征
封装、继承、多态
7.面向对象的特征有哪些方面?简单描述对这些特征的理解
1.抽象:抽象就是忽略一个主体中与当前目标无关的方面,以便更充分的注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中一部分,暂时不用部分细节。抽象包括两个方面:一是抽象的属性,二是抽象的方法。<br /> 2.继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。<br /> 3.封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象设计始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。<br /> 4.多态:多态性是指允许不同类的对象对同一消息作出响应,是类的多种表现方式,比如同名不同参。多态性包括参数化多态性和包含多态性,具体表现在重载和重写。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
8.一个subclass怎么调用superclass中的方法(myMethod)和构造函数?
子类subclass实例可以直接调用父类superclass未被重写的方法;若子类重写父类方法,可以在子类内通过”super.方法名()”的形式调用父类方法,例如:super.myMethod();。 <br /> 创建子类实例时默认调用父类无参的构造方法,若调用父类有参的构造方法就可以在子类构造方法第一行通过”super(参数)”形式调用。
9.构造器Constructor是否可被override?
构造器Constructor不能被继承,因此不能被重写(override),但可以被重载(overload)。
10.是否可以继承String类?
String类是final类,故不可被继承
11.阐述一下static关键 字的作用
static表示”静态”的意思,用来修饰成员变量和成员方法,也可以形成静态代码块.只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区找到它们.因此staitc成员可以在它的任何对象创建之前访问,无需引用任何对象.。<br /> 1.修饰成员变量:用static修饰的成员变量不属于对象的数据结构;static变量是属于类的变量,通常可以通过类名来引用static成员;static成员变量和类的信息一起存储在方法区,而不是在堆中,一个类的static成员变量只有”一份”,无论该类创建了多少对象。<br /> 2.修饰成员方法:static修饰的方法则不需要针对某些对象进行操作,其运行结果仅与输入的参数有关,调用时直接用类名引用.由于static在调用时没有具体的对象,因此在static方法中不能对非static成员(对象成员)进行访问.static方法的作用在于提供一些”工具方法”和”工厂方法”等。<br /> 3.static块:属于类的代码块,在类加载期间执行的代码块,只执行一次,可以用来在软件中加载静态资源。
12.静态变量和实例变量的区别
静态变量也称为类变量,归全类共有,它不依赖于某个对象,可通过类名直接访问,而实例变量必须依存于某一实例,只能通过对象才能访问到它。
13.什么是类和对象?类和对象实例之间的关系?
对象就是真实世界中的实体,对象与实体是一一对应的,也就是说显示世界中每一个实体都是一个对象,它是一种具体的概念。<br /> 类是具备某些共同特征的实体的集合,它是一种抽象的概念,用程序设计的语言来说,类是一种抽象的数据类型,它是对所有具有相同特征实体的抽象。<br /> 类具有继承、数据隐藏和多态三种特性。利用类的这三种特性可以更好地表示显示世界中事物。类是同一类对象实例化的共性的抽象,对象是类的实例化;类是静态的,对象是动态的,对象可以看做试运行中的类。类负责产生对象,可以将类当做产生类的工厂。
14.什么是属性和方法?
不同的对象具有相同的特点,就可以抽象为一定的类,那么这些特点基本可以分为两类,一类是描述对象静态状态的,就是对象的属性,在程序设计中,可以称之为变量;另一类是描述对象动作,就是对象的方法,在程序设计中我们称之为函数。属性和方法是一个对象所具备的两大基本元素。
15.String和StringBuffer的区别
String的长度是不可变的;<br /> StringBuffer的长度是可变的。如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBufer的toString()方法。
16.抽象类可以被实例化吗?可以被继承吗?
不可以实例化;可以被继承,继承的类如果不实现抽象类里的方法,那么这个子类也要声明为抽象类。
17.接口里的变量可以定义为私有的吗?可以有实现的方法吗?
不可以,接口里的变量默认都是public static final的;接口里的方法都是没有实现方法的。
18.Java中可以类多继承吗?接口可以多继承吗?
类不可以多继承,只能单继承;但是可以多重实现接口。<br /> 接口可以多重继承。
19.重载和重写的区别?Overloaded的方法是否可以改变返回值的类型?
方法的重写(override)和重载(overload)是Java多态性的不同表现。重写是父类与子类之间多态性的一种表现,重载是一个类中多态性的一种表现。如果在子类中定义某种方法与其父类有相同的名称和参数,我们就说该方法被重写了。子类的对象使用这个方法时,将对调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,他们或有不同的参数个数或有不同的参数类型,则称为方法的重载。Overloaded的方法是可以改变返回值的类型
20.构造函数可以重载吗?重载的规则是什么?
可以重载<br /> 1.被重载的方法必须改变参数列表<br /> 2.被重载的方法可以改变返回类型<br /> 3.被重载的方法可以改变访问修饰符<br /> 4.被重载的方法可以声明新的或更广的检查异常
21.什么是方法的重写,重写时有哪些注意事项?
重写时指子类重定义从父类继承来的一个同名方法,此时子类将清除父类方法的影响。子类可以通过重新定义与父类同名的方法,实现自身的行为。子类在重新定义父类已有方法时,应保持与父类完全相同的方法头声明,即应与父类有完全相同的方法名、返回类型和参数列表,否则就不是方法的覆盖,而是子类定义自己的与父类无关的方法,父类的方法仍然存在。
22.final,finally,finalize的区别
final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。<br /> finally是异常处理语句结构的一部分,表示总是执行。<br /> finalize是Object类的一个方法,在垃圾收集器执行的时候回调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件