明辉站/网站教程/内容

Java FAQ(5)

网站教程2024-02-03 阅读
[摘要]五、 面向对象篇Q5.1 extends和implements有什么不同?答:对于class而言,extends用于(单)继承一个类(class),而implements用于实现一个接口(interface)。interface的引入是为了部分地提供多继承的功能。在interface中只需声明方...

五、 面向对象篇

Q5.1  extends和implements有什么不同?
答:对于class而言,extends用于(单)继承一个类(class),而implements用于实现一个接口(interface)。interface的引入是为了部分地提供多继承的功能。在interface中只需声明方法头,而将方法体留给实现的class来做。这些实现的class的实例完全可以当作interface的实例来对待。在interface之间也可以声明为extends(多继承)的关系。注意一个interface可以extends多个其他interface。

Q5.2  java怎么实现多继承?


答:java不支持显式的多继承。因为在显式多继承的语言例如c++中,会出现子类被迫声明祖先虚基类构造函数的问题,而这是违反面向对象的封装性原则的。java提供了interface和implements关键字来部分地实现多继承。参见Q5.1。

Q5.3 abstract是什么?


答:被声明为abstract的方法无需给出方法体,留给子类来实现。而如果一个类中有abstract方法,那么这个类也必须声明为abstract。
被声明为abstract的类无法实例化,尽管它可以定义构造方法供子类使用。

Q5.4 public,protected,private有什么不同?


答:这些关键字用于声明类和成员的可见性。public成员可以被任何类访问,protected成员限于自己和子类访问,private成员限于自己访问。Java还提供了第四种的默认可见性,一般称为package private,当没有任何public,protected,private修饰符时,成员是同一包内可见。类可以用public或默认来修饰。

Q5.5 Override和Overload有什么不同?
答:Override是指父类和子类之间方法的继承关系,这些方法有着相同的名称和参数类型。Overload是指同一个类中不同方法(可以在子类也可以在父类中定义)间的关系,这些方法有着相同的名称和不同的参数类型。


Q5.6 我继承了一个方法,但现在我想调用在父类中定义的方法。


答:用super.xxx()可以在子类中调用父类方法。

Q5.7 我想在子类的构造方法中调用父类的构造方法,该怎么办?


答:在子类构造方法的第一行调用super(...)即可。

Q5.8 我在同一个类中定义了好几个构造方法并且想在一个构造方法中调用另一个。


答:在构造方法第一行调用this(...)。

Q5.9 我没有定义构造方法会怎么样?


答:自动获得一个无参数的构造方法。

Q5.10 我调用无参数的构造方法失败了。


答:如果你至少定义了一个构造方法,就不再有自动提供的无参数的构造方法了。你需要另外显式定义一个无参数的构造方法。另外一种可能是你的构造方法或者类不是public的,参见Q5.4了解java中的可见性。

Q5.11 我该怎么定义类似于C++中的析构方法(destructor)?


答:提供一个void finalize()方法。在Garbarge Collector回收该对象时会调用该方法。

注意实际上你很难判断一个对象会在什么时候被回收。作者从未感到需要用到该方法。


Q5.12 我想将一个父类对象转换成一个子类对象该怎么做?
答:强制类型转换。如
public void meth(A a)
{
    B b = (B)a;
}
如果a实际上并不是B的实例,会抛出ClassCastException。所以请确保a确实是B的实例。


Q5.13 其实我不确定a是不是B的实例,能不能分情况处理?
答:可以使用instanceof操作符。例如
if( a instanceof B )
{
    B b = (B)a;
}
else
{
    ...
}

Q5.14 我在方法里修改了一个对象的值,但是退出方法后我发现这个对象的值没变!
答:很可能你把传入参数重赋了一个新对象,例如下列代码就会造成这种错误:public void fun1(A a) //a是局部参数,指向了一个外在对象。
{
    a = new A(); //a指向了一个新对象,和外在对象脱钩了。如果你要让a作为
传出变量,
不要写这一句。
        a.setAttr(attr);//修改了新对象的值,外在对象没有被修改。
}
基本类型也会出现这种情况。例如:
public void fun2(int a)
{
    a = 10;//只作用于本方法,外面的变量不会变化。
}


……

相关阅读