【问题标题】:How do the statements prevent overloading?语句如何防止重载?
【发布时间】:2022-01-20 14:40:29
【问题描述】:

我是 Java 编程的初学者。我在开发基于 Prime Checker 的程序时遇到了这个问题。已经指定了;

编辑器中的锁定代码将调用带有一个或多个整数参数的 checkPrime 方法。您应该以代码仅打印素数的方式编写 checkPrime 方法。 请仔细阅读编辑器中给出的代码。也请不要使用方法重载!

我想知道注释行 w.r.t 之后的语句的作用是什么。下面的Java程序?
它们在锁定代码中的用途是什么?

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
import java.lang.reflect.*;
import static java.lang.System.in;
class Prime
{
    void checkPrime(int ... num)
    {
        for(int n:num)
        {
        int i,k=0;
        for(i=1;i<=n;i++)
        {
            if(n%i==0)
            ++k;
        }
        if(k==2)
        System.out.print(n+" ");
    }
    System.out.println();
}
}

public class Solution 
{

    public static void main(String[] args) 
{
        try
{
        BufferedReader br=new BufferedReader(new InputStreamReader(in));
        int n1=Integer.parseInt(br.readLine());
        int n2=Integer.parseInt(br.readLine());
        int n3=Integer.parseInt(br.readLine());
        int n4=Integer.parseInt(br.readLine());
        int n5=Integer.parseInt(br.readLine());
        Prime ob=new Prime();
        ob.checkPrime(n1);
        ob.checkPrime(n1,n2);
        ob.checkPrime(n1,n2,n3);
        ob.checkPrime(n1,n2,n3,n4,n5);  
      
      //What do the following statements from below till the end mean?
 
        Method[] methods=Prime.class.getDeclaredMethods();
        Set<String> set=new HashSet<>();
        boolean overload=false;
        for(int i=0;i<methods.length;i++)
        {
            if(set.contains(methods[i].getName()))
            {
                overload=true;
                break;
            }
            set.add(methods[i].getName());
            
        }
        if(overload)
        {
            throw new Exception("Overloading not allowed");
        }
        }
        catch(Exception e)
        {
            System.out.println(e);
        }

    }
    
}

【问题讨论】:

  • 嗯,它正在验证是否有多个具有相同名称的方法 - 即重载。我不太确定你在问什么......

标签: java exception overloading


【解决方案1】:

基本上,它检查您是否在 Prime 类中完成了重载。它正在获取在 Prime 类中声明的所有方法。然后将它们的名称存储在集合中,这样,如果集合中已经存在任何名称。它会抛出异常,你有重载的函数,这是你的情况的限制。

    //getting all method in Prime
    Method[] methods=Prime.class.getDeclaredMethods();
    Set<String> set=new HashSet<>();
    boolean overload=false;
    //looping through all method array
    for(int i=0;i<methods.length;i++)
    {
        //checking if function already exist in set means, method is overloaded.
        if(set.contains(methods[i].getName()))
        {
            overload=true;
            break;
        }
        //adding method name in set. (set is used because, it does not hold 
        mutiple enteries for one value)
        set.add(methods[i].getName());
        
    }
    //if overload has been done in class then will throw exception
    if(overload)
    {
        throw new Exception("Overloading not allowed");
    }
    }
    catch(Exception e)
    {
        System.out.println(e);
    }

【讨论】:

  • 它不会阻止,如果您的类中存在重载,它会验证并生成异常。
【解决方案2】:

该代码只是从 Prime 类中提取方法名称并确保没有重复名称。它通过检查当前正在评估的方法名称的一组方法名称来迭代地执行此操作。每次评估后,方法名称被添加到集合中,以便下一次迭代可以检测下一个方法名称是否已经存在。

因此,“锁定”代码通过编写 4 个版本来检查您是否遵守了不重载 checkPrime 的要求。如果您也删除“锁定”代码,我认为您将失败。

总而言之,由于有 4 个使用不同数量的整数参数调用 checkPrime 的示例,他们希望您演示编写一个处理不同数量整数参数的 checkPrime 函数。

ob.checkPrime(n1);
ob.checkPrime(n1,n2);
ob.checkPrime(n1,n2,n3);
ob.checkPrime(n1,n2,n3,n4,n5); 

有一种 Java 方法可以做到这一点。见:https://www.baeldung.com/java-varargs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 2023-03-24
    相关资源
    最近更新 更多