引用他人的一段解释:
方法 打(XX){ },基中XX代表一基类
子类 人和水都继承XX
调用打(new 人()),打(new 水()),很显然行为是不一样的,但它可以正常的执行。我的问题是这样做有什么好处?
如果按照一般的写法:人 a = new 人();a.打();
水 b = new 水();b.打();
转型的写法:打(new 人());打(new 水());代码量上来说没减少什么,这样做的好处是什么呢?
方法 打(XX){ },基中XX代表一基类
子类 人和水都继承XX
调用打(new 人()),打(new 水()),很显然行为是不一样的,但它可以正常的执行。我的问题是这样做有什么好处?
如果按照一般的写法:人 a = new 人();a.打();
水 b = new 水();b.打();
转型的写法:打(new 人());打(new 水());代码量上来说没减少什么,这样做的好处是什么呢?
我换成thinking in Java 的写法算了
class Shape {
public void erase(){
//若干处理
}
}
class Circle extends Shape {
public void erase(){
//覆盖父类若干处理
}
}class Line extends Shape {
public void erase(){
//覆盖父类若干处理
}
}class XXX {
void doSomething(Shape shape) {
shape.erase();
//....
}
public static void doMain(String[] args) {
Circle c = new Circle();
Line l = new Line();
doSomething(c);
doSomething(l);
}
}如果上面的例子没有向上转型,没有继承,没有doSomething这个方法。
代码应该是这样的class XXX {
public static void doMain(String[] args) {
Circle c = new Circle();
Line l = new Line();
c.erase();
l.erase();
}
}
同样是4行代码,向上转型好在什么地方呢?
应用环境如:打印机(父类)子类:黑白打印机
彩色打印机当你调用打印机(不知道是哪个子类)打印时,你不用知道是哪个子类实现的打印方法,而子类的实例化是在程序的其它地方实现的。
在你实际应用到这个方法的时候还是要把子类的对象放到参数中去吧!
class Shape {
public void erase(){
//若干处理
}
}
class Circle extends Shape {
public void erase(){
//覆盖父类若干处理
}
} class Line extends Shape {
public void erase(){
//覆盖父类若干处理
}
}
class Eraser {
void cleanBoard(Shape shape){
shape.erase();
}
}class MainMethod {
public static void main(String[] args) {
Eraser earser = new Eraser();
earser.cleanBoard(New Line());
earser.cleanBoard(New Circle());
}
} 结论:使用了向上转型,无论在main method里增加什么shape的继承对象,都不需要修改Eraser类
不使用向上转型的代码应该是这样的:class Eraser {
void cleanBoard(Circle circle){
circle.erase();
}
void cleanBoard(Line line){
line.erase();
}
}
class MainMethod {
public static void main(String[] args) {
Eraser eraser = new Eraser();
earser.cleanBoard(New Line());
earser.cleanBoard(New Circle());
}
} 结论:每当MainMethod里增加一种shape的继承对象,你都不用去修改Eraser类重写cleanBoard函数
我看到的是main方法里面代码的行数还是没变。
9楼的朋友的结论:
不使用向上转型的代码应该是这样的: class Eraser {
void cleanBoard(Circle circle){
circle.erase();
} void cleanBoard(Line line){
line.erase();
}
}
class MainMethod {
public static void main(String[] args) {
Eraser eraser = new Eraser();
earser.cleanBoard(New Line());
earser.cleanBoard(New Circle());
}
}
但是如果我这么改呢class MainMethod {
public static void main(String[] args) {
Eraser eraser = new Eraser();
Line l = New Line();
l.erase();
Circle c = New Circle();
c.erase();
}
}
代码是不是反而变少了?10楼的朋友,你所说的void fc(A x){} 这样的一个代码,能不能这么理解,这个方法被调用的时候,肯定要在那个调用的方法里面(先认为是main方法)New 一下这个A类。那个时候还是要根据情况来分别New B,C,D吧!
可以总结成这样的形式:
使用向上转型:main方法New A,B,C,D类-->把New出来的类作为参数传给那个以基类作为参数的方法-->在以基类作为参数的方法里面,调用 A,B,C,D这些类的共有方法。
不使用向上转型:main方法New A,B,C,D类--->main方法调用A,B,C,D类的方法。明显是不使用向上转型来的简单。我们增加一个E类。向上转型的第二步不用修改,但是第一步还是要修改。和下面不使用向上转型的结果还是一样。我还是不了解向上转型的优势在哪里?