java学习:继承、多态、instanceof

来源:互联网 发布:阿里云华东1可用区 编辑:程序博客网 时间:2024/05/16 06:39

由于之前做了几年的C,一直是面向过程的思想,现在来学面向对象的程序设计,思想上的转变对我来说是最困难的。

理解继承是理解面向对象程序设计的关键之一。


java中通过关键字extends继承一个已有的类,被继承的类称为父类,新的类称为子类。在java中是不允许多继承的,这点和C++不同,C++允许多继承。在java中,编译通过后,每个类都会对应一个class文件。


子类和父类之间可以发生方法的覆盖,也就是说在子类中定义一个与父类同名、返回类型、参数类型均相同的一个方法时,称为方法的覆盖,当子类的对象调用该方法时,调用的就是子类的方法,如果没有覆盖,则调用的是父类的方法。

要区分方法的覆盖和方法的重载,覆盖是发生在子类和父类之间,重载是在同一个类中。

当子类中覆盖了父类的方法后,如果还需要访问父类的方法,则可以通过super来调用。

super提供了对父类的访问,可以通过super访问父类被子类隐藏的变量或覆盖的方法。

在使用继承的时候需要注意一点,每个子类构造方法的第一条语句,都是隐含的调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。这句话也就是说,在实例化一个子类的对象时,需要先构造一个父类的对象,然后才实例化子类的对象。如果父类中没有无参数的构造函数,那么就必须在子类的构造函数中显式的调用父类的构造函数,例如父类的构造函数为Father(int a){},那么在子类的构造函数中调用的方式为super(5),而且super语句必须是第一条,因为在构造子类的对象时,是首先要构造父类的对象的,其实也就是调用super这个语句来构造父类的对象,所以super的语句就必须放在第一条了。

父类的构造方法是不能被继承的。


面向对象的另一关键是多态,多态是通过覆盖父类的方法来实现,在运行时根据传递的对象引用,来调用相应的方法。如果传递的是子类对象的引用,那么调用的就是子类的方法,如果传递的父类对象的引用,那么调用的就是父类的方法。看段小代码来就能明白了,这段代码仅仅为了体现多态,所以写的并不正规,凑合看吧:

class A

{

void test(){}

}

class B extends A

{

void test(){}//覆盖父类的方法

}

class C

{

static void fn(A a)

{

a.test();

}

public static void main(String[] args)

{

A a;

B b = new B();

a  = b;

C.fn(a);//传递是子类的引用,所以调用的是子类B的方法

}

}

上面就是简单的多态的实现了,有的地方把方法的重载叫做编译时多态,上面这种叫做运行时多态。由于水平有限,现在无法去评论这些叫法了。还是踏踏实实的一步步来,等后面学多了,再回头理解,相信能够更加深入的理解。


在有了继承和多态后,如上面一段小代码,如何判别main函数中的a是哪个类的实例呢?这时候就可以使用操作符instanceof,它是用来判断一个对象是否是一个类的实例,用法为:a instanceof A。如果a是A的实例,则返回true,否则返回false。

在继承的时候,子类的对象是父类的实例,但父类的对象不是子类的实例。但是如果像上面多态那段小代码中,将子类的实例b赋给了父类的对象a,那么此时a也是子类B的实例。

这一段其实还有些模糊,并未理解透彻,还需要学习更多的知识来理解,特别是需要知道instanceof内部的实现机制,从而知道它是根据什么来判断的。

原创粉丝点击