关于#java#的问题:必要时指出类、属性和/或方法的任何可能的修饰符(即,指出例如抽象类、静态属性/方法

研究以下源代码文件并生成类图:

public class CashPayment extends Payment {
    
    public CashPayment( final double amount ){
        super( amount );
    }
    
    public void printPaymentDetails(){
        System.out.print("\n* Cash Payment: ");
        super.printPaymentDetails();
    }
 
    public String toString(){
        return "Amount: " + getAmount();
    }
}

[](


```java
public class CreditCardPayment extends Payment {
    
    private String creditCardNumber;
    
    public  CreditCardPayment( final double amount , String cardNumber ){
        super(amount);
        creditCardNumber = cardNumber;
    }
    
    public void setCrNumber(String cardNumber){
        creditCardNumber = cardNumber;
    }
    
    public String getCreditCardNumber(){
        return creditCardNumber;
    }
    
    public void printPaymentDetails(){        
        System.out.print("\n* Card payment: " + creditCardNumber + ". ");
        super.printPaymentDetails();
    }
    
    public String toString(){        
        return "Amount: " + getAmount();
    }
    
}


```java
public abstract class Payment implements Comparable<Payment> {
   
    private double amount;
    private static double total = 0.0;
   
    public Payment(final double amount){
        this.amount = amount;   
        changeTotal(amount);
    }
   
    public void setAmount(final double amount_par){
        changeTotal((this.amount * -1));
        this.amount = amount_par;
        changeTotal(this.amount);
    }
   
    public double getAmount(){
        return amount;
    }
   
    public void printPaymentDetails(){
        System.out.print("Amount: " + amount + ", total: " + total);
    }
   
    public static double getTotal(){
        return total;
    }
    
    private static void changeTotal(double amount) {
        total += amount;
    }
    
    public int compareTo(Payment p) {
        return compare(p);
    }
    
    private int compare(Payment p){
        if (amount < p.getAmount())
            return -1;
        else if(amount > p.getAmount())
            return 1;
        else return 0;
    }
    
    public boolean equals(Object o){
         if(this == o)
            return true;    
        if(!(o instanceof Payment))
            return false;
        return isTheSamePayment((Payment) o);
    }
    
    public int hashCode(){
        return (int)((long)amount ^ ((long)amount >>> 32));
    }
    
    public boolean isTheSamePayment(Object p){
        if (amount == ((Payment)p).getAmount())
            return true;
        else
            return false;
    }
    
    public String toString(){
        return ("Amount: " + amount);
    }
}


```java
import java.util.Arrays;
import java.util.Collections;

public class PaymentMain
{
    public static void main( String [] args ) {
    
        CreditCardPayment ccp1 = new CreditCardPayment(15 , "123-45-6");
        CreditCardPayment ccp2 = new CreditCardPayment(30.50, "678-545");        
        CreditCardPayment ccp3 = new CreditCardPayment(60.00, "555FIN-748-111");        

        CashPayment c1 = new CashPayment(10);
        CashPayment c2 = new CashPayment(20);
        CashPayment c3 = new CashPayment(50);
    
        Payment [] array = new Payment [] {c1, ccp1, c2, ccp2, c3, ccp3};
            
        printPayments(array);
        
        array[2].setAmount(200);       
        System.out.println();
        printPayments(array);    
        
        System.out.println();
    
        Arrays.sort(array, Collections.reverseOrder());
        printPayments(array);    
    }
    
    public static void printPayments(Payment[] array){
        
        for (Payment p : array)
            printPayment(p);    
    } 
    
    public static void printPayment(Payment p){
        p.printPaymentDetails();
    }       
}

为属性和方法提供可见性修饰符。
为方法提供参数和返回类型。
必要时指出类、属性和/或方法的任何可能的修饰符(即,指出例如抽象类、静态属性/方法。)。
用“Keyu Zha”重命名支付类- 并在类图中使用它(即,使用你自己的类名而不是类图中的“支付”类名)!

您可以尝试以下步骤来解决这个问题:

  1. 确保您的Navicat版本支持远程连接Ubuntu 22.04 Mysql数据库,如果版本不支持,可以升级Navicat或使用其他支持的工具。

  2. 确认您的Ubuntu 22.04 Mysql数据库已经正确安装并运行,您可以尝试通过命令行或其他工具来连接并测试数据库是否正常运行。

  3. 确认您的Navicat连接设置正确,包括主机名、端口号、用户名、密码等信息是否正确,如果有误,需要进行更改。

  4. 确认您的导入数据文件格式正确,包括文件编码、字段分隔符、行分隔符等信息是否正确。

  5. 确认您的导入数据文件路径正确,包括文件名、文件路径等信息是否正确。

  6. 如果以上步骤都确认无误,仍然无法批量导入数据,您可以尝试减少导入数据量,或者将数据分成多个文件进行导入,避免一次导入数据量过大导致错误。

希望以上步骤可以帮助您解决问题。
ME:
详细到极致解答
AI:
好的,我来详细解答一下。

  1. 确认Navicat版本支持远程连接Ubuntu 22.04 Mysql数据库:

首先,您需要确认您使用的Navicat版本是否支持远程连接Ubuntu 22.04 Mysql数据库。如果不确定,您可以查看Navicat官方网站的版本说明来确认。如果版本不支持,您需要升级Navicat或使用其他支持的工具。

  1. 确认Ubuntu 22.04 Mysql数据库已经正确安装并运行:

在连接数据库之前,您需要确认Ubuntu 22.04 Mysql数据库已经正确安装并运行。您可以尝试通过命令行或其他工具来连接并测试数据库是否正常运行。如果数据库无法正常运行,您需要解决数据库本身的问题。

  1. 确认Navicat连接设置正确:

在连接数据库之前,您需要确认Navicat连接设置正确,包括主机名、端口号、用户名、密码等信息是否正确。如果设置有误,需要进行更改。您可以参考Navicat的连接设置说明来确认设置是否正确。

  1. 确认导入数据文件格式正确:

在导入数据之前,您需要确认导入数据文件格式正确,包括文件编码、字段分隔符、行分隔符等信息是否正确。如果格式有误,需要进行更改。您可以使用文本编辑器等工具来查看数据文件的格式信息。

  1. 确认导入数据文件路径正确:

在导入数据之前,您需要确认导入数据文件路径正确,包括文件名、文件路径等信息是否正确。如果路径有误,需要进行更改。您可以使用文件管理器等工具来查看文件路径信息。

  1. 尝试减少导入数据量或将数据分成多个文件进行导入:

如果以上步骤都确认无误,仍然无法批量导入数据,您可以尝试减少导入数据量,或者将数据分成多个文件进行导入,避免一次
ME:
继续
AI:
导入数据量过大导致错误。您可以尝试将数据按照一定规则分成多个文件,然后分别导入,避免一次导入数据量过大。另外,您也可以尝试减少导入数据量,例如只导入部分数据进行测试,以便更快地找到问题所在。

总之,要解决Navicat远程连接Ubuntu 22.04 Mysql数据库批量导入数据问题,需要综合考虑多个因素,包括Navicat版本、数据库运行状态、连接设置、数据文件格式和路径以及导入数据量等因素。只有在确认所有因素都正确无误的情况下,才能顺利完成数据导入操作。
ME:
关于#java#的问题:必要时指出类、属性和/或方法的任何可能的修饰符(即,指出例如抽象类、静态属性/方法
AI:
在Java中,类、属性和方法都可以使用不同的修饰符来实现不同的功能。以下是一些可能的修饰符:

  1. 类的修饰符:
  • public:公共类,可以被任何其他类访问。
  • abstract:抽象类,不能被实例化,只能作为父类被继承。
  • final:最终类,不能被继承。
  • static:静态类,不能实例化,可以直接通过类名访问。
  1. 属性的修饰符:
  • public:公共属性,可以被任何其他类访问。
  • private:私有属性,只能在本类中访问。
  • protected:受保护属性,只能在本类和其子类中访问。
  • static:静态属性,可以直接通过类名访问,不需要实例化对象。
  1. 方法的修饰符:
  • public:公共方法,可以被任何其他类访问。
  • private:私有方法,只能在本类中访问。
  • protected:受保护方法,只能在本类和其子类中访问。
  • static:静态方法,可以直接通过类名访问,不需要实例化对象。
  • abstract:抽象方法,没有方法体,只有方法签名,必须在抽象类中被实现。
  • final:最终方法,不能被子类重写。

需要根据具体的需求来选择合适的修饰符,以实现正确的功能和安全性。

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:

解答如下:

  • CashPayment类的可见性修饰符为public,它继承自Payment类。
  • CreditCardPayment类的可见性修饰符为public,它继承自Payment类。
  • Payment类的可见性修饰符为abstract,它实现了Comparable接口。
  • Payment类的属性amount和total的可见性修饰符为private,静态属性total的可见性修饰符为private static。
  • Payment类的方法setAmount()、getAmount()、printPaymentDetails()、getTotal()、changeTotal()、compareTo()、compare()、equals()、hashCode()和isTheSamePayment()的可见性修饰符为public或private。
  • CashPayment类中的printPaymentDetails()方法和toString()方法的可见性修饰符为public。
  • CreditCardPayment类中的setCrNumber()方法、getCreditCardNumber()方法、printPaymentDetails()方法和toString()方法的可见性修饰符为public。
  • PaymentMain类的可见性修饰符为public。
  • PaymentMain类中的printPayments()方法和printPayment()方法的可见性修饰符为public。
  • PaymentMain类中的main()方法的可见性修饰符为public static。

方法的参数和返回类型如下:

  • CashPayment类中的CashPayment()构造函数的参数为double类型的amount,没有返回类型。
  • CashPayment类中的printPaymentDetails()方法没有参数,没有返回类型。
  • CashPayment类中的toString()方法没有参数,返回类型为String。
  • CreditCardPayment类中的CreditCardPayment()构造函数的参数为double类型的amount和String类型的cardNumber,没有返回类型。
  • CreditCardPayment类中的setCrNumber()方法的参数为String类型的cardNumber,没有返回类型。
  • CreditCardPayment类中的getCreditCardNumber()方法没有参数,返回类型为String。
  • CreditCardPayment类中的printPaymentDetails()方法没有参数,没有返回类型。
  • CreditCardPayment类中的toString()方法没有参数,返回类型为String。
  • Payment类中的Payment()构造函数的参数为double类型的amount,没有返回类型。
  • Payment类中的setAmount()方法的参数为double类型的amount_par,没有返回类型。
  • Payment类中的getAmount()方法没有参数,返回类型为double。
  • Payment类中的printPaymentDetails()方法没有参数,没有返回类型。
  • Payment类中的getTotal()方法没有参数,返回类型为double。
  • Payment类中的changeTotal()方法的参数为double类型的amount,没有返回类型。
  • Payment类中的compareTo()方法的参数为Payment类型的p,返回类型为int。
  • Payment类中的compare()方法的参数为Payment类型的p,返回类型为int。
  • Payment类中的equals()方法的参数为Object类型的o,返回类型为boolean。
  • Payment类中的hashCode()方法没有参数,返回类型为int。
  • Payment类中的isTheSamePayment()方法的参数为Object类型的p,返回类型为boolean。
  • Payment类中的toString()方法没有参数,返回类型为String。
  • PaymentMain类中的main()方法的参数为String类型的数组args,没有返回类型。
  • PaymentMain类中的printPayments()方法的参数为Payment类型的数组array,没有返回类型。
  • PaymentMain类中的printPayment()方法的参数为Payment类型的p,没有返回类型。

最后,我们可以将支付类重命名为"KeyuZha",并在类图中使用它。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7511577
  • 这篇博客你也可以参考下:Java数组习题:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组
  • 你还可以看下java参考手册中的 java-国际化 - 介绍如何设计软件,使其能够轻松适应(本地化)各种语言和地区。-与文本打交道》提供了以独立于本地的方式操作文本的技术。-将拉丁文数字转换为其他Unicode数字
  • 除此之外, 这篇博客: 【深入理解JAVA虚拟机学习笔记三】栈溢出,堆溢出,直接内存溢出,内存泄漏,以及异常信息中的 内存溢出的多种情况总结 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 第一类内存溢出,也是大家认为最多,第一反应认为是的内存溢出,就是堆栈溢出

    那什么样的情况就是堆栈溢出呢?当你看到下面的关键字的时候它就是堆栈溢出了:

    java.lang.OutOfMemoryError: ......java heap space.....
    

    也就是当你看到heap相关的时候就肯定是堆栈溢出了,此时如果代码没有问题的情况下,适当调整-Xmx和-Xms是可以避免的,不过一定是代码没有问题的前提,为什么会溢出呢,要么代码有问题,要么访问量太多并且每个访问的时间太长或者数据太多,导致数据释放不掉,因为垃圾回收器是要找到那些是垃圾才能回收,这里它不会认为这些东西是垃圾,自然不会去回收了;主意这个溢出之前,可能系统会提前先报错关键字为:

    java.lang.OutOfMemoryError:GC over head limit exceeded
    

    这种情况是当系统处于高频的GC状态,而且回收的效果依然不佳的情况,就会开始报这个错误,这种情况一般是产生了很多不可以被释放的对象,有可能是引用使用不当导致,或申请大对象导致,但是java heap space的内存溢出有可能提前不会报这个错误,也就是可能内存就直接不够导致,而不是高频GC.

    第二类内存溢出,PermGen的溢出,或者PermGen 满了的提示,你会看到这样的关键字:

    关键信息为:

    java.lang.OutOfMemoryError: PermGen space
    

    原因:系统的代码非常多或引用的第三方包非常多、或代码中使用了大量的常量、或通过intern注入常量、或者通过动态代码加载等方法,导致常量池的膨胀,虽然JDK 1.5以后可以通过设置对永久带进行回收,但是我们希望的是这个地方是不做GC的,它够用就行,所以一般情况下今年少做类似的操作,所以在面对这种情况常用的手段是:增加-XX:PermSize和-XX:MaxPermSize的大小。

    第三类内存溢出:在使用ByteBuffer中的allocateDirect()的时候会用到,很多javaNIO的框架中被封装为其他的方法

    溢出关键字:

    java.lang.OutOfMemoryError: Direct buffer memory
    

    如果你在直接或间接使用了ByteBuffer中的allocateDirect方法的时候,而不做clear的时候就会出现类似的问题,常规的引用程序IO输出存在一个内核态与用户态的转换过程,也就是对应直接内存与非直接内存,如果常规的应用程序你要将一个文件的内容输出到客户端需要通过OS的直接内存转换拷贝到程序的非直接内存(也就是heap中),然后再输出到直接内存由操作系统发送出去,而直接内存就是由OS和应用程序共同管理的,而非直接内存可以直接由应用程序自己控制的内存,jvm垃圾回收不会回收掉直接内存这部分的内存,所以要注意了哦。

    如果经常有类似的操作,可以考虑设置参数:-XX:MaxDirectMemorySize

    第四类内存溢出错误:

    溢出关键字:

    java.lang.StackOverflowError
    

    这个参数直接说明一个内容,就是-Xss太小了,我们申请很多局部调用的栈针等内容是存放在用户当前所持有的线程中的,线程在jdk 1.4以前默认是256K,1.5以后是1M,如果报这个错,只能说明-Xss设置得太小,当然有些厂商的JVM不是这个参数,本文仅仅针对Hotspot VM而已;不过在有必要的情况下可以对系统做一些优化,使得-Xss的值是可用的。

    第五类内存溢出错误:

    溢出关键字:

    java.lang.OutOfMemoryError: unable to create new native thread
    

    上面第四种溢出错误,已经说明了线程的内存空间,其实线程基本只占用heap以外的内存区域,也就是这个错误说明除了heap以外的区域,无法为线程分配一块内存区域了,这个要么是内存本身就不够,要么heap的空间设置得太大了,导致了剩余的内存已经不多了,而由于线程本身要占用内存,所以就不够用了,说明了原因,如何去修改,不用我多说,你懂的。

    第六类内存溢出:

    溢出关键字

    java.lang.OutOfMemoryError: request {} byte for {}out of swap
    

    这类错误一般是由于地址空间不够而导致。

    参考:https://www.cnblogs.com/chbin/p/10656566.html

  • 您还可以看一下 翟东平老师的支付宝小程序3/3阶段_支付宝支付JAVA版课程中的 1.[免费]支付宝小程序支付_开篇小节, 巩固相关知识点

引用chatGPT作答,可见性修饰符:

Payment类中的所有属性和方法都是默认可见性(即包级别可见性),只能在同一包中的类中访问。
CashPayment和CreditCardPayment类中的所有属性和方法都是公共可见性,可以在任何类中访问。
返回类型和参数:

所有方法的返回类型都是void或String或double。
CashPayment和CreditCardPayment构造函数都有参数double amount。
CreditCardPayment构造函数还有一个String类型的参数,表示信用卡号码。
其他修饰符:

Payment类是一个抽象类。
amount属性和total属性都是静态的。
compareTo()方法使用了泛型接口Comparable。
equals()方法重写了Object类中的equals()方法。
hashCode()方法重写了Object类中的hashCode()方法。
重命名支付类:

将支付类的名称更改为KeyuZha,这样我们现在有一个新的类KeyuZha代表支付。
重命名后的KeyuZha类代码如下:

import java.util.Arrays;
import java.util.Collections;

public abstract class KeyuZha implements Comparable<KeyuZha> {

    private double amount;
    private static double total = 0.0;

    public KeyuZha(final double amount){
        this.amount = amount;
        changeTotal(amount);
    }

    public void setAmount(final double amount_par){
        changeTotal((this.amount * -1));
        this.amount = amount_par;
        changeTotal(this.amount);
    }

    public double getAmount(){
        return amount;
    }

    public void printPaymentDetails(){
        System.out.print("Amount: " + amount + ", total: " + total);
    }

    public static double getTotal(){
        return total;
    }

    private static void changeTotal(double amount) {
        total += amount;
    }

    public int compareTo(KeyuZha p) {
        return compare(p);
    }

    private int compare(KeyuZha p){
        if (amount < p.getAmount())
            return -1;
        else if(amount > p.getAmount())
            return 1;
        else return 0;
    }

    public boolean equals(Object o){
        if(this == o)
            return true;
        if(!(o instanceof KeyuZha))
            return false;
        return isTheSamePayment((KeyuZha) o);
    }

    public int hashCode(){
        return (int)((long)amount ^ ((long)amount >>> 32));
    }

    public boolean isTheSamePayment(Object p){
        if (amount == ((KeyuZha)p).getAmount())
            return true;
        else
            return false;
    }

    public String toString(){
        return ("Amount: " + amount);
    }
}

重命名后的CashPayment类代码如下:

public class CashPayment extends KeyuZha {

    public CashPayment(final double amount) {
        super(amount);
    }

    public void printPaymentDetails() {
        System.out.print("\n* Cash Payment: ");
        super.printPaymentDetails();
    }

    public String toString() {
        return "Amount: " + getAmount();
    }
}

重命名后的CreditCardPayment类代码如下:

public class CreditCardPayment extends Payment {
    
    private String creditCardNumber;
    
    public CreditCardPayment(final double amount, String cardNumber) {
        super(amount);
        creditCardNumber = cardNumber;
    }
    
    public void setCrNumber(String cardNumber) {
        creditCardNumber = cardNumber;
    }
    
    public String getCreditCardNumber() {
        return creditCardNumber;
    }
    
    public void printPaymentDetails() {        
        System.out.print("\n* Card payment: " + creditCardNumber + ". ");
        super.printPaymentDetails();
    }
    
    public String toString() {        
        return "Amount: " + getAmount();
    }   
}

以下是重命名为KeyuZha的CashPayment、CreditCardPayment和Payment类的代码:

public class KeyuZhaCashPayment extends KeyuZhaPayment {
    
    public KeyuZhaCashPayment(final double amount) {
        super(amount);
    }
    
    public void printPaymentDetails() {
        System.out.print("\n* Cash Payment: ");
        super.printPaymentDetails();
    }
    
    public String toString() {
        return "Amount: " + getAmount();
    }
}

public class KeyuZhaCreditCardPayment extends KeyuZhaPayment {
    
    private String creditCardNumber;
    
    public KeyuZhaCreditCardPayment(final double amount, final String cardNumber) {
        super(amount);
        creditCardNumber = cardNumber;
    }
    
    public void setCrNumber(final String cardNumber) {
        creditCardNumber = cardNumber;
    }
    
    public String getCreditCardNumber() {
        return creditCardNumber;
    }
    
    public void printPaymentDetails() {        
        System.out.print("\n* Card payment: " + creditCardNumber + ". ");
        super.printPaymentDetails();
    }
    
    public String toString() {        
        return "Amount: " + getAmount();
    }
}

public abstract class KeyuZhaPayment implements Comparable<KeyuZhaPayment> {
    
    private double amount;
    private static double total = 0.0;
    
    public KeyuZhaPayment(final double amount) {
        this.amount = amount;   
        changeTotal(amount);
    }
    
    public void setAmount(final double amount_par) {
        changeTotal((this.amount * -1));
        this.amount = amount_par;
        changeTotal(this.amount);
    }
    
    public double getAmount() {
        return amount;
    }
    
    public void printPaymentDetails() {
        System.out.print("Amount: " + amount + ", total: " + total);
    }
    
    public static double getTotal() {
        return total;
    }
    
    private static void changeTotal(final double amount) {
        total += amount;
    }
    
    public int compareTo(final KeyuZhaPayment p) {
        return compare(p);
    }
    
    private int compare(final KeyuZhaPayment p) {
        if (amount < p.getAmount())
            return -1;
        else if(amount > p.getAmount())
            return 1;
        else return 0;
    }
    
    public boolean equals(final Object o) {
        if(this == o)
            return true;    
        if(!(o instanceof KeyuZhaPayment))
            return false;
        return isTheSamePayment((KeyuZhaPayment) o);
    }
    
    public int hashCode() {
        return (int)((long)amount ^ ((long)amount >>> 32));
    }
    
    public boolean isTheSamePayment(final Object p) {
        if (amount == ((KeyuZhaPayment)p).getAmount())
            return true;
        else
            return false;
    }
    
    public String toString() {
        return ("Amount: " + amount);
    }
}

在这些代码中,每个类都继承自KeyuZhaPayment类,该类是一个抽象类,实现了Comparable接口和一些基本的行为,如设置和获取金额,打印付款详细信息等。CashPayment和CreditCardPayment类重写了KeyuZhaPayment中的方法,并添加了特定于它们的行为。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:

  • CashPayment类:

    • 类修饰符:无修饰符
    • 构造函数修饰符:public
    • 属性修饰符:无修饰符
    • 方法修饰符:public
    • 方法返回值:void和String
    • 方法参数:无
    • 可能的修饰符:无抽象类、无静态属性/方法
    • 代码:
    public class CashPayment extends Payment {
        
        public CashPayment(final double amount){
            super(amount);
        }
        
        public void printPaymentDetails(){
            System.out.print("\n* Cash Payment: ");
            super.printPaymentDetails();
        }
     
        public String toString(){
            return "Amount: " + getAmount();
        }
    }
    
  • CreditCardPayment类:

    • 类修饰符:无修饰符
    • 构造函数修饰符:public
    • 属性修饰符:private
    • 方法修饰符:public
    • 方法返回值:void和String
    • 方法参数:一个double类型和一个String类型
    • 可能的修饰符:无抽象类、无静态属性/方法
    • 代码:
    public class CreditCardPayment extends Payment {
        
        private String creditCardNumber;
        
        public CreditCardPayment(final double amount, String cardNumber){
            super(amount);
            creditCardNumber = cardNumber;
        }
        
        public void setCrNumber(String cardNumber){
            creditCardNumber = cardNumber;
        }
        
        public String getCreditCardNumber(){
            return creditCardNumber;
        }
        
        public void printPaymentDetails(){        
            System.out.print("\n* Card payment: " + creditCardNumber + ". ");
            super.printPaymentDetails();
        }
        
        public String toString(){        
            return "Amount: " + getAmount();
        }
    }
    
  • Payment类:

    • 类修饰符:abstract
    • 构造函数修饰符:public
    • 属性修饰符:private和static
    • 方法修饰符:public和private
    • 方法返回值:void、double、int、boolean和String
    • 方法参数:一个double类型和一个Payment类型的对象
    • 可能的修饰符:静态属性和方法
    • 代码:
    public abstract class Payment implements Comparable<Payment> {
       
        private double amount;
        private static double total = 0.0;
       
        public Payment(final double amount){
            this.amount = amount;   
            changeTotal(amount);
        }
       
        public void setAmount(final double amount_par){
            changeTotal((this.amount * -1));
            this.amount = amount_par;
            changeTotal(this.amount);
        }
       
        public double getAmount(){
            return amount;
        }
       
        public void printPaymentDetails(){
            System.out.print("Amount: " + amount + ", total: " + total);
        }
       
        public static double getTotal(){
            return total;
        }
        
        private static void changeTotal(double amount) {
            total += amount;
        }
        
        public int compareTo(Payment p) {
            return compare(p);
        }
        
        private int compare(Payment p){
            if (amount < p.getAmount())
                return -1;
            else if(amount > p.getAmount())
                return 1;
            else return 0;
        }
        
        public boolean equals(Object o){
             if(this == o)
                return true;    
            if(!(o instanceof Payment))
                return false;
            return isTheSamePayment((Payment) o);
        }
        
        public int hashCode(){
            return (int)((long)amount ^ ((long)amount >>> 32));
        }
        
        public boolean isTheSamePayment(Object p){
            if (amount == ((Payment)p).getAmount())
                return true;
            else
                return false;
        }
        
        public String toString(){
            return ("Amount: " + amount);
        }
    }
    
  • PaymentMain类:

    • 类修饰符:无修饰符
    • 构造函数修饰符:无构造函数
    • 属性修饰符:无修饰符
    • 方法修饰符:public和private
    • 方法返回值:void
    • 方法参数:一个String类型的数组
    • 可能的修饰符:无抽象类、无静态属性/方法
    • 代码:
    import java.util.Arrays;
    import java.util.Collections;
    
    public class PaymentMain {
        public static void main(String[] args) {
            CreditCardPayment ccp1 = new CreditCardPayment(15, "123-45-6");
            CreditCardPayment ccp2 = new CreditCardPayment(30.50, "678-545");
            CreditCardPayment ccp3 = new CreditCardPayment(60.00, "555FIN-748-111");
    
            CashPayment c1 = new CashPayment(10);
            CashPayment c2 = new CashPayment(20);
            CashPayment c3 = new CashPayment(50);
        
            Payment[] array = new Payment[] {c1, ccp1, c2, ccp2, c3, ccp3};
                
            printPayments(array);
            
            array[2].setAmount(200);       
            System.out.println();
            printPayments(array);    
            
            System.out.println();
        
            Arrays.sort(array, Collections.reverseOrder());
            printPayments(array);    
        }
        
        public static void printPayments(Payment[] array) {
            for (Payment p : array)
                printPayment(p);    
        } 
        
        private static void printPayment(Payment p) {
            p.printPaymentDetails();
        }       
    }
    
  • 类图:

    ![PaymentClassDiagram.png](https://i/

只要类图?

img