2017-06-17 112 views
2

我对java很陌生,想知道是否可以调用超类中的子类方法。如果要继承,请在适当的地方设置public static void mainJava继承:在超类中调用子类方法

超类

public class User { 
    private String name; 
    private int age; 

    public User() { 
     //Constructor 
    } 

    //Overloaded constructor 
    public User(String name, int age) { 
     this.name = name; 
     this.age = age; 
    } 

    public String getName() { 
     return this.name; 
    } 
    public static void main(String []args) { 
     User user1 = new Admin("Bill", 18, 2); 

     System.out.println("Hello "+user1.getName()); 
     user1.getLevel(); 
    } 

} 

子类

public class Admin extends User { 

    private int permissionLevel; 

    public Admin() { 
    //Constructor 
    } 

    //Overloading constructor 
    public Admin(String name, int age, int permissionLevel) { 
     super(name, age); 
     this.permissionLevel = permissionLevel; 
    } 

    public void getLevel() { 
     System.out.println("Hello "+permissionLevel); 

    } 

} 
+0

不,这是不可能的。一个班级无法知道是否或何时被分类。用户并不总是管理员,而是管理员IS-A用户。管理员可以调用父方法,但不能以其他方式进行调用,除非将用户引用投射到管理员。 – duffymo

+0

我养成了在所有“功能”类之外放置主要方法的习惯。在你的例子中,我会创建一个类'功能',它包含主要方法和你的两个额外的类。如果你的程序可能有一天会提供与用户无关的功能。最简单的用例可能会显示一个帮助文本 - 不适合User类,可以吗? – bleistift2

+0

一眼就看出来,为了调用'user1.getLevel()',你需要像'Admin user1'那样声明'user1'或者像''((Admin)user1)那样声明'user1' .getLevel ()'。 –

回答

4

我很新的Java和想知道是否调用父类的子类 方法是可行的。

超类不知道它们的子类东西,所以,你不能调用父类的子类的实例方法

其中是设置公共静态void main的适当位置。

我不会建议把在Admin类的main方法也不User类的因素很多。而是创建一个单独的类来封装main方法。

实施例:

public class Main{ 
    public static void main(String []args) { 
     User user1 = new Admin("Bill", 18, 2); 

     System.out.println("Hello "+user1.getName()); 
     user1.getLevel(); 
    } 
} 
+0

如果我正确地理解了这个问题,看起来问题是关于超类中包含的'static'方法,在这种方法中,当然可以调用子类的方法。如果你试图在超类的'this'上调用一个sublcass方法,这是不可能的。 –

0

调用子类方法在一个超类是可能的,但调用一个超类的变量的子类方法/实例是不可能的。

在java中,所有静态变量和方法被认为是在类之外,即它们可以访问任何实例变量或方法。在上面的例子中,创建一个名为Main的新类并将public static void main放在那里是明智的,但这仅仅是一个卫生问题,除了这一行之外,上面的内容将起作用。

user1.getLevel() 
0

没有,则无法调用父类中的子类的方法。

虽然可以在客户端代码中调用同一方法的不同实现,但您有超类类型的变量并使用超类或子类对象实例化它。它被称为多态性

请考虑下面的例子:

public class User { 
    private String name; 
    private int age; 
    protected int permissionLevel; 

    public User() { 
     //Constructor 
    } 

    //Overloaded constructor 
    public User(String name, int age) { 
     this.name = name; 
     this.age = age; 
    } 

    public String getName() { 
     return this.name; 
    } 

    public void getLevel() { 
     System.out.println("Hello "+ permissionLevel); 
    } 
} 

public class Admin extends User { 

    public Admin() { 
     //Constructor 
    } 

    //Overloading constructor 
    public Admin(String name, int age, int permissionLevel) { 
     super(name, age); 
     this.permissionLevel = permissionLevel; 
    } 

    @Override 
    public void getLevel() { 
     System.out.println("Hello "+permissionLevel); 
    } 

    public static void main(String []args) { 
     User user1 = new Admin("Bill", 18, 2); 

     System.out.println("Hello "+user1.getName()); 
     user1.getLevel(); //call to subclass method 

     user1 = new User("John", 22); //the variable is the same but we assign different object to it 
     user1.getLevel(); //call to superclass method 
    } 
} 

回答你的第二个问题,不,这不要紧,你把你的主要方法,只要是正确的方法签名。正如你在我的例子中看到的那样,我把这个方法移到了Admin.java--它仍然是可以接受的。

0

简短的回答:

中回答:是的,但你必须声明的超类中的方法。然后在子类中覆盖它。超类调用它时,子类中的方法体将被调用。在你的例子中,你可以在User上放置一个空的getLevel方法。

您还可以考虑将User声明为抽象类,并在User类中声明getLevel方法为abstract。这意味着你不要在User类的getLevel中放置任何方法体,但是每个子类都必须包含一个。同时,用户可以引用getLevel并使用其子类的实现。我认为这就是你要去的地方。