小弟是初学者,对抽象类有些不理解。
子类必须实现抽象超类中的抽象方法,那么为什么不在子类中直接按特性不同自己写这个方法呢?非要把这方法抽象出来,放在超类中做成抽象类吗?我明白抽象方法是子类共同的特性,但要根据需要做不同的实现,反正都要实现,那在子类里自己根据需要实现自己的方法不就可以了吗?抽象超类仅仅是为了面向对象的意义才要被抽象的吗?还是这个类在抽象方法被实现之前,不想被实例化呢?想来想去也想不明白,希望大大们指教啊,谢谢```
子类必须实现抽象超类中的抽象方法,那么为什么不在子类中直接按特性不同自己写这个方法呢?非要把这方法抽象出来,放在超类中做成抽象类吗?我明白抽象方法是子类共同的特性,但要根据需要做不同的实现,反正都要实现,那在子类里自己根据需要实现自己的方法不就可以了吗?抽象超类仅仅是为了面向对象的意义才要被抽象的吗?还是这个类在抽象方法被实现之前,不想被实例化呢?想来想去也想不明白,希望大大们指教啊,谢谢```
示例
//Shapes.javaclass Shape {
void draw() {}
void erase() {}
}class Circle extends Shape {
void draw() {
System.out.println("Circle.draw()");
}
void erase() {
System.out.println("Circle.erase()");
}
}class Square extends Shape {
void draw() {
System.out.println("Square.draw()");
}
void erase() {
System.out.println("Square.erase()");
}
}class Triangle extends Shape {
void draw() {
System.out.println("Triangle.draw()");
}
void erase() {
System.out.println("Triangle.erase()");
}
}public class Shapes {
public static Shape randShape() {
switch((int)(Math.random() * 3)) {
default: // To quiet the compiler
case 0: return new Circle();
case 1: return new Square();
case 2: return new Triangle();
}
}
public static void main(String[] args) {
Shape[] s = new Shape[3];
s[0]=new Circle();
s[1]=new Square();
s[2]=new Triangle();
s[0].draw();
s[1].draw();
s[2].draw();
}
}
private String sum;
public abstract int getValue(int i,int j);
}public class Sum extends Arithmetic{
public Sum(String sum){this.sum=sum;}
public int getValue(int i,int j){
return i+j;
}
}public class Sub extends Arithmetic{
public Sub(String sub){this.sub=sub;}
public int getValue(int i,int j){
return i-j;
}
}Arithmetic暴露了一个抽象方法,你可以知道,但是他的子类如何实现这个方法,你可以毫不关心,上面实现了加法和减法,如果又有别人出了一个实现乘法的子类,你会不会用呢?答案是肯定的
只要这样用就可以
Arithmetic a=new 乘法("");
a.getValue(1,2)最大的好处不就体现在这里了吗?你根本就不用知道乘法是怎么实现的,拿来用就没问题。
第二就是它可以有多种实现。这样使用起来不是更加灵活吗?
打个比方
抽象父类:交通工具 有一个方法是 去上海
子类: 飞机 轮船 火车 各用不同方法实现了 去上海当你要去上海,做计划时,只是决定去上海就可以了,至于去时用什么交通工具,看情况决定就行了。
如果计划定死了,一定要做飞机。结果发生暴风雨,飞机不能飞火车能走,你也只能等飞机。
交通工具 去上海 = new 火车();
交通工具 去上海 = new 轮船();
交通工具 去上海 = new 飞机();
初学JAVA总感觉OOP有点怪,继续努力
以下摘自 http://www.cjsdn.net/post/view?bid=29&id=164878
---------------------------------------------
首先,abstract class在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。也许,这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧。 其次,在abstract class的定义中,我们可以赋予方法的默认行为。但是在interface的定义中,方法却不能拥有默认行为。(为了绕过这个限制,必须使用委托,但是这会增加一些复杂性,有时会造成很大的麻烦。)
---------------------------------------------