问答详情
源自:10-3 Java 中的抽象类

关于子类中方法重写的问题

如果父类中的抽象方法是无参的,那么子类中重写的方法是不是必须也是无参的?

比如要算矩形的周长需要两个参数l和h,面积需要两个参数l和h,而圆形周长和面积只需要一个参数r。

这个时候需要怎么定义抽象方法?是不是需要再定义两次抽象方法为两个参数的和一个参数的,并且重写的方法中参数还必须和抽象方法中一样?

这是抽象父类Shape:

public abstract class Shape {
	public abstract void getGirth(int a,int b);
	public abstract void getArea(int a,int b);
	public abstract void getGirth(int a);
	public abstract void getArea(int a);
	
}

这是子类Rectangle:

public class Rectangle extends Shape {

	@Override
	public void getGirth(int a,int b) {
		// TODO Auto-generated method stub
		System.out.println("矩形的面积为:"+(2*a+2*b));
	}

	@Override
	public void getArea(int a,int b) {
		// TODO Auto-generated method stub
		System.out.println("矩形的面积为:"+a*b);
	}

	@Override
	public void getGirth(int a) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void getArea(int a) {
		// TODO Auto-generated method stub
		
	}

这是子类Circle:

public class Circle extends Shape {

	@Override
	public void getGirth(int a) {
		// TODO Auto-generated method stub
		System.out.println("圆形的周长为:"+(2*3.14*a));
	}

	@Override
	public void getArea(int a) {
		// TODO Auto-generated method stub
		System.out.println("圆形的面积为:"+3.14*a*a);
	}

	@Override
	public void getGirth(int a, int b) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void getArea(int a, int b) {
		// TODO Auto-generated method stub
		
	}

测试类Test:

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Shape a = new Rectangle();
		Shape b = new Circle();
		a.getGirth(3, 4);
		a.getArea(3, 4);
		b.getGirth(3);
		b.getArea(3);
	}

运行结果:

矩形的面积为:14
矩形的面积为:12
圆形的周长为:18.84
圆形的面积为:28.259999999999998

想问下有没有更简便点的办法?

提问者:MiseryKyo 2015-02-12 17:05

个回答

  • yymooc
    2015-02-12 18:35:57
    已采纳

    首先重写子类的方法必须和被继承的父类的方法相同
    //父类
    public class Shape {
    public void getArea(){
    	System.out.println("图形的面积");
    }
    public void getGirth(){
    	System.out.println("图形的周长");
    }
    }
    //圆形子类
    public class Circle extends Shape {
    	int r=3;
    public void getArea(){
    	double area=3.14*r*r;
    	System.out.println("圆形的面积"+area);
    }
    public void getGirth(){
    	double girth=2*3.14*r;
    	System.out.println("圆形的周长"+girth);
    }
    }
    //方形子类
    public class Rectangle extends Shape {
    	int a=2;
    	int b=4;
    	public void getArea(){
    		double area=a*b;
    		System.out.println("方形的面积"+area);
    	}
    	public void getGirth(){
    		double girth=2*(a+b);
    		System.out.println("圆形的周长"+girth);
    	}
    }
    //测试类
    public class Initial {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Circle circle= new Circle();
    		circle.getArea();
    		circle.getGirth();
    		Rectangle rectangle= new Rectangle();
    		rectangle.getArea();
    		rectangle.getGirth();
    	}
    
    }

    这是我写的。。。。

  • 攻城狮1994
    2015-07-24 11:11:00

    //父类
    public abstract class Shape {
    	public abstract double perimeter(double i,double j);
    	public abstract double Area(double m,double n);
    }
    //子类Circle
    public class Circle extends Shape {
    	@Override
    	public double perimeter(double i, double j) {
    		// TODO Auto-generated method stub
    		double p = 2 * i * j;
    		return p;
    	}
    
    	@Override
    	public double Area(double m, double n) {
    		// TODO Auto-generated method stub
    		double s = m * n * n;
    		return s;
    	}
    
    }
    //子类Rectangle
    public class Rectangle extends Shape {
    
    	@Override
    	public double perimeter(double i,double j) {
    		// TODO Auto-generated method stub
    		double  p = 2*(i+j);
    		return p ;
    	}
    	@Override
    	public double Area(double m,double n) {
    		// TODO Auto-generated method stub
    		double s = m*n;
    		return s;
    	}
    }
    //测试类
    import java.util.*;
    public class Inital {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Scanner scanner = new Scanner(System.in);
    		Shape a = new Rectangle();
    		Shape b = new Circle();
    		for( int i =0 ;i <= 1; i++){
    			double m=0;
    			double n=0;
    			if(i == 0){
    				System.out.println("count Rectangle,Please input length and width");
    				System.out.println("length:");
    				m = scanner.nextDouble();
    				System.out.println("width:");
    				n = scanner.nextDouble(); 
    				double p = a.perimeter(m, n);
    				double s = a.Area(m, n);
    				System.out.println("Rectangle's perimeter :"+p);
    				System.out.println("Rectangle's Area:"+s);
    			}
    			if(i == 1){
    				System.out.println("count Circle,Please input radius");
    //				System.out.println("PI:");
    //				m = scanner.nextDouble();
    				System.out.println("radius:");
    				n = scanner.nextDouble(); 
    				double p = b.perimeter(Math.PI, n);
    				double s = b.Area(Math.PI, n);
    				System.out.println("Circle's perimeter :"+p);
    				System.out.println("Circle's Area:"+s);
    			}
    		}
    	}
    
    }


  • 诗雨若枫
    2015-02-12 18:43:57

    可以使用可变长参数试试