2016-08-03 64 views
1

我读过,您可以为对象添加额外的方法,或以这种方式重写抽象方法,但我有一个错误。你能告诉我这是否可能,或者我做错了什么?Java中添加方法的错误

public abstract class Pesti { 
    public abstract void ud(); 
} 

public class EX2 { 
    public static void main(String[] args) { 
     Pesti p = new Pesti() { 
      public void ud() { 
       System.out.println("Pestele este ud!"); 
      } 

      public void inn() { 
       System.out.println("Innoata!"); 
      } 
     }; 
     p.ud(); 
     p.inn(); 
    } 
} 

它告诉我,它无法找到方法inn

回答

6

你正在做的是创建一个你的Pesti的匿名子类。但是,由于p变量的类型为Pesti,因此只能调用Pesti类(或其任何超类)中声明的方法。因此您可以拨打ud(),但不能拨打inn()

如果您可以将p转换为子类的类型,则可以调用inn(),但由于这是一个匿名子类实例,因此不能转换为该类型。

您可以在Pesti中声明inn()作为抽象(或具体)方法。然后你的代码会通过编译,并且在匿名子类实例中执行这个方法将被执行。

public abstract class Pesti { 
    public abstract void ud(); 
    public abstract void inn(); 
} 
-1

认为你需要看看这个link,我不知道你想做的事,但你不能实例化抽象类,你可以找到我的链接详细说明,希望能对大家帮助您

+1

虽然此链接可能回答问题,但最好在此处包含答案的基本部分,并提供供参考的链接。如果链接页面更改,则仅链接答案可能会失效。另外,用户并不试图实例化一个'abstract'类,而是创建一个作为实例的[匿名类](https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html) 'Pesti'。 – bcsb1001

1

您声明p作为Pesti的一个实例,但试图使用Pesti中未定义的方法。当你将对象声明为抽象类时,你只能使用这个类中定义的方法。要使用您的inn()方法,您还必须在Pesti类中声明此方法。或者,您可以编写一个扩展Pesti的类,该类实现inn()方法并将您的对象声明为扩展类。

0

Pesti是一个abstract类正好有一个方法(它是abstract):ud()。因此,用Pesti类型声明的变量只能用于调用ud()或类ObjectPesti的隐式超类)中的任何方法。 p被声明为此类型,因此尽管实际上是anonymous classinn()方法的实例,但此方法在变量类型Pesti的上下文中不可用。

也许你打算在inn()方法添加到Pesti所以所有实例都必须实现它:

public abstract class Pesti { 
    public abstract void ud(); 
    public abstract void inn(); 
} 

或许你真的不希望在所有使用匿名类和希望创建的Pesti一个子类与现有的方法inn()

public class PestiImpl extends Pesti { 
    @Override 
    public void ud() { 
     System.out.println("Pestele este ud!"); 
    } 

    public void inn() { 
     System.out.println("Innoata!"); 
    } 
} 

(或你可以有继承的两者之间的层;一些abstract类延伸Pestiinn()声明为abstract方法,如果您有其他类与此类inn()方法,但一些Pesti没有)。

备注:我强烈建议在适当的地方使用@Override注释,以使代码更具可读性,并避免在尝试覆盖方法时出现类似拼写错误的错误。你可以让大多数IDE自动插入它。