方法

2016-10-10 10 views
-1

問題のコードは次のとおりです。方法

class Student { 
    private void study() { 
     System.out.println("Student is studying"); 
    } 

    public static void main(String args[]) { 
     Student student = new Sam(); 
     student.study(); 
    } 
} 

public class Sam extends Student { 
    void study() { 
     System.out.println("Sam is studying"); 
    } 
} 

出力:

Student is studying 

クラスサムのオブジェクトが作成され、学生はスーパーがあるとして、我々はにサムオブジェクトを割り当てることができますタイプStudentの参照変数。メソッド・スタディを呼び出すときには、オブジェクトに「サムが勉強中」と表示する調査方法があることが明らかです。参照型はスーパークラスであり、メソッドが隠されているので、スーパークラスメソッドを呼び出すのですが、オブジェクトと参照型を理解しているので、このダイジェストはできません。つまり、参照変数はオブジェクトへのポインタ(最初のjavaのリモートコントロールの類推)

+0

プライベートメソッドは最終的なメソッドであり、オーバーライドできません。 – passion

+0

@passion他のクラスにも表示されません。私はあなたが*上書きすることを意味すると思います* – Li357

+0

OKメソッドを単純に保つ*メソッドオーバーライドは同じシグネチャを持つメソッドを意味します* '1)しかしここであなたの両方のメソッドは異なるシグネチャを持っています2)あなたは両方のクラスを同じファイルに書き込んでいると思います – emotionlessbananas

答えて

0

virtualとすると、そのメソッドはSamのメソッドを呼び出すので、それは型のオブジェクト学生としてのサム、それは確かに学生への言及であり、それは学生からの方法を呼び出すでしょう。

+0

スチューデントのメソッドをスチューデントのオブジェクトを作成しなくても呼び出すにはどうすればいいですか?クラスのメソッドを呼び出すには、静的でなければそのオブジェクトを作成しなければなりません。この場合、学生のオブジェクトを作成していないこともあります。 – Saumyaraj

+1

@Saumyaraj私たちは学生です.Samです(本当に学生で、学生)。 – meJustAndrew

+0

Sam Objectには、親の隠しメソッドとその新しいメソッドの2つの学習メソッドがあり、参照型に基づいて呼び出されるように考えていますか? – Saumyaraj

1

コメントに記載されているように、プライベートメソッドは自動的に最終的に非表示になります。したがって、プライベートメソッドをオーバーライドすることはできません。 したがって、derrivedメソッドstudyはまったく新しいメソッドになり、Studentのスタディをオーバーライドしません。

thisリンクを参照してください。

我々は静的メソッドをオーバーライドすることができないことを知っているが、我々は静的メソッドをオーバーライドするならば、それはメソッドの隠蔽として知られているので、私は簡単な例

/* Java program to show that if static method is redefined by 
    a derived class, then it is not overriding. */ 

// Superclass 
class Base { 

    // Static method in base class which will be hidden in subclass 
    public static void display() { 
     System.out.println("Static or class method from Base"); 
    } 

    // Non-static method which will be overridden in derived class 
    public void print() { 
     System.out.println("Non-static or Instance method from Base"); 
    } 
} 

// Subclass 
class Derived extends Base { 

    // This method hides display() in Base 
    public static void display() { 
     System.out.println("Static or class method from Derived"); 
    } 

    // This method overrides print() in Base 
    public void print() { 
     System.out.println("Non-static or Instance method from Derived"); 
    } 
} 

// Driver class 
public class Test { 
    public static void main(String args[ ]) { 
     Base obj1 = new Derived(); 

     // As per overriding rules this should call to class Derive's static 
     // overridden method. Since static method can not be overridden, it 
     // calls Base's display() 
     obj1.display(); 

     // Here overriding works and Derive's print() is called 
     obj1.print();  
    } 
} 

Output: 
Static or class method from Base 
Non-static or Instance method from Derived 

を通じて概念をオーバーライドメソッドの隠蔽や方法を説明しています

+0

私はメソッドがオーバーライドされていないことを知っています。私は親クラスのオブジェクトなしで親クラスのメソッドを実行する方法を理解できません – Saumyaraj

+0

privateアクセス修飾子を持つと、study()はStudentクラスのオーバーライドメソッドではなく新しいメソッドを作成します。しかし、あなたはまだStudentを拡張しているので、SamはStudentクラスのプロパティを継承します(一度はprivateではありません)。 Studentクラスにprivate以外のアクセス修飾子を含むメソッドを追加する場所がある場合、Samはそれらを継承します。 –

+0

サムが学生のプライベートメソッドを継承していないので、正しい、ナット、学生のメソッドがサム(オブジェクトのヒープ上)にあることができる方法はありませんので、スーパークラスメソッドが呼び出される方法をサムから勉強を呼び出すとき? – Saumyaraj

1

方法それは.Iをオーバーライドする方法として知られている簡単な方法の.INケースをオーバーライドしていない、メソッドの隠蔽は、上記のコードでは、メソッドの隠蔽の場合に起こっているので、私は上記の例

であなたの疑問

をクリアしている願っていますあなたは、我々はこの

を行っている場合は、この

Student student = new Sam(); 

出力が

Student is studying 

になります行っている場合の方法は

を呼び出される変数がそれを決定します参照する一つの重要なポイントを覚えておく必要があり

Sam student = new Sam(); 

出力は

sam is studying 

メソッドをオーバーライドすると、どのメソッドが呼び出されるかが決まります。

+0

静的メソッドのオーバーライドに関する説明をありがとうが、私は静的な部分ではっきりしています。私は、質問 – Saumyaraj

+0

で質問されたようにプライベートとしてマークされたインスタンスメソッドでは明確ではありません私はあなたの質問に応じて私の答えを編集していると私は疑問がある場合教えてください –

+0

@ Saayyarajはそれを得た?? –

1

これを別の言葉で説明しようとします。 Student参照変数を使用すると、Studentクラスで表示できるメソッドのみを呼び出すことができます。生徒はプライベートとして学習メソッドを定義しており、同じクラスのメインメソッドから学習メソッドを呼び出すと、クラス内でのみ表示され、Studentクラスの学習メソッドを呼び出すことができます。

これらの変動

  • は、すなわち学生のオブジェクトを作成し、その学習メソッドを呼び出すしようとすると、別のクラスにメインで同じコードを使用してみてください、という概念を明確にします。
  • オブジェクトの型がSamであっても、生徒参照変数を使用しているため、学習はまだ表示されません。

勉強と呼べる唯一の理由は、同じクラスから呼び出されたためです。お役に立てれば。

+0

まあ説明! – Saumyaraj