我是继承和抽象类的新手。
对于这个例子,我正在设计一个可以拥有个人或企业的电话簿。此人具有标题,名字,姓氏和电话号码。该公司有一个公司名称和电话号码。 我用抽象方法getName创建了一个抽象类 (这对你们来说听起来很简单,但请耐心等待我!)
public abstract class PhoneBook {
private String phone;
public boolean setPhone(String p) //final
{
boolean flag = false;
if(p.length()!= 10)
{
flag = false;
}
for (int i = 0; i < p.length(); i++)
{
if(Character.isDigit(p.charAt(i)))
{
phone = p;
flag = true;
}
}
return flag;
}
public abstract String getName();
}
我的两个子类是Person and Business。 person的getName方法连接title,f name,l name。 在主要内容中,我创建了一个可以同时容纳个人或企业的PhoneBook数组(抽象数组)。
我输出有困难...如何访问getPhone(在抽象类中)输出它?
这是主要的(我目前只在人员部分工作)
import javax.swing.*;
公共类PhoneBookEntries {
public static final int MAX = 100;
public static void main(String[] args) {
PhoneBook[] phone = new PhoneBook[100];
int selection;
int i = 0;
do{
selection = Integer.parseInt(JOptionPane.showInputDialog("Would you like to add a\n1.person\n2.business\nto the phone book?"));
switch(selection)
{
case 1: phone[i]= fillPerson();
break;
case 2: fillBusiness();
break;
}
}while(i < MAX && JOptionPane.showConfirmDialog(null, "Add another entry to phone book?")==JOptionPane.YES_OPTION);
//output
String output;
output = phone[i].getName();
JOptionPane.showMessageDialog(null, output);
}
private static PhoneBook fillPerson()
{
Person someone = new Person();
someone.setTitle(JOptionPane.showInputDialog("Enter your title\n(Mr., Mrs., Ms., or Dr.)"));
someone.setFName(JOptionPane.showInputDialog("Enter the first name of the person: "));
someone.setLName(JOptionPane.showInputDialog("Enter the last name of the person: "));
while(!someone.setPhone(JOptionPane.showInputDialog("Enter your 10 digit phone number: ")))
JOptionPane.showMessageDialog(null, "Error. Please enter only 10 numerical values\n(examle: 7034567890");
return someone;
}
private static void fillBusiness()
{
}
}
getName我可以轻松访问,因为我有PhoneBook []。我以为我需要一个toString in Person来把所有东西都放在一起(同时名字和电话号码)但是在主要的我无法访问那个toString,因为我没有实例化人员? 对不起,如果这令人困惑......我只是打字我的(可怜的)思路......
答案 0 :(得分:2)
您应始终能够在任何对象上调用toString()
,因为这是在java.lang.Object
上定义的方法,它是所有其他类的超类。
因此,如果您覆盖toString()
课程上的Person
,那么从Abstract类调用它不会有任何问题。
我不完全确定你的问题是什么,但这里是Person的toString实现的一个例子:
@Override
public String toString(){
StringBuilder result = new StringBuilder();
String NEW_LINE = System.getProperty("line.separator");
result.append(this.getClass().getName() + " Object {" + NEW_LINE);
result.append(" Title: " + getTitle() + NEW_LINE);
result.append(" FName: " + getFName() + NEW_LINE);
result.append(" LName" + getLName + NEW_LINE );
result.append("}");
return result.toString();
}
答案 1 :(得分:0)
你应该在你的抽象类中添加一个getPhone
方法(或者任何常见的方法,这就是接口/抽象类的全部意义)
public String getPhone(){
return phone
}
如果您需要某种特定格式的人或商务电话覆盖该方法(或使getter抽象。这取决于您的要求,但我想普通的旧getter是好的)
答案 2 :(得分:0)
我认为问题的一部分可能是概念性的 - 让我对抽象类等问题进行一些讨论。
任何类背后的想法都是代表你系统的某些部分 - 你用名词表示的东西是你正在编写的系统的一部分。你在'人'和'商业'中有很好的例子;在这种应用程序中还有其他方法可以做,但这是一个好的开始。
另一张提到“入境”的海报,我认为在这种情况下,抽象课程是一个很好的候选人 - 电话簿中的一个“入口”既可以是企业也可以是个人;所以电话簿可以充满“条目”,每个条目都是企业或个人。
当一个类继承自另一个类时,最好是“子类” - 此处的业务或人员 - 是基类的特殊情况 - 在这种情况下是条目。
条目上定义的方法应反映条目,而不依赖于该条目上的特定类。例如,将一个getFirstName()方法放在Entry中是错误的,除非它应用于Entry的每个可能的子类。由于我们通常认为某个企业没有名字,这可能是我们只能在Person中找到的方法。
因此,您可以在Entry中使用方法,例如,可以返回显示条目所需的信息。你可以有一个方法getDisplayName();在Entry中它是一个空方法,只是定义它不接受任何参数并返回一个String,在Person中它可以放在最后,第一,中间或任何你想要的东西;在商业中,它可以获得商业名称。
还有一点 - 你不想在任何与“输出”有关的类中添加任何内容;这些是包含应用程序“业务对象”的类,您可以使用其他处理所有形式的输出的类。当然,用于调试的System.out.println语句没有任何问题。