Java面试:基础概念(五)

2014-11-24 11:52:18 · 作者: · 浏览: 55
党作父类类型来看时才会有多态。要注意区分子类中的方法重载。对于方法的重
载,则是会使用编译时类型来进行相应的方法调用。
两种复用
白箱复用,也就是继承复用,父类中的可以被子类访问到的就可以被继承,这样会有些不需
要的内容被继承下来,所以这种方式不太好。
黑箱复用,也叫组合复用,也就是把要复用代码的类的对象作为本类中的一个属性,然后再
通过方法的委托来实现由选择的复用,方法的委托就是在本类的方法内部通过该类的对象调
用要使用类的方法。
注意:尽量用组合复用替代继承复用。
多态的使用
多态用于参数,可以在方法的参数中传入其父类类型,在运行时会根据实际的运行时类型来
在方法中进行相应的操作。
多态用于返回值,可以在方法的返回值类型上是用其实际返回值的父类型,在使用期返回值
时也不比关心其实际类型。
多态可以使代码变得更通用,以适应需求的变化。也就是定义在父类中的方法,可以在子类
中有不同的实现将其覆盖,在为父类型的对象变量赋值相应需要功能的子类的对象实例。
----------------------------------------
java中的修饰符
static 表示静态,它可以修饰属性,方法和代码块。
1,static修饰属性(类变量),那么这个属性就可以用 类名.属性名 来访问,也就是使这
个属性成为本类的类变量,为本类对象所共有。这个属性就是全类公有。(共有的类变量与
对象无关,只和类有关)。
类加载的过程,类本身也是保存在文件中(字节码文件保存着类的信息)的,java会通过
I/O流把类的文件(字节码文件)读入JVM(java虚拟机),这个过程成为类的加载。JVM
(java虚拟机)会通过类路径(CLASSPATH)来找字节码文件。
类变量,会在加载时自动初始化,初始化规则和实例变量相同。
注意:类中的实例变量是在创建对象时被初始化的,被static修饰的属性,也就是类变量,
是在类加载时被创建并进行初始化,类加载的过程是进行一次。也就是类变量只会被创建一
次。
2,static修饰方法(静态方法),会使这个方法成为整个类所公有的方法,可以用类名.方
法名 访问。
注意:static修饰的方法,不直接能访问(可以通过组合方式访问)本类中的非静态
(static)成员(包括方法和属性),本类的非静态(static)方法可以访问本类的静态成员
(包括方法和属性),可以调用静态方法。静态方法要慎重使用。在静态方法中不能出现
this关键字。
注意:父类中是静态方法,子类中不能覆盖为非静态方法,在符合覆盖规则的前提下,在父
子类中,父类中的静态方法可以被子类中的静态方法覆盖,但是没有多态。(在使用对象调
用静态方法是其实是调用编译时类型的静态方法)
注意:父子类中,静态方法只能被静态方法覆盖,父子类中,非静态方法只能被非静态方法
覆盖。
java中的main方法必须写成static的,因为在类加载时无法创建对象,因为静态方法可以不
通过对象调用
所以在类的main方法。所在在类加载时就可以通过main方法入口来运行程序。
注意:组合方式,就是需要在方法中创建一个所需要的对象,并用这个对象来调用任意所需
的该对象的内容,不会再受只能访问静态的约束。
3,static修饰初始代码块,这时这个初始代码块就叫做静态初始代码块,这个代码块只在
类加载时被执行一次。可以用静态初始代码块初始化一个类。
动态初始代码块,写在类体中的“{}”,这个代码块是在生成对象的初始化属性是运行。这
种代码块叫动态初始代码块。
类在什么时候会被加载,构造(创建)对象时会加载类,调用类中静态方法或访问静态属性
也是会加载这个静态方法真正所在的类。在构造子类对象时必会先加载父类,类加载会有延
迟加载原则,只有在必须加载时才会加载。
final修饰符,可以修饰变量,方法,类
1,final修饰变量
被fianl修饰的变量就会变成常量(常量应当大写),一旦赋值不能改变,(可以在初始化
时直接赋值,也可以在构造方法里也可以赋值,只能在这两种方法里二选一,不能不为常量
赋值),fianl的常量不会有默认初始值,对于直接在初始化是赋值时final修饰符常和
static修饰符一起使用。
2,final修饰方法,被final修饰的方法将不能被其子类覆盖,保持方法的稳定不能被覆盖
3,final修饰类,被final修饰的类将不能被继承。final类中的方法也都是final的。
注意:final,不能用来修饰构造方法,在父类中如果有常量属性,在子类中使用常量属性
时是不会进行父类的类加载。静态常量如果其值可以确定,就不会加载该类,如果不能确定
则会加载该常量所在的类。
不变模式,对象一旦创建属性就不会改变。用final修饰属性,也用final修饰类(强不变模
式),用final修饰属性(弱不变模式)。
不变模式的典型体现:java.lang.String类,不变模式可以实现对象的共享(可以用一个对
象实例赋值给多个对象变量。)
池化的思想,把需要共享的数据放在池中(节省空间,共享数据)
只有String类可以用“”中的字面值创建对象。在String类中,以字面值创建时,会到Java
方法空间的串池空间中去查找,如果有就返回串池中字符串的地址,并把这个地址付给对象
变量。如果没有则会在串池里创建一个字符串对象,并返回其地址付购对象变量,当另一个
以字面值创建对象时则会重复上述过程。
如果是new在堆空间中创建String类的对象,则不会有上述的过程。
String类中的intern()方法会将在堆空间中创建的String类对象中的字符串和串池中的比
对,如果有相同的串就返回这个串的串池中的地址。
不变模式在对于对象进行修改,添加操作是使相当麻烦的,他会产生很多的中间垃圾对象。
创建和销毁的资源的开销是相当大的。
String类在字符串连接时会先的效率很低,就是因为它所产生的对象的书性是不能够修改的
,当连接字符串时也就是只能创建新的对象。
对于很多的字符串连接,应当使用StringBuffer类,在使用这个类的对象来进行字符串连接
时就不会有多余的中间对象生成,从而优化了效率。
abstract(抽象)修饰符,可以修饰类和方法
1,abstract修饰类,会使这个类成为一个抽象类,这个类将不能生成对象实例,但可以做
为对象变量声明的类型,也就是编译时类型,抽象类就像当于一类的半成品,需要子类继承
并覆盖其中的抽象方法。
2,abstract修饰方法,会使这个方法变成抽象方法,也就是只有声明(定义)而没有实现
,实现部分以";"代替。需要子类继承实现(覆盖)。
注意:有抽象方法的类一定是抽象类。但是抽象类中不一定都是抽象方法,也可以全是具体
方法。
abstract修