java - java如何以及什么时候使用抽象类

这是我在Java中的测试程序, 我想知道抽象类在这里有多重要,为什么我们为此使用抽象类。


class Shape1 {


 int i = 1;


 void draw() {


 System.out.println("this is shape:" + i);


 }


}



class Shape2 {


 int i = 4;


 void draw() {


 System.out.println("this is shape2:" + i);


 }


}



class Shape {


 public static void main(String args[]) {


 Shape1 s1 = new Shape1();


 s1.draw();



 Shape2 s2 = new Shape2();


 s2.draw();


 }


}



时间:

为了使通用基类/接口提供 void draw()方法,换句话说,你在这里使用抽象类或接口, 比如:


abstract class Shape() {


 void draw();


}



class Circle extends Shape {


 void draw() {. .. }


}



...



Shape s = new Circle();


s.draw();



我通常会使用一个接口, 但是,如果出现以下情况,则可以使用抽象类:

  • 你需要/想提供通用的功能或类成员(比如, 你的案例中的int i成员),
  • 例如,抽象方法除了public访问(这是接口允许的唯一访问类型),例如,在我的示例中,void draw()将具有包可见性。

抽象类与子类具有"is-a"类型关系, 例如,可以有一个抽象类 Shape,它具有任何形状的(像绘图函数),然后是一个类 SquareShape , 每个squareShape都是一个形状,但是,不是所有的形状都是 squareshapes 。

例如,你有2个形状类型,以及一个具有2个实例的类, 这不是你应该用abstract来定义的关系我认为。

但是,你可能需要使用名称,因为这是一个很小的例子,很难看到文件的真正含义。

java中使用抽象类的示例。


package use_of_abstract;



abstract class Shapes 


{


 int i=1;



 abstract void draw();


 abstract void color(String mycolor);



 //not an abstract method


 void fill()


 {


 System.out.println("Non-Abstract Method -> Fill"); 


 }



 //not an abstract method


 String anotherMethod(String input) 


 {


 return input +" additional text";


 }



}




package use_of_abstract;



public class Shape_One extends Shapes 


{


 int i=1;



 @Override


 void draw() 


 {


 System.out.println("This is Shape One:"+i);


 }



 @Override


 void color(String mycolor) 


 {


 System.out.println("This is Shape One:"+mycolor);



 }



 @Override


 String anotherMethod(String anotherMethod) 


 {


 System.out.println("This is Shape One:"+anotherMethod);


 return anotherMethod;



 }



}




package use_of_abstract;



public class Shape_Two extends Shapes


{


 int i=2;



 @Override


 void draw() 


 {


 System.out.println("This is Shape Two :"+i);


 }



 @Override


 void color(String mycolor) 


 {


 System.out.println("This is Shape Two Color:"+mycolor);


 }



 @Override


 String anotherMethod(String anotherMethod) 


 {


 System.out.println("This is Shape Two:"+anotherMethod);


 return anotherMethod;



 }



}




package use_of_abstract;



import java.awt.Color;



public class Shape_Main 


{



 public static void main(String args[])


 {


 Shape_One s1;


 Shape_Two s2;



 s1=new Shape_One();


 s2= new Shape_Two();



 s1.draw();


 s2.draw();



 s1.fill();


 s2.fill();



 s1.color("Blue");


 s2.color("Green");



 s1.anotherMethod("HELLO..............Its Another Method 1");


 s2.anotherMethod("HELLO..............Its Another Method 2");



 } 


}



抽象类是一个类,它至少有一个方法未实现,或者关键字抽象, 例如抽象方法可能如下所示:

public abstract String myMethod(String input);

(请注意该方法以semi-colon结尾)。

类的外观可能如下所示:


public abstract class MyClass {



 public abstract String myMethod(String input);



 public String anotherMethod(String input) {


 return intput +" additional text";


 }


}



抽象类不能实例化, 抽象类需要子类来实现缺失行为,以便可以对它进行实例化。

抽象类的主要目标是提供共同行为的共享实现 - 促进代码的重用。

在Java中,同样的效果可以通过使用类的组合而不是从广义定义的抽象类中, 这允许更多模块化的功能类促进代码重用,从而增加可维护性。

我的建议是只在严格必要时使用抽象类,特别是避免将它用作满足所有功能的技巧包。

在Scala中使用特性,这是解决这个问题的优雅方法, 然而,它确实需要很多关注才能完成它。

抽象类,顾名思义,它是抽象的。

抽象类不讨论实现部分, 实际上,我们扩展抽象类以提供它抽象方法的实现, 它也可以有非抽象方法。

Java中抽象类的使用

编辑:

代码示例:


abstract class Shapes {



 int i=1;


 abstract void draw(); 



//Remember : Non-abstract methods are also allowed 


 void fill() {


 System.out.println("Non abstract method - fill");


 }


}



class Shape1 extends Shapes {



 int i=1;


 void draw(){


 System.out.println("This is Shape 1:"+i);


 }


}



class Shape2 extends Shapes {


 int i=2;


 void draw() {


 System.out.println("This is Shape 2:"+i);


 }


}



class Shape {



public static void main(String args[])


 {


 Shape1 s1 = new Shape1();


 s1.draw(); //Prints This is Shape 1:1



 Shape2 s2 = new Shape2();


 s2.draw(); //Prints This is Shape 2:2


 }


 }



...