为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

比如要算矩形的周长需要两个参数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

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

正在回答

3 回答

首先重写子类的方法必须和被继承的父类的方法相同
//父类
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();
	}

}

这是我写的。。。。

1 回复 有任何疑惑可以回复我~
#1

MiseryKyo 提问者

非常感谢! 这样就是直接把子类方法写成无参的,然后在方法里面定义数据。 我一开始想的是有参数的话,就可以直接输入参数来计算了。
2015-02-12 回复 有任何疑惑可以回复我~
//父类
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);
			}
		}
	}

}


0 回复 有任何疑惑可以回复我~

可以使用可变长参数试试


0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

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

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信