JAVA中方法覆盖,看这篇就够了
方法覆盖
1、方法覆盖又被称为方法重写
2、什么时候使用方法重写?
当父类中的方法已经无法满足当前子类的业务需求;
子类有必要将父类中继承过来的方法进行重新编写;
3、代码需要满足什么条件才能构成方法覆盖?
(1)方法重写发生在具有继承关系的父子类之间;
(2)方法重写的时候:方法名相同、返回值类型相同、形参列表相同;
(3)方法重写的时候:访问权限不能更低,可以更高;【public>protect>private】
(4)方法重写的时候:抛出异常不能更多,可以更少;
4、建议方法重写的时候尽量复制粘贴!(因为容易出错,导致没有产生覆盖)
(第四点特别需要注意,我在写的时候找这个错误找了半天)
5、注意:
(1)私有方法不能继承,所以不能覆盖
(2)构造方法不能继承,所以不能覆盖
(3)静态方法不存在覆盖
(4)覆盖只针对方法,不谈属性
题目要求:
前提:先是有一个一个两点之间求距离的函数 Point2d,以此为父类派生出各个子类
1. Point3d
Point3d用于描述三维坐标点
(1)增加Z坐标
(2)覆盖toString()方法,输出三维坐标
(3)覆盖distance()方法,计算三维坐标点之间的距离
(4)定义有参数的构造方法,利用super调用父类构造方法
2. Circle
Circle用于描述二维的圆,圆可以看作是一个点和一个半径
(1)增加半径
(2)增加计算面积的方法
(3)覆盖toString方法
(4)定义有参数的构造方法,利用super调用父类构造方法
3. Line
Line用于描述平面的直线,y = k * x + b
(1)增加k,b
(2)覆盖toString方法
(3)定义有参数的构造方法,利用super调用父类构造方法
*补充:直线只要再增加一个斜率就可以了,输出的时候,要以:y=kx+b的形式输出*
4. 定义Test类,进行测试
(1)定义main方法,测试定义的类
(2)定义方法:void show(Point2d point),
传递不同的子类对象,在该方法中调用toString,查看输出结果。
class Point2d
{
int x=0;
int y=0;
Point2d()
{
x=y=0;
}
Point2d(int x,int y)
{
this.x=x;
this.y=y;
}
public String toString()
{
return "(" + x +"." + y +")";
}
public double distance(Point2d point)
{
int delX = x - point.x;
int delY = y - point.y;
return Math.sqrt(delX*delX + delY*delY);
}
}
class Point3d extends Point2d
{
int z = 0;
Point3d()
{
z=0;
}
Point3d(int x,int y,int z)
{
super(x,y);
this.z=z;
}
public String toString()
{
return "(" + x + "," + y + "," + z+")" ;
}
public double distance(Point2d point)
{
int delX = 0;
int delY = 0;
int delZ = 0;
if(point instanceof Point3d)
{
delX = x - point.x;
delY = y - point.y;
delZ = z - ((Point3d)point).z;
}
else
{
delX = x - point.x;
delY = y - point.y;
delZ = z;
}
return Math.sqrt(delX*delX+delY*delY+delZ*delZ);
}
}
class Circle extends Point2d
{
double radius = 0.0;
Circle()
{
radius=0.0;
}
Circle(int x,int y,double radius)
{
super(x,y);
this.radius = radius;
}
public String toString()
{
return "( x-" + x + ")^2 + ( y -" + y + ")^2=" + radius*radius;
}
public double area()
{
return 3.14 * radius * radius;
}
}
public class D {
public static void main(String[] args)
{
Point2d p1 = new Point2d(1,1);
Point2d p2 = new Point2d(2,2);
System.out.println(p1.toString());
System.out.println(p1.distance(p2));
Point3d p3 = new Point3d(3,6,7);
Point3d p4 = new Point3d(4,4,10);
System.out.println(p3.toString());
System.out.println (p3.distance(p1));
Circle c = new Circle(2,8,9);
System.out.println (c.toString());
System.out.println (c.area());
}
}
执行结果:
恭喜你,看到了这里:
下面是老师留给我们的小作业,接着来看吧!
3. Line
Line用于描述平面的直线,y = k * x + b
(1)增加k,b
(2)覆盖toString方法
(3)定义有参数的构造方法,利用super调用父类构造方法
*补充:直线只要再增加一个斜率就可以了,输出的时候,要以:y=kx+b的形式输出*
4,定义Test类,进行测试
(1)定义main方法,测试定义的类
(2)定义方法:void show(Point2d point),
传递不同的子类对象,在该方法中调用toString,查看输出结果。
class Point2d
{
int x=0;
int y=0;
Point2d()
{
x=y=0;
}
Point2d(int x,int y)
{
this.x=x;
this.y=y;
}
public String toString()
{
return "(" + x +"." + y +")";
}
public double distance(Point2d point)
{
int delX = x - point.x;
int delY = y - point.y;
return Math.sqrt(delX*delX + delY*delY);
}
}
class Zhixian extends Point2d
{
double k = 0.0;
double b = 0.0;
Zhixian()
{
k=0.0;
}
Zhixian(int x,int y,double k)
{
super(x,y);
this.k = k;
}
public double gongshi()
{
b = y - k*x;
return b;
}
public String toString()
{
return "y" + "=" + k+"x"+ "+" +b;
}
}
public class E {
public static void main(String[] arg)
{
Zhixian L1 = new Zhixian(10,10,3.0);
System.out.println(L1.gongshi());
System.out.println(L1.toString());
}
}
执行结果: