简介
本文是2021/03/29整理的笔记 赘述可能有点多,还请各位朋友耐心阅读 本人的内容和答案不一定是最好最正确的,欢迎各位朋友评论区指正改进。
练习题:(多态)写一个函数,接收一个图形作为参数,打印出该图形的周长和面积
(1)父类图形Shape类 (2)子类三角形Triangel类 (3)子类圆形Circle类 (4)子类正方形Square类 (5)子类矩形Rectangle类 (6)分别求各图形的周长和面积
题目分析
本题中Shape类只需要写两个方法即可,计算周长和计算面积的方法 三角形需要设置三条边。三角形比较特殊,需满足两边之和大于第三边。这个条件可以在构造方法和Set方法中设置,也可以单独写一个方法出来。本题的代码示例将2种情况一并写在了三角形类中。 圆形需要设置半径,构造方法以及相应的Getter and Setter方法 正方形设置边长,构造方法以及相应的Getter and Setter方法 矩形设置长和宽,构造方法以及相应的Getter and Setter方法 设置一个ShapeTest类,用于直接调用所有图形的计算面积和计算周长方法
代码示例
Shape类
public class Shape {
public void calculateCircumference ( ) {
}
public void calculateArea ( ) {
}
}
Triangle类
public class Triangle extends Shape {
private double a;
private double b;
private double c;
@Override
public void calculateCircumference ( ) {
System. out. println ( "三角形的周长是:" + ( a+ b+ c) ) ;
}
public void judgeCircumference ( ) {
if ( a + b > c && a + c > b && b + c > a && a > 0 && b > 0 && c > 0 ) {
calculateCircumference ( ) ;
} else {
System. out. println ( "三角形的周长返回错误。错误:不满足三边关系或者至少一条边设置了负数" ) ;
}
}
@Override
public void calculateArea ( ) {
double p = ( a+ b+ c) / 2 ;
double area = Math. sqrt ( ( p- a) * ( p- b) * ( p- c) * p) ;
System. out. println ( "三角形的面积是:" + area) ;
}
public void judgeArea ( ) {
if ( a + b > c && a + c > b && b + c > a && a > 0 && b > 0 && c > 0 ) {
calculateArea ( ) ;
} else {
System. out. println ( "三角形的面积返回错误。错误:不满足三边关系或者至少一条边设置了负数" ) ;
}
}
public Triangle ( ) {
}
public Triangle ( double a, double b, double c) {
if ( a+ b> c && a+ c> b && b+ c> a && a> 0 && b> 0 && c> 0 ) {
this . a = a;
this . b = b;
this . c = c;
} else {
System. out. println ( "三角形的三条边设置错误。错误:不满足三边关系或者至少一条边设置了负数" ) ;
}
}
public double getA ( ) {
return a;
}
public void setA ( double a) {
if ( a+ b> c && a+ c> b && b+ c> a) {
this . a = a;
} else {
System. out. println ( "三角形的三条边设置错误。错误:不满足三边关系或者至少一条边设置了负数" ) ;
}
}
public double getB ( ) {
return b;
}
public void setB ( double b) {
if ( a+ b> c && a+ c> b && b+ c> a) {
this . b = b;
} else {
System. out. println ( "三角形的三条边设置错误。错误:不满足三边关系或者至少一条边设置了负数" ) ;
}
}
public double getC ( ) {
return c;
}
public void setC ( double c) {
if ( a+ b> c && a+ c> b && b+ c> a) {
this . c = c;
} else {
System. out. println ( "三角形的三条边设置错误。错误:不满足三边关系或者至少一条边设置了负数" ) ;
}
}
}
Circle类
public class Circle extends Shape {
private double radius;
@Override
public void calculateArea ( ) {
System. out. println ( "圆的面积是:" + String. format ( "%.2f" , Math. PI * radius * radius) ) ; ;
}
@Override
public void calculateCircumference ( ) {
System. out. println ( "圆的周长是:" + String. format ( "%.2f" , Math. PI * radius * 2 ) ) ;
}
public Circle ( ) {
}
public Circle ( double radius) {
if ( radius> 0 ) {
this . radius = radius;
} else {
System. out. println ( "设置的半径错误" ) ;
}
}
public double getRadius ( ) {
return radius;
}
public void setRadius ( double radius) {
if ( radius > 0 ) {
this . radius = radius;
} else {
System. out. println ( "设置的半径错误" ) ;
}
}
}
Square类
public class Square extends Shape {
private double side;
@Override
public void calculateArea ( ) {
System. out. println ( "正方形的面积是:" + side* side) ;
}
@Override
public void calculateCircumference ( ) {
System. out. println ( "正方形的周长是:" + side* 4 ) ;
}
public Square ( ) {
}
public Square ( double side) {
this . side = side;
}
public double getSide ( ) {
return side;
}
public void setSide ( double side) {
if ( side> 0 ) {
this . side = side; }
else {
System. out. println ( "设置的正方形边长错误" ) ;
}
}
}
Rectangle类
public class Rectangle extends Shape {
private double length;
private double width;
@Override
public void calculateArea ( ) {
System. out. println ( "长方形面积:" + length * width) ;
}
@Override
public void calculateCircumference ( ) {
System. out. println ( "长方形周长:" + ( length+ width) ) ;
}
public Rectangle ( ) {
}
public Rectangle ( double length, double width) {
if ( length> 0 && width > 0 ) {
this . length = length;
this . width = width;
} else {
System. out. println ( "设置的长和宽错误" ) ;
}
}
public double getLength ( ) {
return length;
}
public void setLength ( double length) {
if ( length> 0 ) {
this . length = length;
} else {
System. out. println ( "设置的长错误" ) ;
}
}
public double getWidth ( ) {
return width;
}
public void setWidth ( double width) {
if ( width> 0 ) {
this . width = width;
} else {
System. out. println ( "设置的宽错误" ) ;
}
}
}
ShapeTest类
public class ShapeTest {
public static void calculateCircumference ( Shape shape) {
if ( shape instanceof Triangle ) {
Triangle triangle = ( Triangle) shape;
triangle. judgeCircumference ( ) ;
return ;
} else {
shape. calculateCircumference ( ) ;
}
}
public static void calculateArea ( Shape shape) {
if ( shape instanceof Triangle ) {
Triangle triangle = ( Triangle) shape;
triangle. judgeArea ( ) ;
return ;
} else {
shape. calculateArea ( ) ;
}
}
public static void main ( String[ ] args) {
Shape triangle = new Triangle ( 3.0 , 4.0 , 5.0 ) ;
calculateCircumference ( triangle) ;
calculateArea ( triangle) ;
Shape circle = new Circle ( 5.0 ) ;
calculateCircumference ( circle) ;
calculateArea ( circle) ;
Shape square = new Square ( 5.0 ) ;
calculateCircumference ( square) ;
calculateArea ( square) ;
Shape rectangle = new Rectangle ( 5.0 , 4.0 ) ;
calculateCircumference ( rectangle) ;
calculateArea ( rectangle) ;
}
}
程序运行结果
关联与依赖
关联
类间是has - a 的关系,一个类的对象作为另一个类的属性,生命周期没有必要联系。
一对一
比如说人与身份证的关系,一个人只能持有一张合法的身份证,一张身份证只对应一个人。 代码示例:
public class IdCard {
String id;
String number;
}
public class Person ( ) {
String name;
String id;
int age;
IdCard idcard;
}
一对多
比如说一间教室对应多个学生,教室中有一个数组或集合存储学生 代码示例:
public class Student {
String name;
int age;
String gender;
}
public class ClassRoom {
Student[ ] students;
}
聚合
类间是has - a的关系 ,在语法上和关联没有区别,只能从语义上区分。生命周期没有必要联系。 例如:一个学校有很多学生 代码示例:
public class Student {
}
public class School {
private Student[ ] students;
}
组合
类与类间是contains - a 关系,生命周期有必要联系。部分必须后于整体创建或同时创建,部分必须先于整体销毁或同时销毁。 比如说一个游戏和一个游戏的菜单,菜单必须在游戏开启时或游戏开启后才能打开,菜单必须在游戏关闭时或游戏关闭前关闭。 聚合和组合的区别: 聚合的生命周期没有必要联系,组合的生命周期有必要联系。
依赖
类与类间是use - a的关系,将一个类的对象作为另一个类中的方法参数使用。生命周期没有必要联系 代码示例:
public class Mouse ( ) {
}
public class Person ( ) {
public void useMouse ( Mouse mouse) {
System. out. println ( "人正在使用" + mouse) ;
}
}
几种关系的强弱比较
JDK常用包
java.lang Java语言核心类库 java.util包 工具类 java.net 网络编程 java.sql 数据库 java.text 格式化 java.io 输入输出
Object类的主要方法
equals方法
public boolean equals(Object obj) 对象比较:比较两个对象的虚地址是否相同 如果想要满足其他需要可以重写此方法
hashCode
public int hashCode() 取得Hash码
toString
public String toString() 对象打印时调用