Java 多态性问题

Java 多态性问题,java,polymorphism,Java,Polymorphism,我一直在读关于如何编写Java8多态性的书 我有以下代码: public class Person { // instance variables - replace the example below with your own private String lastname; private String firstname; private int age; private boolean married; private float sal

我一直在读关于如何编写Java8多态性的书

我有以下代码:

public class Person
{
    // instance variables - replace the example below with your own
    private String lastname;
    private String firstname;
    private int age;
    private boolean married;
    private float salary;

    /**
     * Constructor for objects of class Person
     */
    public Person(String lastname, String firstname, int age, boolean married, float salary)
    {
        // initialise instance variables
        this.lastname = new String(lastname);
        this.firstname = new String(firstname);
        this.age = age;
        this.married = married;
        this.salary = salary;
    }

    public String getLastName() {return lastname;}
    public String getFirstName() {return firstname;}
    public int getAge() {return age;}
    public boolean isMarried() {return married;}
    public float getSalary() {return salary;}
}


public class MarriedPerson extends Person
{
    // instance variables - replace the example below with your own
    private int children;

    /**
     * Constructor for objects of class MarriedPerson
     */
    public MarriedPerson(String lastname, String firstname, int age, float salary, int children)
    {
        // initialise instance variables
        super(lastname, firstname, age, true, salary);
        this.children = children;
    }

    public int getNoOfChildren()
    {
        // put your code here
        return children;
    }
}


abstract class MyTester
{
   public static void main(String[] args) {
       Person p1 = new Person("Kings", "Paul", 22, true, 1200f);
       MarriedPerson mp1 = new MarriedPerson("Tront", "Betty", 31, 980.5f, 3);
       System.out.print(p1.getFirstName()+" "+p1.getLastName()+" is "
       +p1.getAge()+" years old, gets a "+p1.getSalary()
       +" Euros salary and is");
       if (p1.isMarried() == false)
          System.out.print(" not");
       System.out.println(" married.");
       System.out.print(mp1.getFirstName()+" "+mp1.getLastName()
       +" is " +mp1.getAge()+ " years old, gets a " + mp1.getSalary()
       +" Euros salary and is" + " married with ");
       if (mp1.getNoOfChildren() > 0)
          System.out.print(mp1.getNoOfChildren());
       else System.out.print("no");
          System.out.println(" children.");
    }
}
在阅读一本书时,我没有看到包含主函数的抽象类,所以我有点困惑

为什么我们将MyTester类声明为抽象类?这有必要吗

我现在在Person类中创建了一个printInfo方法。请参阅以下代码:

public class Person
{
    // instance variables - replace the example below with your own
    private String lastname;
    private String firstname;
    private int age;
    private boolean married;
    private float salary;

    /**
     * Constructor for objects of class Person
     */
    public Person(String lastname, String firstname, int age, boolean married, float salary)
    {
        // initialise instance variables
        this.lastname = new String(lastname);
        this.firstname = new String(firstname);
        this.age = age;
        this.married = married;
        this.salary = salary;
    }

    public String getLastName() {return lastname;}
    public String getFirstName() {return firstname;}
    public int getAge() {return age;}
    public boolean isMarried() {return married;}
    public float getSalary() {return salary;}

    public void printInfo(){
        System.out.print(p1.getFirstName()+" "+p1.getLastName()+" is "
       +p1.getAge()+" years old, gets a "+p1.getSalary()
       +" Euros salary and is");
       if (p1.isMarried() == false)
          System.out.print(" not");
       System.out.println(" married."); 
    }
}

abstract class MyTester
{
   public static void main(String[] args) {
       Person p1 = new Person("Kings", "Paul", 22, true, 1200f);
       MarriedPerson mp1 = new MarriedPerson("Tront", "Betty", 31, 980.5f, 3);
       p1.printInfo();
       mp1.printInfo();    
    }
}
当我编译修改后的代码时,它给了我一个错误:找不到符号变量p1。为什么呢?我需要做什么才能解决这个问题?
第二个代码比第一个代码有什么优势?

没有。这没有什么区别,因为类除了作为入口点之外从未被扩展或使用过。

MyTester没有任何抽象方法,所以抽象是没有意义的。唯一的原因可能是阻止MyTester类的实例化,因为实例的存在可能没有意义

MyTester被声明为抽象的,因此您不能创建它的任何实例(您没有理由这样做)。看,上面写着:

抽象类是一个声明为抽象的类,它可能是抽象的,也可能是抽象的 不包括抽象方法。抽象类无法实例化, 但它们可以是子类的

当我编译修改后的代码时,它给了我一个错误:找不到符号变量p1。为什么呢?我需要做什么才能解决这个问题

供将来参考:您应该创建一个新问题,而不是编辑现有问题。此外,如果有人解决了你的第一个问题,你应该总是很好地接受他们的答案

无论如何:您得到了这个错误,因为您的对象在主类中只“已知”为p1。 在“printInfo()”方法中,您试图让对象本身进行调用。因此,要么删除“p1.”部分,只调用“getFirstName()”之类的方法,要么显式调用“this.getFirstName()”

(“this”是指当前对象实例的java关键字。)


提示:获得一个好的JAVA IDE,如Eclipse(),您甚至在编译之前都会看到类似的简单错误。

不,这不是必需的。您的答案是否涉及第二个问题,该问题给出了关于变量p1的错误?不,但对于该问题,请将
p1
替换为
this
谢谢911dibush。我认为一个相关问题的新问题不会得到回答。我正在使用BlueJ,但将来我将使用NetBeansaswell@Downvoter,请评论?我知道答案并不深入,但这里需要简单,因为问题只问一个简单的问题。它后来被编辑成包含更多的问题,但我在被问到之前就回答了。