面向对象-(2)

来源:互联网 发布:苹果手机如何授权软件 编辑:程序博客网 时间:2024/06/05 04:21
1.什么是继承:

在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这就是继承。继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和可扩展性。Java中只支持单继承。无法继承父类的构造方法。

2.请说出作用域public,private,protected,以及不写时的区别

这四个作用域的可见范围如下表所示。

说明:如果在修饰的元素上面没有写任何访问修饰符,则表示friendly。

作用域    当前类 同一package  子孙类  其他package

public      √         √               √          √

protected  √          √             √           ×

friendly     √         √              ×           ×

private      √          ×              ×           ×

 

3.请写出java.lang.Object的6个方法:

equals(),getClass(),hashCode(),notify(),notifyAll(),toString(),wait(),wait(longtimeout),wait(long timeout,int manos)

 

4.什么是override:

override也可以翻译为覆盖,从字面就可以知道,它是覆盖了一个方法并且对其重写,以求达到不同的作用。对我们来说最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。除了这个典型的用法以外,我们在继承中也可能会在子类重写父类中的方法。重写方法时要注意以下的几点:

1、重写的方法的和被重写的方法必须具有相同的方法名和参数列表;

2、重写的方法的返回值必须和被重写的方法的返回一致或是其子类

3、重写的方法所抛出的异常必须和被重写方法的所抛出的异常一致,或者是其子类

4、重写方法不能缩小被重写方法的权限

 5、被重写的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行重写。

5.什么是overload

overload对我们来说可能比较熟悉,可以翻译为重载,它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后再调用时,VM就会根据不同的参数样式,来选择合适的方法执行。在使用重载要注意以下的几点:

1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是fun(int,float),但是不能为fun(int,int));

2、不能通过访问权限、返回类型、抛出的异常进行重载;

3、方法的异常类型和数目不会对重载造成影响;

6.Overload和Override的区别。Overload的方法是否可以改变返回值的类型:

Overload是重载的意思,Override是覆盖的意思,也就是重写。

重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同),与方法的作用域和返回类型无关。

重写Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。

子类重写父类的方法时,不能扩大方法的异常范围,即只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问题。

子类重写父类的方法时,不能缩小作用范围,子类方法的访问权限只能比父类的更大,不能更小。如果父类的方法是private类型,那么,此时根本不属于重写方法的概念,相当于子类中增加了一个全新的方法。

扩展性回答:(请理解这些概念)

至于Overloaded的方法是否可以改变返回值的类型这个问题,要看你倒底想问什么呢?这个题目很模糊。如果几个Overloaded的方法的参数列表不一样,它们的返回者类型当然也可以不一样。但我估计你想问的问题是:如果两个方法的参数列表完全一样,是否可以让它们的返回值不同来实现重载Overload。这是不行的,我们可以用反证法来说明这个问题,因为我们有时候调用一个方法时也可以不定义返回结果变量,即不要关心其返回结果,例如,我们调用map.remove(key)方法时,虽然remove方法有返回值,但是我们通常都不会定义接收返回结果的变量,这时候假设该类中有两个名称和参数列表完全相同的方法,仅仅是返回类型不同,java就无法确定编程者倒底是想调用哪个方法了,因为它无法通过返回结果类型来判断。

7.supper的关键字:

super代表对当前对象的直接父类对象的默认引用。在子类中可以通过spuer关键字来访问父类成员。

注意:                                                                                                                                       

  super必须出现在子类(子类的方法和构造方法)中,而不是其他位置

 可以访问父类的成员,如父类的属性、方法和构造方法

  注意访问权限的控制,如无法通过super访问private成员

8.继承条件下,构造 方法的调用规则

Ø  如果子类的构造方法中没有通过super显示调用父类的有参构造方法,也没有通过this显示调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法。在这种情况下,有没有”super();”语句,效果都是一样的。

Ø  如果子类的构造方法中通过super显示调用父类的有参构造方法,则执行父类相应的构造方法,而不执行父类的无参构造方法

Ø  如果子类的构造方法中通过this显示调用自身的其他构造方法,则在相应构造方法中应用以上两条规则

Ø  特别注意的是,如果存在多级继承关系,则在创建一个子类对象时,以上规则会向更高一级父类应用,一直到执行顶级父类Object类的无参构造方法为止

9.抽象类和抽象方法:

用abstract关键字修饰的类和方法。

抽象类和抽象方法的特点:

Ø  抽象类和抽象方法都通过abstract关键字来修饰

Ø  抽象类不能实例化。抽象类可以没有、有一个或多个抽象方法,甚至全部方法都可以是抽象方法。

Ø  抽象方法只有方法声明,没有方法实现。有抽象方法的类必须声明为抽象类。子类必须重写所有抽象方法才能实例化,否则子类还是一个抽象类

10.abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?

abstract的method 不可以是static的,因为抽象的方法是要被子类实现的,而static与子类扯不上关系!

native方法表示该方法要用另外一种依赖平台的编程语言实现的,不存在着被子类实现的问题,所以,它也不能是抽象的,不能与abstract混用。例如,FileOutputSteam类要硬件打交道,底层的实现用的是操作系统相关的api实现,例如,在windows用c语言实现的,所以,查看jdk 的源代码,可以发现FileOutputStream的open方法的定义如下:

privatenative void open(String name) throws FileNotFoundException;

如果我们要用java调用别人写的c语言函数,我们是无法直接调用的,我们需要按照java的要求写一个c语言的函数,又我们的这个c语言函数去调用别人的c语言函数。由于我们的c语言函数是按java的要求来写的,我们这个c语言函数就可以与java对接上,java那边的对接方式就是定义出与我们这个c函数相对应的方法,java中对应的方法不需要写具体的代码,但需要在前面声明native。

关于synchronized与abstract合用的问题,我觉得也不行,因为在我几年的学习和开发中,从来没见到过这种情况,并且我觉得synchronized应该是作用在一个具体的方法上才有意义。而且,方法上的synchronized同步所使用的同步锁对象是this,而抽象方法上无法确定this是什么。

 

11.使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。例如,对于如下语句:

 final StringBuffer a=new StringBuffer("immutable");
执行如下语句将报告编译期错误:

a=new StringBuffer("");
但是,执行如下语句则可以通过编译:

a.append(" broken!"); 

有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来的参数对象:

public void method(final StringBuffer  param){

}

实际上,这是办不到的,在该方法内部仍然可以增加如下代码来修改参数对象:

param.append("a");

 

12.final关键字有哪些作用:

当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的

意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变。

其初始化可以在两个地方:

一是其定义处,也就是说在final变量定义时直接给其赋值。

二是在构造函数中。这两个地方只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了

值,又在构造函数中给另外的值。

 

13.final、finally、finalize的区别

final 用于声明属性,方法和类,分别表示属性不可变,方法不可重写,类不可继承。

内部类要访问局部变量,局部变量必须定义成final类型,例如,一段代码……

finally是异常处理语句结构的一部分,表示总是执行。

 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以重写此方法提供垃圾收集时的其它资源回收,例如关闭文件等。JVM不保证此方法总被调用

0 0
原创粉丝点击