《疯狂Java讲义》4
作者:互联网
目录
类的继承
1.继承的特点:
(1) java的继承具有单继承的特点,每个子类只有一个直接父类。
(2) 父类也称为超类、基类。用extends作为继承的关键字。
(3)注意:Java的子类不能获得父类的构造器。
2.重写父类的方法(override,也称为方法覆盖):
遵循“两同两小一大”原则:“两同”:方法名相同,形参列表相同;“两小”:子类方法返回值类型比父类方法返回值类型更小或者相等、子类方法声明抛出的异常类比父类方法声明抛出的异常类更小或者相等;“一大”:子类方法的访问权限比父类方法的访问权限更大或者相等。
举个栗子:
结果如下:
上次我们说道过,方法重载只需要方法名一样,修饰类型可以不同,但在这里要注意一点:如果父类的方法是static修饰的(类方法),子类的方法也应该是static修饰的(类方法)。当子类覆盖了父类方法之后,子类的对象将永远不能访问父类中被覆盖的方法,但是可以调用父类中被覆盖的方法(用super或者父类类名作为调用者)。
举个栗子:
结果如下:
还要注意一点:如果父类中的方法是用的private进行修饰的,那么即使子类和父类方法、修饰类型等等完全相同,也不是对父类方法的重写,相当于自己冲洗定义了一个方法,只不过巧了,父类中也有这个方法。
3.super
上面实际上已经说了super的用法。这里提一点,super调用的是实例的方法或者变量而不是类方法或者变量。如果想调用类方法或类变量,应该使用父类类名作为调用者。
多态
Polymorphism
1. Java引用变量有两个类型,一个是编译类型,一个是运行时类型。编译时类型由声明该变量时使用的类型来决定,运行时类型由实际赋给该变量的对象来决定,如果编译时类型和运行时类型不一致,就可能出现所谓的多态。
我们通过栗子来进一步了解:
在第47行加了注释以后输出的结果如下:
如果加上这行注释,会报错:
下面解释一下上面的代码:
首先要知道什么事编译时类型和运行时类型,其实顾名思义即可,给个例子更好理解:
(1)在main()方法中显示的创建了三个引用变量,对于前两个引用变量bs和sc,因为编译时变量和运行时变量相同,所以调用它们的成员变量和方法都是正常的。
(2)第三个引用变量较为特殊,如上图,编译时类型为BaseClass,运行时类型是SubClass,在调用test方法时,由于子类重写过父类的了,所以用的还是子类的,但是变量(book)还是父类的,而下面的sub方法,因为在父类中没有,所以会报错,这就是说,引用变量只能调用它的编译时变量,不能调用运行时变量。这里要注意,实例变量不具有多态性,按照编译时状态走;方法具有多态性。
2. 下面说个好玩的东西:instanceof运算符
上面我们说道,引用变量只能调用它的编译时变量,不能调用运行时变量,可是如果想让程序调用运行时变量怎么办?——强制转换,那这里就遇到问题了,我们都知道强制转换怎么个转换方法,当然也清楚,强制转换可能会有问题:
(1)基本类型之间的转换只能在数值之间进行,但是数值类型与布尔类型之间不能进行转换;
(2)引用类型之间的转换是在有继承关系的两个类型之间。
考虑到进行强制类型转换时可能出现异常,因此进行类型转换之前应该先通过instanceof运算符进行判断,看是否可以成功转换。
instanceof
instanceof 运算符的前一个操作数通常是一个引用型变量,后面通常是一个类。它用于判断前面的对象是否是后面的类的子类或者实例。如果是,返回true,否则,返回false。
在使用instanceof 运算符时注意,运算符前面的编译类型与后面的类要么相同,要么具有继承关系,否则会编译错误。
举个栗子说instanceof的用法:
结果如下:
END
【2017.07.17】好了,今天Java就学到这里吧,第五章完了,准备第六章,迫不及待想玩后面的界面。昨天没有弄竞赛题,今天不能拖了,加油吧!早上上课,专注了3个小时,收获颇丰,老师讲的每一句都带上了自己的思考,还是很喜欢这样的感觉的,小学期的任务主要是做CPU和状态机,不知道自己行不行,just try it!话说回来,这个其实离不开之前备考时对计组理的认真思考与体会,果然一分耕耘一份收获,看来知识还是学通透了好啊。放假了,但是对我而言,没有假期!!!FIGHTING!!!
标签:Java,变量,子类,疯狂,编译,类型,父类,方法,讲义 来源: https://blog.csdn.net/allein_STR/article/details/113985701