Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 第二类中的私有字符串_Java - Fatal编程技术网

Java 第二类中的私有字符串

Java 第二类中的私有字符串,java,Java,我设计了两个类。我需要调用Card类的format方法,以便在IDCard类中获得Card holder+名称。当我试图编译时,它给出了一个错误,即name在card中具有私有访问权限,但我有一个getter语句 public class Card{ private String name; public Card() { name = " "; } public Card(String n) { name = n;

我设计了两个类。我需要调用Card类的format方法,以便在IDCard类中获得Card holder+名称。当我试图编译时,它给出了一个错误,即name在card中具有私有访问权限,但我有一个getter语句

public class Card{
    private String name; 

    public Card() { 
        name = " "; 
    }

    public Card(String n) { 
        name = n; 
    } 

    public String getName() { 
        return name;
    }

    public boolean isExpired() { 
        return false;
    }

    public String format() { 
        return "Card holder: " + name; 
    } 
}
这是第二节课:

public class IDCard extends Card { 
    private String idNumber;
    public IDCard (String n, String id) { 
        super (n);
        idNumber = id;
    }

    public String getId() { 
        return idNumber;
    }

    public String format() { 
        return name.format() + "\n" + "ID Number: " + idNumber; 
    }
}
因为名称是私有的,所以它的子类不能直接访问它。 因此,请使用getter方法获取名称:

return getName() + "\n" + "ID Number: " + idNumber; 
请注意,字符串没有零参数格式方法。因此name.format将生成编译错误

但是,您可以使用超级实现并附加当前描述:

return super.format() + "\n" + "ID Number: " + idNumber; 
将name.format更改为getName.format或super.format。您不能通过名称调用私有变量来访问它——如果您不想在扩展其他类的子类中包含getter和access变量,则必须使用getter将访问修饰符从private更改为protected。您还应该在格式化方法之前添加@Override注释。

在IDCard.format中,调用getName:

无法直接从子类访问private。
顺便说一句,如果您已经对其进行了保护,子类将可以访问它。

只需对名称字段进行保护即可。这个关键字就是为了这个目的而存在的,而调用getter方法是很奇怪的

对继承的类使用getName以访问卡类中的name

是的,您不能使用子类中扩展的类中的私有字段。您需要使用getter方法。

您实际上犯了两个错误:

您不能直接从IDCard访问name,应使用其访问器getName。 即使如此,它也不起作用,因为getName返回一个字符串;实际上,您可能需要在IDCard中执行以下操作:


为什么不使用super关键字调用format方法呢

super.format() + "\n" + "ID Number: " + idNumber; 

即使您有一个getter方法,字段本身也是私有的,因此您不能直接访问它。

protected也允许从同一个包中的其他类访问此字段。在这种情况下,getter似乎更好。它应该是super.format而不是name.format
public String format() { 
    return super.format() + "\n" + "ID Number: " + idNumber; 
}
super.format() + "\n" + "ID Number: " + idNumber;