2017-06-17 3 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

私は、すべての "機能"クラスの外にmainメソッドを配置する習慣を作りました。あなたの例では、メインメソッドと2つの余分なクラスを保持する 'Functionality'クラスを作成します。ある日プログラムがユーザーとは関係のない機能を提供する場合はどうでしょうか?最も簡単なユースケースは、ヘルプテキストを表示している可能性があります。これは 'User'クラスに収まらないでしょうか? – bleistift2

+0

'user1.getLevel()'を呼び出すには、 'admin1 user1'のように' user1'を宣言するか、 '((Admin)user1).getLevelのように' user1'をキャストする必要があります。 () 'を返します。 –

答えて

4

私は、Javaに非常に新しいですし、スーパークラスにサブクラス メソッドを呼び出すことが可能であるかどうかを知っていただきたいと思います。

スーパークラスはそのため、あなたはスーパークラスのサブクラスのインスタンスメソッドを呼び出すことはできません、それらのサブクラスについては何も知りません。

ここで、public static 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'でサブクラスメソッドを呼び出そうとしているのなら、それは不可能です。 –

0

は可能ですが、スーパークラス変数/インスタンス上サブクラスメソッドを呼び出すことはできません。

javaでは、すべての静的変数とメソッドはクラス外であるとみなされます。つまり、すべてのインスタンス変数にアクセスできます。上記の例では、Mainという名前の新しいクラスを作成し、public static void mainをそこに置くのが賢明ですが、これは単に衛生上の問題であり、上で述べたこと以外は行以外はうまくいきます。

user1.getLevel() 
0

、スーパークラス内のサブクラスのメソッドを呼び出すことはできません。

スーパークラス型の変数を持ちスーパークラスまたはサブクラスオブジェクトのいずれかでインスタンス化しているときに、同じメソッドの異なる実装をクライアントコードで呼び出すことはできますが、 多型と呼ばれます。

は、次の例を検討してください:あなたがいる限り、それは右のメソッドのシグネチャであるとして、あなたのmainメソッドを置く場所をあなたの2番目の質問に答える

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メソッドを抽象として宣言することも考えられます。つまり、UserクラスのgetLevelにメソッド本体を置かないで、すべてのサブクラスに1つのメソッド本体を含める必要があります。その間、ユーザーはgetLevelを参照し、そのサブクラスの実装を使用できます。私はあなたがここで行っている行動だと思う。

関連する問題